🪲문제상황
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String requestURI = request.getRequestURI();
System.out.println("요청 주소:" + requestURI);
HttpSession session = request.getSession();
//사용자가 로그인정보를 하면 세션 메모리의 user에 저장
Object user = session.getAttribute("user");
System.out.println(user);
if(user==null) {
//로그인이 되어있지 않다. 로그인 페이지로 이동
response.sendRedirect("/Users/LoginForm");
return false;
}
return true;
}
Authintercepter파일의 일부분이다. 이대로 실행하게되면 웹브라우저에서 아래와 같은 현상이 발생한다.
🔎원인찾기
무한 리다이렉션
:사용자가 로그인하지 않은 상태에서 /Users/LoginForm으로 리다이렉트되면, 이렇게 되면 무한 리다이렉트 루프에 빠지게 된다. 그러니까 쉽게 설명하면 로그인을 하지 않았기 때문에 user가 계속 null인 상태가 되는 것이다. 그렇게되면 아래 WebMvcConfig파일을 참고하면 이 인터셉터를 계속 통과해야하는데 user가 계속 null이기 때문에 return false가 되어 무한 리디렉션상태에 빠지게 되는 것이다.
@Autowired
private AuthInterceptor authInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/css/**","/img/**","/js/**");
WebMvcConfigurer.super.addInterceptors(registry);
}
WebMvcConfig파일의 일부분이다. addPathPatterns에 보면 /**이라고 되있는데 이게 모든경로(http://localhost:900 밑의 모든 파일 대상)에 대해서 Interceptor가 관여한다는 의미라서 모든 페이지에 대한 요청이 인터셉터를 통과하게 된다.
URL 매핑 문제
:로그인 페이지의 URL 매핑이 잘못되어 있어도 이런 현상이 발생할 수 있기 때문에 주의 해야한다.
🐣해결
따라서 로그인한 상태를 추가 해야한다.
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String requestURI = request.getRequestURI();
System.out.println("요청 주소:" + requestURI);
// /Users/LoginForm, //Users/Login 을 제외
if(requestURI.contains("/Users/LoginForm")) {
return true;
}
if(requestURI.contains("/Users/Login")) {
return true;
}
HttpSession session = request.getSession(); //세션은 30분이 지나면 자동으로 종료됨
//사용자가 로그인정보를 하면 세션 메모리의 user에 저장
Object login = session.getAttribute("login");
System.out.println(login);
if(login==null) {
//로그인이 되어있지 않다. 로그인 페이지로 이동
response.sendRedirect("/Users/LoginForm");
return false;
}
//preHandle의 return문의 의미는 컨트롤러의 요청 url로 가도되는지 여부를 결정하는 것
//return : 컨트롤러의 url로 가게된다.
return true;
}
}
💡전처리/후처리 기술?
전처리 기술은 위에서 다뤘던 login부분이다. 즉, INTERCEPTER로 중간에 경로를 가로채서 로그인 하는 과정이다.
//후처리 기술
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("========postHandle()========");
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
이때, 후처리기술은 Spring MVC의 Dispatcher Servlet이 화면을 처리하기 전에 동작한다.(응답생성전 콘솔에 ========postHandle()========이 출력되는 것을 확인할 수 있다.) 요청이 처리된후 어떤 요청이 들어왔고, 어떤 응답이 반환되었지를 로그로 기록할 수 있는 것이다. 위 메소드에서는 특정 조건에 따라 다른 뷰로 리다이렉트하거나, 다른 응답 헤더를 설정하는 등의 작업이 가능하다. 또한, 여러 개의 인터셉터가 있을 경우, postHandle 메서드는 체인 형태로 호출된다. 따라서 여러 인터셉터에서 후처리를 동시에 수행할 수 있다.
'시행착오' 카테고리의 다른 글
[spring] 회원정보 수정하기 (0) | 2024.10.16 |
---|