Spring - 게시판 만들기 연습 (Interceptor를 이용한 session체크, 사용자 인증)
관련포스팅 : Spring - 게시판 만들기 연습 (글쓰기, 수정, 삭제 회원권한부여)
관련포스팅 : Spring - Filter, Interceptor, AOP
관련포스팅 : Spring - Interceptor 테스트
이전까지는 게시판 페이지 중에서 사용자 인증을 필요로 하는 곳은 Session을 체크하는 페이지를 import하여 id값이 null이면 로그인페이지로 이동하도록 처리해줬다. 하지만 사용자 인증을 해야하는 페이지가 증가하게된다며 각 페이지 마다 include를 해줘야하는 번거로움 생기고, 누락될 경우에는 문제가 발생할 수도 있다. 그렇기 때문에 Interceptor를 이용하여 보다 간편하게 session을 체크하는 사용자인증 처리를 구현해보자.
1. servlet-context.xml
<!-- 로그인 체크 bean -->
<beans:bean id="loginInterceptor" class="com.example.spring02.interceptor.LoginInterceptor"/>
<interceptors>
<interceptor>
<!-- 참조할 로그인 체크 bean -->
<beans:ref bean="loginInterceptor"/>
<!-- 인터셉터 매핑 url -->
<mapping path="/board/write.do"/>
<mapping path="/board/insert.do"/>
<mapping path="/board/update.do"/>
<mapping path="/board/delete.do"/>
<mapping path="/reply/insertRest.do"/>
</interceptor>
</interceptors>
2. LoginInterceptor
package com.example.spring02.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 세션 객체 생성
HttpSession session = request.getSession();
// 세션에 id가 null이면
if(session.getAttribute("userId") == null) {
// 로그인 페이지로 이동
response.sendRedirect(request.getContextPath()+"/member/login.do");
// 컨트롤러를 실행하지 않는다.(요청페이지로 이동하지 않는다)
return false;
// null이 아니면
} else {
// 컨트롤러를 실행(요청페이지로 이동한다.)
return true;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
super.postHandle(request, response, handler, modelAndView);
}
}
인증되지 않은 사용자(비로그인상태)가 인터셉터에 매핑된 url로 접근할 경우 로그인 페이지로 리다이렉트
3. view.jsp
<%@ include file="../include/sessionCheck.jsp" %>
기존에 사용자 인증처리를 위한 페이지 include문을 삭제
4. 구현확인
ARC(Advanced Rest Client)를 통해 인증이 필요한 페이지 요청하면 3021 에러 발생하고 로그인 페이지로 리다이렉트가 된다.
board/insert.do - 게시글 입력 요청
board/update.do - 게시글 수정 요청
board/delete.do - 게시글 삭제 요청
reply/insertRest.do - 댓글 입력 요청
[Moved] 요청된 자원의 URI값이 임시로 변경되었다. 따라서 추후 Temporarily 에도 현재의 URI값을 계속 사용하여야 한다. 새로운 URI값은 Location헤더를 통해서 클라이언트에게 전달된다. 또, HEAD method를 제외한 모든 경우에 response메시지의 entity body를 통해서 새로운 URI의 하이퍼링크를 포함하는 짧은 메시지를 전달해 주어야 한다. Web브라우저는 POST method를 사용한 response의 결과로 302 status code를 전달받는 경우에는 자동으로 새로운 URI에 접속을 해서는 안된다. 반드시 사용자의 확인을 거쳐야 한다.↩