목차

세션을 사용하기 위한 Filter와 Interceptor

🗓️

HttpSession

  • 세션 생성을 자동으로 해주는 객체
  • 기본 사용법
@RestController
public class SessionInfoController {

    @GetMapping("/session-info")
    public String sessionInfo(HttpServletRequest request) {
        HttpSession session = request.getSession(false);
        if (session == null) {
            return "세션이 없습니다.";
        }

        //세션 데이터 출력
        session.getAttributeNames().asIterator()
                .forEachRemaining(name -> log.info("session name={}, value={}", name, session.getAttribute(name)));

        log.info("sessionId={}", session.getId());
        log.info("getMaxInactiveInterval={}", session.getMaxInactiveInterval());
        log.info("creationTime={}", new Date(session.getCreationTime()));
        log.info("lastAccessedTime={}", new Date(session.getLastAccessedTime()));
        log.info("isNew={}", session.isNew());

        return "세션 출력";

    }
}
@GetMapping("/")
public String homeLoginV3Spring(
        @SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) Member loginMember, Model model) {

    //세션에 회원 데이터가 없으면 home
    if (loginMember == null) {
        return "home";
    }

    //세션이 유지되면 로그인으로 이동
    model.addAttribute("member", loginMember);
    return "loginHome";
}

Tracking session

  • 쿠키를 지원하는지 안하는지 서버는 모른다. 그래서 주소에 JSESSIONID를 세션 생성할때 내려 보내는데 이것을 모든 컨트롤러에서 다 파싱을 해야하니 불편하다.
  • 대게는 쿠키지원을 하니까 tracking-modes를 cookie로 변경하면 주소에 JSESSIONID가 사라진다.
server.servlet.session.tracking-modes=cookie

Session timeout

server.servlet.session.timeout=30m

Filter, Interceptor

  • Filter : 서블릿
  • Interceptor : 스프링

Filter

  • 만약 로그인 여부 체크를 컨트롤러마다 해야 한다면 번거롭다. 그래서 공통 관심사를 처리하는 AOP를 활용할 수도 있지만, 예를들어 특정URL에 대한 처리와 같은 웹과 관련된 부가기능이 함께 있는 서블릿 필터, 스프링 인터셉터를 활용하는것이 좋다.
  • 사용방법은 servlet.Filter를 구현해 doFilter에 적절한 로직을 넣고 (chain.doFilter 필수)
  • spring.WebMvcConfigurer를 구현, (@Configuration) FilterRegistrationBean를 사용해 필터를 등록하면 된다.

Interceptor

  • 스프링 인터셉터는 디스패처 서블릿과 컨트롤러 사이에서 컨트롤러 호출 직전에 호출 된다.
  • 서블릿의 필터랑 다르게 URL패턴이 더 정밀하다. addPathPatterns, excludePathPatterns
  • 사용방법은 HandlerInterceptor를 구현해 preHandler를 구현한다.
  • 그리고 필터와 마찬가지로 WebMvcConfigurerInterceptorRegistry로 등록한다

ArgumentResolver

  • @SessionAttribute의 긴 어노테이션 대신 임의로 어노테이션을 만들어 Request Mappling Handler Adaptor 구조를 접목할 수 있다.

POST

  • application/x-www-form-urlencoded