스프링 MVC_세션, 인터셉터, 쿠키

예지성준·2024년 7월 15일

스프링프레임워크

목록 보기
10/14
post-thumbnail

스프링 MVC

1. 세션

  • 세션(Session)은 웹 애플리케이션에서 사용자의 상태 정보를 유지하기 위해 사용하는 기법이다. 사용자가 웹 사이트를 방문하여 여러 페이지를 이동할 때, 세션을 통해 사용자의 상태나 데이터를 유지할 수 있다.
@SessionAttribute("이름"): 세션값 조회 및 수정

@SessionAttribute(이름)
  • Model로 해당 이름으로 값을 속성으로 추가하면 세션에도 동일한 이름으로 추가

  • 세션에 해당 이름의 값이 있으면 Model에 자동 추가

  • Magic Form - 여러페이지의 양식

🔸 설문조사 양식

#step1.jsp
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<c:url var="actionUrl" value="/survey/step2"/>

<h1>step1</h1>
<form:form method="post" action="${actionUrl}" autocomplete="off" modelAttribute="requestSurvey">
    
    질문1 : <form:input path="q1"/><br>
    질문2 : <form:input path="q2"/><br>
    <button type="submit">다음 설문</button>
    
</form:form>

#step2.jsp 동일 폼 작성 ...

#step3.jsp 
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="jakarta.tags.core" %>

질문1 : ${requestSurvey.q1}<br>
질문2 : ${requestSurvey.q2}<br>
질문3 : ${requestSurvey.q3}<br>
질문4 : ${requestSurvey.q4}

1번 2번값은 넘어오지않았다. 두번째 form 에서 step3으로 넘겨준거지 첫번째 form 내용은 넘겨주지 않았기 때문

  • hidden값 사용 할 순 있지만 설문 내용이 많아질수록 다 추가해줘야하는 상황이 생긴다. 효율 없음

🔹 SessionAttributes 값 유지시켜주고 model쪽에 넘겨준다.

강사님 말씀(o′┏▽┓`o)
@SessionAttrributes("속성명") 역시 @ModelAttribute 또는 Model과 서로 연결 되는데요. 보통 뷰에서 공유할 값은 request 범위의 속성으로 추가되지만 @SessionAttributes로 지정한 값은 세션 범위에서 값이 임시로 저장함으로써 이 역시 뷰에서 사용할 수 있다고 보시면 됩니다.

여러 페이지로 구성된 양식일경우 자주 사용됨

  • SessionAttributes 애노테이션으로 requestSurvey라는 모델 속성을 세션션에 저장하도록 지정함

기본 post 동작 범위는 Request임
step1의 값을 남겨두기 위해서 범위를 session으로 확장 시켜줘야한다.
sessionAttribute의 속성명으로 커맨드객체를 넘겨주고 컨트롤러에서 동일 객체를 사용할수있도록 하기위해 ModelAttribute가 붙은 커맨드객체 메서드를 생성해준다.

세션 지정을 하지않은경우에는 request 범위이기 때문에 해당 ModelAttribute를 GetMapping 매개변수에 넣어주는 동작과 같다.

SessionStatus

  • 완료 상태 플래그
  • 세션 속성을 완료상태로 표시할때 사용
  • void setComplete():
  • boolean isCompete()

세션값 조회

메소드 매개변수로 사용하여 세션의 값을 받아와서 form2에 저장함

🌟수정사항🌟
세션 비우기는
HttpSession

  • session.removeAttribute("이름");
    이형태로 해야한다.

q3과 q4만 가지고 있지만 q1, q2은 세션에 값이 유지되고있음

세션에 값은 커맨드 객체에 넣어서 유지한다.
같은 커맨드 객체이면 값이 유지가 되기 때문에 step3에서 q1,2,3,4 모든 값을 얻을 수 있다.

# SurveyController 클래스
@Slf4j
@Controller
@RequestMapping("/survey")
@SessionAttributes("requestSurvey")
public class SurveyController {
    //여러 페이지로 구현된 양식

    @ModelAttribute
    public RequestSurvey requestSurvey(){
        return new RequestSurvey();
    }

    @GetMapping("/step1")
    public String step1(){

        return "survey/step1";
    }

    @PostMapping("/step2")
    public String step2(RequestSurvey form, @SessionAttribute("requestSurvey") RequestSurvey form2){

        log.info("form : " + form.toString());
        log.info("form2 : " + form2.toString());
        return "survey/step2";
    }

    @PostMapping("/step3")
    public String step3(RequestSurvey form, @SessionAttribute("requestSurvey") RequestSurvey form2 , SessionStatus status, HttpServletRequest request){
        //값을 가져오고 세션을 비운다음에 값 확인

        log.info("form : " + form.toString());
        log.info("form2 : " + form2.toString());

        status.setComplete();

        System.out.println("세션 비우기 후: "+ request.getSession().getAttribute("requestSurvey")); //null값 나옴

        return "survey/step3";
    }
}


2.인터셉터

1) HandlerInterceptor 인터페이스

preHandle 메서드

  • 🌟boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;

    • 컨트롤러 메서드 실행 전에 실행됨
    • 반환값이 boolean: 통제 목적
      • 반환값에 따라서 컨트롤러 빈의 메서드의 실행 여부 통제
      • true일때는 컨트롤러 메서드 실행, flase 일때는 컨트롤러 메서드가 실행되지 않음

🔸 회원만 접근 가능하도록 마이페이지를 통제해보자

반환값을 false로 하면 mypage경로의 내용을 볼 수 없다. 컨트롤러 메서드 실행되지않음

🔼 설정 클래스 새로 만들고 통합

🔹 로그인 상태 통제

➡ 로그인 아닌 상태에서 마이페이지 접근하려고 해도 로그인 페이지로 리다이렉트됨!

통제 기능보다 공통 처리 기능으로 많이 쓰임...^^
예시..

로그인 통제기능은 이미 만들어져 있는걸로 쓰게 될 것이당~

postHandle 메서드

  • void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception;
    • 컨트롤러가 실행된 후, ModelAndView 반환 직후에 실행됨
    • 공통 처리 부분을 주로 넣음
    • ModelAndView에는 view에 대한 정보가 담겨있다.

afterCompletion 메서드

  • void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;
    • 완료된 후, 응답 후 실행
    • 예외객체 포함
    • 공통 처리 부분을 주로 넣음

2) WebMvcConfigurer 인터페이스

addInterceptors(InterceptorRegistry registry)

3) Ant 경로 패턴

    • : 0개 또는 그 이상의 글자
  • ** 0개 또는 그 이상의 폴더 경로
  • ? : 1개 글자

3.쿠키

@CookieValue: 개별 쿠키값 조회

이메일 기억하기 옵션

@CookieValue 애노테이션은 요청 매핑 애노테이션 적용 메서드의 쿠키 타입 파라미터에 적용

쿠키 이름 -> savedEmail

기본값 required = true
지정한 이름의 쿠키가 존재하지 않으면(이메일 기억하기를 선택하지 않았을 경우) 익셉션 발생

required = false로 해주면 쿠키값이 null이여도 상관없다.

profile
꽁꽁 얼어붙은 한강 위로 😺

0개의 댓글