이번 포스팅은 인터셉터에 대한 설정을 작성하려고 한다.
말그대로 spring 의 controller 호출전에 동작하는 방식으로써 보통은 로그인 체크유무가 필요한
곳에서 주로 사용함
예를 들어 게시판의 글쓰기 화면을 이동후, 한참동안 아무런 동작은 안하게 되면 세션이 제거되어 보통 기록해야 할 아이디 또는 이름같은 세션에 들어가있는 정보들이 증발하게된다.
이럴경우 글쓰기를 하게 되면 테이블에는 일반 데이터들은 들어가있거나 혹은 아이디/이름 컬럼을 not null로 생성하였다면 오류발생이 일어날것이다.
가끔 세션이 증발하여 null값이 아닌 공백이 들어갈경우도 있어서 문제가 발생한다.
이럴때는 세션체크를 한 후 세션이 제거된 상태일경우에는 게시물을 등록할 수 없게 해야 한다.
또는 마이페이지의 메뉴 혹은 브라우저에 남아있는 url로 접근을 할 경우에도 세션이 존재하지
않으면 페이지 접근을 막아야 한다.
예전에는 스크립트로 로그인 체크를 하거나 각페이지마다 if문을 주어 로그인 유무를 판단하였다.
반면에 인터셉터설정은 모든페이지에 적용을 해주지 않아도 되며 xml설정과 class 파일 하나 추가로 인하여 해결이 된다.
예를들어보자
가상의 시나리오를 작성해보도록 하자
게시판 글쓰기페이지(/board_write)는 로그인한 사용자만 접근이 가능하다
만약 로그인하지 않은 사용자가 글쓰기페이지 접근할 경우 로그인 페이지(/login)로 이동시킨다
위의 시나리오라 가정한다면
세가지 컨트롤러가 필요할 것이다.
1. 로그인화면 : /login controller
2. 로그인처리 : /findlogin controller
3. 글쓰기 페이지 : /board_write controller
그런다음 인터셉터 클래스 하나를 생성을 해야한다.
위 시나리오대로 진행을 해보도록 하자
1. 로그인화면을 출력할 컨트롤러 + jsp 페이지
실제로 로그인을 구현하거나 글쓰기 폼을 화면에 띄우는건 아님.
@RequestMapping(value="/login") public String login(){ return "login"; }
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> 로그인 페이지입니다. </body> </html>
2. 글쓰기 페이지 컨트롤러 + jsp 페이지
@RequestMapping(value="/board_write ") public String board_write (){ return "board_write"; }
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> 글쓰기 페이지 입니다. </body> </html>
3. 세션 생성할 임의의 컨트롤러 해당 컨트롤러는
단순 세션 생성을 위한 것이므로 별도의 jsp 페이지 불필요
@RequestMapping(value="/findlogin") public void findlogin(HttpServletRequest request){ request.getSession().setAttribute("logininfo", true); }
모두 작성 완료 하였으면 이제는 mvc-config.xml 설정부분에 다음과 같이 추가해주도록 하자 위치는 본인 마음대로..
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/board_write"/> <bean class="com.spring.interceptor.InterCeptor"/> </mvc:interceptor> <!-- 추가로 여러개의 인터셉터 설정 가능 <mvc:interceptor> <mvc:mapping path="/admin/board_write"/> <bean class="com.spring.interceptor.AdminInterCeptor"/> </mvc:interceptor> --> </mvc:interceptors>
위의 인터셉터 설정을 확인해보면 /board_write라는 mapping을 받았을경우, 컨트롤러 호출전, InterCeptor 클래스를 먼저 호출한다라고 생각하면 될것임
여러가지의 인터셉터 설정이 가능함
그럼 이제 InterCeptor 클래스를 해당 패키지에 맞추어 생성을 하도록 하자
package com.spring.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; public class InterCeptor extends HandlerInterceptorAdapter{ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){ try { //logininfo 세션값이 널일경우 if(request.getSession().getAttribute("logininfo") == null ){ //로그인페이지로 redirect response.sendRedirect("/login"); return false; } } catch (Exception e) { e.printStackTrace(); } //널이 아니면 정상적으로 컨트롤러 호출 return true; } }
이제 인터셉터 설정이 완료되었다
다음 동작을 실행해보도록 하자
1. 강제로 "/board_write" 컨트롤러 호출 -> "/login" 컨트롤러 페이지로 가는지확인
2. "/findlogin" 컨트롤러 호출 후 "/board_write " 컨트롤러 다시 호출하여 board_write.jsp의 문구가 제대로 보이는지 확인
그럼 실행을 해보도록 하자
1) 세션이 존재하지 않는 상태에서 /board_write 컨트롤러 호출
2) 로그인페이지로 강제 이동
3) 세션생성 컨트롤러 호출
4) 세션이 생성됨(jsp 페이지는 필요없어서 나는 404 오류임)
5) 세션이 생성되었으므로 다시 한번 /board_write 컨트롤러 호출
6) 이번에는 정상적으로 /board_write 컨트롤러 접근 가능
확인결과 인터셉터가 잘 동작하는 것을 확인하였다.
샘플을 토대로 관리자/사용자 세션체크 및 세션이 꼭 필요한 페이지 체크등에 대하여 응용을 하면 될것이다.
도움이 되셨다면 공감클릭! 궁금하신점은 댓글!!
스프링3(Spring3) - RedirectAttributes를 이용하여 리다이렉트 POST 방식으로 데이터 전송하기 (0) | 2014.07.30 |
---|---|
스프링3(Spring3) - @ResponseBody + jackson을 이용하여 심플하게 JSON 구현하기 (0) | 2014.07.30 |
스프링3(Spring3) - SQL 쿼리 출력을 위한 로그레벨 설정 (0) | 2014.07.27 |
스프링3(Spring3) - @PathVariable를 이용하여 parameter를 url형식으로 받기 (0) | 2014.07.26 |
스프링3(Spring3) - 리소스(resource file) 및 favicon.ico 설정 (0) | 2014.07.25 |