로그인을 하지 않는 사용자가 게시판에서 글쓰기를 누르면 작성을 하지 못하도록 하고싶음. 서블릿 필터를 적용해도 되는데 스프링 인터셉터로 한번 적용을 시켜보자
스프링 인터셉터 흐름
HTTP 요청 → WAS → 필터 → 서블릿 → 스프링 인터셉터 → 컨트롤러
HandlerInterceptor 인터페이스를 가져와서 구현한다. preHandle은 요청 컨트롤러를 찾기 전에 실행된다. 이때 만약 세션이 존재하지 않는다면 로그인 화면으로 보내줄거다. 이때 로그인을 한 후에 이용하고자 한 서비스 화면을 클라이언트로 보내주려고 response에 리다이렉트 주소를 넣어줬다.
@Slf4j
public class LoginCheckInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestURI = request.getRequestURI();
log.info("인증 체크 인터셉터 실행 {}", requestURI);
HttpSession session = request.getSession();
if (session == null || session.getAttribute(AddtionalInfoInterface.SESSION_COOKIE_NAME) == null) {
log.info("미인증 사용자 요청");
response.sendRedirect("/login2?redirectURL="+ requestURI);//일단 홈으로 보내버리자
return false;
}
return true;
}
}
이제 위에서 만든 클래스를 인터셉터에 추가를 해줘야 한다. WebMvcConfigurer 의 구현체를를 이용한다. "/**" 를 사용하면 모든 경로에 적용할 수 있고 excludePathPatterns를 이용해서 제외할 url경로를 설정해주자. 예를들면 로그인 화면 자체가 막히면 안되니까!
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginCheckInterceptor())
.order(1)
.addPathPatterns("/**")
.excludePathPatterns("/", "/bulletinBoard", "/bulletinBoard/search",
"/login","/login2", "/members/new", "/css/**", "/*.ico", "/error");
}
}
로그인 post 요청부분을 수정했다. redirectURL 주소를 default 를 "/" 으로 지정하고 만약 어떤 서비스를 이용하려다가 인터셉터에서 걸려서 로그인 화면으로 넘어온거면 리다이렉트 주소를 붙혀줬다.
@PostMapping("/login2")
public String login(@Validated @ModelAttribute LoginForm loginForm, BindingResult result,
@RequestParam(defaultValue = "/") String redirectURL ,Model model,
HttpServletRequest request ){
if (result.hasErrors()) {
return "/login2";
}
Member findMember = memberRepository.findByLoginId(loginForm.getLoginId(), loginForm.getPassword());
if (findMember == null) {
return "/login2";
}
HttpSession session = request.getSession();
session.setAttribute(AddtionalInfoInterface.SESSION_COOKIE_NAME, findMember);
model.addAttribute("member", findMember);
return "redirect:"+ redirectURL;
}