티스토리 뷰

  • 스프링 시큐리티를 사용한다.
  • 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
최근에 올라온 글
최근에 달린 댓글
TAG
more
Total
Today
Yesterday