**인터셉터
게시글쓰기, 상세보기, 수정, 삭제 등은 로그인 되어 있지 않은 유저는 작업을 수행할 수 없도록 하고자 하는 경우 이러한 코드를 Controller, Service, Dao 등에 작성하는 것은 이상합니다.
스프링에서는 Interceptor 나 AOP 등을 이용해서 구현 할 수 있습니다.
Interceptor는 URL을 설정해서 URL 요청이 왔을 때 메소드를 호출하도록 할 수 있습니다.
1. 로그인이 되어 있지 않으면 로그인 페이지로 이동시키고 로그인을 하면 작업을 할 수 있는 페이지로 이동하도록 만들어봅시다.
=> Interceptor : url 요청이 왔을 때 Controller 보내기 전이나 Controller가 작업한 후에 수행할 내용을 작성할 수 있는 Spring이
제공하는 기능
=>HandlerInterceptor 인터페이스나 HandlerInterceptorAdapter 클래스를 상속받는 클래스를 만들어서 메소드를 재정의 하고
dispatcher-servlet(Servlet-Context.xml)에 interceptors 태그를 이용해서 설정하면 됩니다.
=> HandlerInterceptorAdapter인터페이스는 모든 메소드가 추상메소드라서 전부 재정의 해야하고
HandlerInterceptorAdapter 클래스는 모든 메소드가 내용이 없는 상태로 구현되어 있어서 필요한 메소드만 재정의 하면 되는데
메소드 이름을 기억하기 어려우므로 인터페이스를 이용합시;다.
2.HandlerInterceptorAdapter를 implements 한 클래스 안의 재정의 된 메소드 설명
=> com.seunghoo.na.AuthenticationInerceptor
1. preHandle 메소드 : Controller가 처리하기 전에 호출되는 메소드
2. postHandle 메소드 : Controller가 사용자의 요청을 정상적으로 처리하고 난 후 호출되는 메소드
3. afterCompletion메소드 : Controller에서 예외 발생여부에 상관없이 호출되는 메소드
3.HandlerInterceptorAdapter를 implements 한 클래스를 생성
@Component
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 로그인을 확인하기 위해서 session 가져오기
HttpSession session = request.getSession();
// 로그인 정보는 session의 user 속성에 저장되어 있습니다.
if (session.getAttribute("user") == null) {
// 사용자의 요청을 session에 dest라는 속성에 저장
// 로그인이 되면 원래의 요청을 처리하기 위해서
// 클라이언트 요청 전체 주소
String requestURI = request.getRequestURI();
// 현재 프로젝트 경로 가져오기
String contextPath = request.getContextPath();
String uri = requestURI.substring(contextPath.length() + 1);
// 주소 뒤에 파라미터를 가져오기
String query = request.getQueryString();
System.out.println("쿼리"+query);
System.out.println("URI"+uri);
// 실제 주소만들기
if (query == null || query.equals("null")) {
query = "";
} else {
query = "?" + query;
}
//세션에 주소 저장하기
session.setAttribute("dest", uri+query);
//세션에 메시지 저장하기
session.setAttribute("msg","로그인을 하셔야 이용할 수 있는 서비스 입니다.");
response.sendRedirect(contextPath + "/user/login");
return false;
}
// 로그인된 경우에는 Controller가 처리합니다.
return true;
}
4. UserController 에서 로그인을 처리하는 메소드를 수정
=> 이전에는 무조건 시작 페이지로 가도록 되어 있었지만 요청이 있는 경우 그페이지로 이동하도록 코드를 수정
session.setAttribute("user", user);
//이전 요청을 가져오기
Object dest = session.getAttribute("dest");
//이전 요청이 없으면 시작페이지로 이동
if(dest==null) {
return "redirect:/";
//이전 요청이 있으면 그 페이지로 이동
}else {
return "redirect:/"+dest.toString();
}
'Java > 스프링' 카테고리의 다른 글
Aop 관점지향프로그래밍 설정 (0) | 2018.05.26 |
---|---|
5-3.Spring MVC Project - 게시글삭제 (0) | 2018.05.17 |
5-2.Spring MVC Project- 게시판 수정하기 (0) | 2018.05.15 |
5-1. Spring MVC Project- 게시판 상세보기 (0) | 2018.05.15 |
5.Spring 게시판 만들기 (0) | 2018.05.10 |