스프링 인터셉터 적용

꿀이·2022년 2월 2일
0

스프링 인터셉터 적용

로그인을 하지 않는 사용자가 게시판에서 글쓰기를 누르면 작성을 하지 못하도록 하고싶음. 서블릿 필터를 적용해도 되는데 스프링 인터셉터로 한번 적용을 시켜보자

스프링 인터셉터 흐름
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;
    }
profile
내게 맞는 옷을 찾는중🔎

0개의 댓글