복붙노트

[SPRING] Spring : @SessionAttributes 대 HttpSession

SPRING

Spring : @SessionAttributes 대 HttpSession

@SessionAttributes와 HttpSession의 차이점은 무엇입니까? 둘 중 어느 것이 세션에서 더 많은 시간 동안 객체를 유지합니까? 어떤 경우에는 그 중 하나를 사용해야하고 어떤 경우에는 다른 하나를 사용해야합니까?

감사

해결법

  1. ==============================

    1.@SessionAttributes는 요청 사이에 지속되는 모델 속성 세션을 사용 가능하게하며, 한 사람당 구체적이어야합니다. 그 의도는 대화 범위 (세션보다 짧고 요청보다 길기)를 구현하는 단계로 가까워지는 구성을 제공하는 것이 었습니다. 대화 범위의 필요성과 @SessionAttributes를 사용하여 전체적으로 사용할 수없는 이유는이 블로그에서 잘 설명되어 있습니다.

    @SessionAttributes는 요청 사이에 지속되는 모델 속성 세션을 사용 가능하게하며, 한 사람당 구체적이어야합니다. 그 의도는 대화 범위 (세션보다 짧고 요청보다 길기)를 구현하는 단계로 가까워지는 구성을 제공하는 것이 었습니다. 대화 범위의 필요성과 @SessionAttributes를 사용하여 전체적으로 사용할 수없는 이유는이 블로그에서 잘 설명되어 있습니다.

    일치하는 모델 속성을 자동으로 저장합니다 (일치는 이름을 기반으로 함). 기본 저장소는 HttpSession이지만 다른 방식으로도 구성 할 수 있습니다. 워드 프로세서는 말한다

    이 비트는 핸들러가 대화 세션의 완료를 표시하면 해당 속성은 제거됩니다. 자동적으로 발생하는 것은 아니며, SessionStatus 인스턴스에서 setComplete를 사용하여 대화의 종료를 나타내는 것은 개발자의 몫입니다. 그렇지 않으면 모델 속성이 세션에 남아있게되며, 이는 종종 바람직하지 않은 부작용입니다.

    차이점을 이해하는 가장 쉬운 방법은 모델 변수의 범위와 값, @SessionAttribute로 백업 된 모델 변수 및 "일반"HttpSession 변수를 관찰하는 것입니다.

    두 개의 간단한 컨트롤러를 살펴보십시오.

    @Controller
    @SessionAttributes("modelAndSession")
    @RequestMapping("/sessionattr")
    public class FirstController {
        protected static final String NEXT_VIEW = "next";
        @RequestMapping("/init")
        public String handlingMethod1( Model model, HttpSession session) {
            model.addAttribute(NEXT_VIEW, "/sessionattr/afterinit");
            session.setAttribute("session", "TRUE");
            model.addAttribute("modelAndSession", "TRUE");
            model.addAttribute("model", "TRUE");
            return "index";
        }
    
        @RequestMapping("/afterinit")
        public String handlingMethod2(SessionStatus status, Model model) {
            model.addAttribute(NEXT_VIEW, "/nosessionattr/init");
            //status.setComplete();
            return "index";
        }
    
    }
    

    제 2 제어기

    @Controller
    @RequestMapping("/nosessionattr")
    public class SecondController {
        protected static final String NEXT_VIEW = "next";
        @RequestMapping("/init")
        public String handlingMethod3(Model model) {
            model.addAttribute(NEXT_VIEW, "/sessionattr/init");
            return "index";
        }
    }
    

    흐름을 트리거하는보기

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <a href="${next}">Next step ${next}</a>
    <hr/>
    <table>
         <thead>
              <th>key</th> <th>Request scope</th> <th>Session scope</th>
         </thead>
        <tr>
            <td>model</td> <td>${requestScope.model}</td> <td>${sessionScope.model}</td>
        </tr>
        <tr>
            <td>model and session</td> <td>${requestScope.modelAndSession}</td> <td>${sessionScope.modelAndSession}</td>
        </tr>
        <tr>
            <td>session</td> <td>${requestScope.session}</td> <td>${sessionScope.session}</td>
        </tr>
    </table>
    

    초기 요청 / sessionattr / init시 뷰는 다음과 같이 렌더링됩니다

    따라서 모델 변수는 요청 범위에서 사용할 수 있습니다. 세션 속성은 요청과 세션 범위 모두에서 사용할 수 있으며 "일반"세션 속성은 세션 범위에서만 사용할 수 있습니다

    다음 요청 / sessionattr / afterinit에서 뷰는 다음과 같이 렌더링됩니다.

    따라서 모델 전용 변수는 사라지고 @SessionAttribute 모델 속성은 세션에서 모델로 푸시되고 요청간에 지속됩니다. 다음 단계는 두 번째 컨트롤러 / nosessionattr / init을 대상으로하며 뷰는 다음과 같이 렌더링됩니다

    이제 @SessionAttribute 모델 객체는 모델에서 제외되었지만 status.setComplete는 명시 적으로 호출되지 않았기 때문에 정상 변수로 세션에 남아있었습니다

    이것은 많은 사람들이 @SessionAttribute 모델 객체가 처리기를 전환 한 후에 사라져야한다고 생각 하듯이 특별히 혼란스러운 시나리오이지만 명시 적으로 지워지지 않는 한 세션에 남아 있습니다. 스 니펫을 복사하고 혼동을주는 조합을 자세히 조사하십시오.

  2. ==============================

    2.Master Slave는 이미 질문에 대답했습니다. @SessionAttributes와 HttpSession의 차이점에 대해 추가하고 싶은 점이 하나 있습니다.

    Master Slave는 이미 질문에 대답했습니다. @SessionAttributes와 HttpSession의 차이점에 대해 추가하고 싶은 점이 하나 있습니다.

    @SessionAttributes는 HTTPSession에 저장됩니다. HTTPSesssion # invalidate ()를 호출하면 사라집니다. 새 세션이 있지만 @SessionAttributes로 표시된 변수는 유지되고 새 세션으로 복사됩니다.

    따라서 세션을 무효화해야하거나 @SessionAttributes 자체가 대화 범위에서 더 이상 필요하지 않은 경우 SessionStatus 인터페이스를 적절한 handler-method에 삽입 한 다음 SessionStatus # setComplete ()를 호출합니다.

    마스터 슬레이브가 제공 한 JSP 파일을 Thymeleaf 템플릿으로 다시 작성했습니다. 동일한 컨트롤러 클래스를 사용할 수 있습니다.

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>Index</title>
    </head>
    <body>
    <a href="../sessionattr/init" data-th-href="@{${next}}">Next step [[${next}]]</a>
    <hr>
    <table>
        <thead>
            <tr>
                <th>key</th>
                <th>Request Scope</th>
                <th>Session Scope</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>model</td>
                <td data-th-text="${#request.getAttribute('model')?: 'false'}">N/A</td>
                <td data-th-text="${#session.getAttribute('model')?: 'false'}">N/A</td>
            </tr>
            <tr>
                <td>modelAndSession</td>
                <td data-th-text="${#request.getAttribute('modelAndSession')?: 'false'}">N/A</td>
                <td data-th-text="${#session.getAttribute('modelAndSession')?: 'false'}">N/A</td>
            </tr>
            <tr>
                <td>session</td>
                <td data-th-text="${#request.getAttribute('session')}?: 'false'">N/A</td>
                <td data-th-text="${#session.getAttribute('session')}?: 'false'">N/A</td>
            </tr>
        </tbody>
    </table>
    </body>
    </html>
    
  3. from https://stackoverflow.com/questions/27191798/spring-sessionattributes-vs-httpsession by cc-by-sa and MIT license