packagecom.cafe24.mysite.dto;publicclassJSONResult{privateStringresult;// success, failprivateStringmessage;// if fail, setprivateObjectdata;// if success, set datapublicstaticJSONResultsuccess(Objectdata){returnnewJSONResult("success",null,data);}publicstaticJSONResultsuccess(Objectdata,Stringvalue){returnnewJSONResult("success",value,data);}publicstaticJSONResultfail(Stringmessage){returnnewJSONResult("fail",message,null);}privateJSONResult(Stringresult,Stringmessage,Objectdata){this.result=result;this.message=message;this.data=data;}publicJSONResult(){super();// TODO Auto-generated constructor stub}publicvoidsetResult(Stringresult){this.result=result;}publicvoidsetMessage(Stringmessage){this.message=message;}publicvoidsetData(Objectdata){this.data=data;}publicStringgetResult(){returnresult;}publicStringgetMessage(){returnmessage;}publicObjectgetData(){returndata;}@OverridepublicStringtoString(){return"JSONResult [result="+result+", message="+message+", data="+data+"]";}}
[3] CustomUrlAuthenticationSuccessHandler.java 구현
packagecom.cafe24.mysite.security;importjava.io.IOException;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.apache.commons.logging.Log;importorg.apache.commons.logging.LogFactory;importorg.springframework.http.MediaType;importorg.springframework.http.converter.json.MappingJackson2HttpMessageConverter;importorg.springframework.http.server.ServletServerHttpResponse;importorg.springframework.security.core.Authentication;importorg.springframework.security.core.context.SecurityContextHolder;importorg.springframework.security.core.userdetails.UserDetails;importorg.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;importorg.springframework.security.web.savedrequest.HttpSessionRequestCache;importorg.springframework.security.web.savedrequest.RequestCache;importorg.springframework.security.web.savedrequest.SavedRequest;importcom.cafe24.mysite.dto.JSONResult;publicclassCustomUrlAuthenticationSuccessHandlerextendsSimpleUrlAuthenticationSuccessHandler{protectedfinalLoglogger=LogFactory.getLog(this.getClass());privateRequestCacherequestCache=newHttpSessionRequestCache();@OverridepublicvoidonAuthenticationSuccess(HttpServletRequestrequest,HttpServletResponseresponse,Authenticationauthentication)throwsServletException,IOException{SavedRequestsavedRequest=requestCache.getRequest(request,response);if(savedRequest!=null){requestCache.removeRequest(request,response);clearAuthenticationAttributes(request);}Stringaccept=request.getHeader("accept");SecurityUsersecurityUser=null;if(SecurityContextHolder.getContext().getAuthentication()!=null){Objectprincipal=SecurityContextHolder.getContext().getAuthentication().getPrincipal();if(principal!=null&&principalinstanceofUserDetails){securityUser=(SecurityUser)principal;}}// 일반 응답일 경우if(accept==null||accept.matches(".*application/json.*")==false){request.getSession(true).setAttribute("loginNow",true);getRedirectStrategy().sendRedirect(request,response,"/guestbook");// 메인으로 돌아가! // 이전페이지로 돌아가기 위해서는 인증페이지로 가기 전 URL을 기억해 놓았다가 return;}// application/json(ajax) 요청일 경우 아래의 처리!MappingJackson2HttpMessageConverterjsonConverter=newMappingJackson2HttpMessageConverter();MediaTypejsonMimeType=MediaType.APPLICATION_JSON;JSONResultjsonResult=JSONResult.success(securityUser);if(jsonConverter.canWrite(jsonResult.getClass(),jsonMimeType)){jsonConverter.write(jsonResult,jsonMimeType,newServletServerHttpResponse(response));}}publicvoidsetRequestCache(RequestCacherequestCache){this.requestCache=requestCache;}}
일반 응답에서 로그인 전 페이지로 돌아가고싶다면, 이전 페이지의 정보를 저장했다가 보내주면 된다.
// application/json(ajax) 요청일 경우 아래의 처리!MappingJackson2HttpMessageConverterjsonConverter=newMappingJackson2HttpMessageConverter();MediaTypejsonMimeType=MediaType.APPLICATION_JSON;JSONResultjsonResult=JSONResult.success(securityUser);if(jsonConverter.canWrite(jsonResult.getClass(),jsonMimeType)){jsonConverter.write(jsonResult,jsonMimeType,newServletServerHttpResponse(response));
[4] 응답 확인하기
위의 코드 작성 후 다시 로그인 페이지에서 로그인을 하면 성공적으로 결과가 오는 것을 볼 수 있다.