티스토리 뷰
- 스프링 시큐리티를 사용한다.
- ajax로 요청하는 어떤 url(별칭A)로의 접근을 시큐리티가 로그인 한 사용자만 접근하도록 제한하고 있다.
- 한 페이지에서 장시간 사용하지 않아 세션이 만료되어 로그아웃 되었다.
- 하지만 페이지는 로그인한 페이지 그대로 보여 A로 접근하는 ajax를 실행했지만 실패한다..
이런 이유로
다음과 같은 상황에서 ajax를 실행하면 로그인 화면으로 리다이렉트 하도록 한다.
필터클래스를 구현한 bean을 등록하고, security:http엘리먼트 하위에 custom-filter엘리먼트를 등록한다.
<bean id="ajaxSessionTimeoutFilter" class="dev.mountain.com.define_object.AjaxSessionTimeoutFilter" > <property name="ajaxHeader" value="AJAX" /> </bean> <security:http auto-config="true" use-expressions="true"> ..... <security:custom-filter after="EXCEPTION_TRANSLATION_FILTER" ref="ajaxSessionTimeoutFilter"/> ..... </security:http> | cs |
필터 클래스의 구현체인 AjaxSessionTimeoutFilter클래스를 만든다.
public class AjaxSessionTimeoutFilter implements Filter { private String ajaxHeader; public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; if (isAjaxRequest(req)) { try { chain.doFilter(req, res); } catch (AccessDeniedException e) { res.sendError(HttpServletResponse.SC_FORBIDDEN); } catch (AuthenticationException e) { res.sendError(HttpServletResponse.SC_UNAUTHORIZED); } } else chain.doFilter(req, res); } private boolean isAjaxRequest(HttpServletRequest req) { return req.getHeader(ajaxHeader) != null && req.getHeader(ajaxHeader).equals(Boolean.TRUE.toString()); } public void init(FilterConfig filterConfig) throws ServletException { } /** * Set AJAX Request Header (Default is AJAX) * * @param ajaxHeader */ public void setAjaxHeader(String ajaxHeader) { this.ajaxHeader = ajaxHeader; } } | cs |
isAjaxRequest메서드를 이용해서 변수 ajaxHeader가 가지고 있는 문자열과 같은 이름이 요청헤더에 포함되어 있고, "AJAX"라는 요청헤더가 가지고 있는 값이 true라면 try catch문이 있는 구간을 수행하는데, 여기에서 이 요청이 스프링 시큐리티에 의해서 막혀있는 요청이라면 catch문에 걸려서 응답에러를 사용자 측에 보내게 된다.
다음은 ajax메서드이다.
$.ajax({ beforeSend : function(jqXHR) { console.log(jqXHR); jqXHR.setRequestHeader("AJAX", true); }, url : '/board/replys', data : array, type : 'post', success : function(data) { }, error : function(jqXHR) { if (jqXHR.status == 401) { //alert("401"); } else if (jqXHR.status == 403) { alert("로그인을 하셔야 댓글을 쓸 수 있습니다."); location.replace('../loginforms'); } else { alert("예외가 발생했습니다. 관리자에게 문의하세요."); } } }); | cs |
beforeSend속성을 사용해서 서버에 요청하기 전에 "AJAX"라는 이름의 헤더를 추가 하였다.
이 요청헤더의 추가로 인해 위의 자바코드에서 try catch문을 타서 로그인을 하지 않았다면 응답에러를 보내고, 다시 ajax메서드의 error속성을 만나서 http에러 코드에 따른 적절한 처리를 할 수 있다.
'SPRING > 정리' 카테고리의 다른 글
의존관계 빈 설정 방법 (0) | 2016.08.14 |
---|---|
Spring 빈의 등록 방법 (0) | 2016.08.11 |
요청 파라미터 바인딩 (0) | 2016.04.27 |
JUnit 테스트 (0) | 2016.04.22 |
[spring] google recapcha 자동가입방지 (0) | 2016.03.24 |
Comments