코딩하는 문과생
[Spring] 8. 스프링 기본(7) - Interceptor 본문
[Practice]

- preHandle은 반환형이 boolean이고,
- postHandle은 반환형이 void다.
1. 상속해서 Interceptor 객체생성
public class TestInterceptor extends HandlerInterceptorAdapter{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("test interceptor preHandle ~~");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("test interceptor postHandle ~~");
}
}
2. 설정부여
<!-- Intercepter 만들기 -->
<beans:bean id="sample" class="com.sinc.intern.util.interceptor.TestInterceptor" />
<interceptors>
<interceptor>
<mapping path="/interceptor.do"/>
<beans:ref bean="sample"/>
</interceptor>
</interceptors>
3. RequestMapping
@RequestMapping("/interceptor.do")
public String interceptorSample() {
System.out.println("ctrl interceptor");
return null;
}
4. 수정 - 출력 확인
public class TestInterceptor extends HandlerInterceptorAdapter{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("test interceptor preHandle ~~");
HandlerMethod method = (HandlerMethod)handler;
Method methodObj = method.getMethod();
System.out.println("Bean : "+method.getBean().getClass());
System.out.println("Method : " + methodObj);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("test interceptor postHandle ~~");
}
}
[Login에 Interceptor 넣기]
0. Ctrl 확인 - 로그인 후 세션 생성
@RequestMapping(value="/login.do", method=RequestMethod.POST)
1. Interceptor생성
public class LoginInterceptor extends HandlerInterceptorAdapter{
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("login interceptor postH ~~");
}
}
2. 설정에 등록
<!-- Intercepter 만들기 -->
<beans:bean id="sample" class="com.sinc.intern.util.interceptor.TestInterceptor" />
<beans:bean id="login" class="com.sinc.intern.user.util.LoginInterceptor" />
<interceptors>
<interceptor>
<mapping path="/interceptor.do" />
<beans:ref bean="sample" />
</interceptor>
<interceptor>
<mapping path="/login.do" />
<beans:ref bean="login" />
</interceptor>
</interceptors>
3. Ctrl수정
@RequestMapping(value="/login.do", method=RequestMethod.POST)
public String login(UserDTO dto, Model model) {
System.out.println("user login dto : " + dto);
Object user = service.login(dto);
if(user != null) {
//model.addAttribute("loginSession", user); 수정
model.addAttribute("loginUserModel", user);
}
return "redirect:/main.do";
}
4. Interceptor 수정 - 출력 확인
public class LoginInterceptor extends HandlerInterceptorAdapter{
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("login interceptor postH ~~");
ModelMap model = modelAndView.getModelMap();
//System.out.println(model.get("loginUserModel").getClass());
Object obj = model.get("loginUserModel");
if(obj != null) {
HttpSession session = request.getSession();
session.setAttribute("loginUser", obj);
}
}
}
0. Ctrl 확인
@RequestMapping("/registerForm.do")
public String register() {
1. SessionChkInterceptor 추가 - 원래 가려던 uri저장
public class SessionChkInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("session interceptor preH ~~");
HttpSession session = request.getSession();
if( session.getAttribute("loginUser") == null) {
System.out.println("session is null");
String uri = request.getRequestURI();
String query = request.getQueryString();
String path = uri;
if(request.getMethod().equalsIgnoreCase("get")) {
path = uri + "?" + query;
}
session.setAttribute("dest", path);
response.sendRedirect("/loginForm.do");
return false;
}
return true;
}
}
2. 설정 추가
<beans:bean id="check" class="com.sinc.intern.user.util.SessionChkInterceptor" />
<interceptor>
<mapping path="/registerForm.do" />
<beans:ref bean="check" />
</interceptor>
3. LoginInterceptor 수정 - 원래 가려더 uri로 보내버리기
public class LoginInterceptor extends HandlerInterceptorAdapter{
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("login interceptor postH ~~");
ModelMap model = modelAndView.getModelMap();
//System.out.println(model.get("loginUserModel").getClass());
Object obj = model.get("loginUserModel");
if(obj != null) {
HttpSession session = request.getSession();
session.setAttribute("loginUser", obj);
Object destObj = session.getAttribute("dest");
response.sendRedirect( destObj != null ? (String)destObj : "/main.do");
}
}
}
4. void로 변경(항상 main으로 리다이렉트 되기 때문에)
@RequestMapping(value="/login.do", method=RequestMethod.POST)
public void login(UserDTO dto, Model model) {
[LogoutInterceptor]
1. interceptor 추가
public class LogoutInterceptor extends HandlerInterceptorAdapter{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("logout interceptor preH ~~");
HttpSession session = request.getSession(false);
session.invalidate();
return true;
}
}
2. 설정 추가
<beans:bean id="logout" class="com.sinc.intern.user.util.LogoutInterceptor"/>
<interceptor>
<mapping path="/logout.do" />
<beans:ref bean="logout" />
</interceptor>
3. UserCtrl 추가
@RequestMapping("/logout.do")
public String logout() {
System.out.println("user logout");
return "redirect:/main.do";
}
4. header.jsp 추가
<a href="/user/logout.do" class="btn btn-default btn-flat">Sign out</a>'웹 프로그래밍 > Spring' 카테고리의 다른 글
| [Spring] Spring 프레임워크(2) - Layer와 MVC패턴 (0) | 2020.03.08 |
|---|---|
| [Spring] Spring 프레임워크(1) - 개요, Maven, IoC (0) | 2020.03.08 |
| [Spring] 7. 스프링 기본(6) - 게시판 (CRUD)2 (0) | 2020.02.07 |
| [Spring] 6. 스프링 기본(5) - 게시판 (CRUD) (0) | 2020.02.06 |
| [Spring] 5. 스프링 기본(4) - DB에 컬럼추가하기 (0) | 2020.02.06 |