복붙노트

[SPRING] 로그 아웃 한 후 페이지를 확보하지 못하고 뒤로 버튼을 클릭하십시오.

SPRING

로그 아웃 한 후 페이지를 확보하지 못하고 뒤로 버튼을 클릭하십시오.

이전 직장에서 나는 로그 아웃 후 뒤로 버튼을 사용하여 사이트를 탐색 할 수 없도록하는 것이 불가능하다는 잘 알려진 문제를 겪고있었습니다. 내 기술에는 Spring, JavaScript 및 잠재적으로 Java AJAX 라이브러리 ZK의 모바일 모듈이 포함됩니다. 뒤로 버튼을 사용하여 탐색하는 것 외에도 권한있는 액세스는 다른 방법으로 작동했습니다. 더 이상 애플리케이션 코드에 액세스 할 수 없습니다. 응용 프로그램은 내가 원래의 저자가 아니 었 모바일 중 하나였습니다.

나는 다음의 일반적인 해결책을 시도했다.

t2-spring-security-context.xml에는 다음과 같은 정의가 있습니다.

<http auto-config="true">
    <intercept-url pattern="/mobile-index*" access="ROLE_ADMIN"/>
    <intercept-url pattern="/t2-metrics*" access="ROLE_ADMIN"/>
    <intercept-url pattern="/t2-monitor*" access="ROLE_ADMIN"/>
    <form-login login-page="/login.jsp" authentication-failure-url="/loginerror.jsp"
                default-target-url="/mobile-index.jsp"/>
    <logout logout-success-url="/login.jsp" invalidate-session="true"/>

</http>

구현에 대한 기타 세부 정보 :

나의 유일한 나머지 아이디어는 디버그가 스프링 보안 필터 체인을 치지 않았기 때문에 문제가 클라이언트 코드 (JavaScript) 또는 라이브러리 (스프링 보안과의 잘못된 통합)와 관련되어 있다는 것입니다.

해결법

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

    1.서블릿 컨텍스트 파일에서 아래 코드를 사용하십시오.

    서블릿 컨텍스트 파일에서 아래 코드를 사용하십시오.

        <mvc:interceptors>
            <bean id="webContentInterceptor" class="org.springframework.web.servlet.mvc.WebContentInterceptor">
                    <property name="cacheSeconds" value="0"/>
                    <property name="useExpiresHeader" value="false"/>
                    <property name="useCacheControlHeader" value="true"/>
                    <property name="useCacheControlNoStore" value="true"/>
                </bean>     
            </mvc:interceptors>
    

    jsp 페이지의 아래 코드와 동일하게 작동합니다.

      response.setHeader("pragma", "no-cache");              
      response.setHeader("Cache-control", "no-cache, no-store, must-revalidate");             
      response.setHeader("Expires", "0"); 
    
  2. ==============================

    2.보기 (JSP)를 직접 렌더링 하시겠습니까?

    보기 (JSP)를 직접 렌더링 하시겠습니까?

    그렇다면 no-cache 지시문을 JSP에 직접 추가하십시오.

    <% response.setHeader("Cache-Control", "no-cache"); %>
    ...
    

    또 다른 (선호되는) 옵션은 JSP에 대한 직접 액세스를 방지하고 컨트롤러를 통해 렌더링하는 것입니다.

    @RequestMapping(value = "/login", method = GET)
    public String renderLoginPage() {
        return "login";
    }
    

    이를 사용하여 뷰를 이름으로 해결합니다 (컨트롤러 메서드에서 반환 된 문자열).

    <bean
        id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver"
        p:prefix="/WEB-INF/views" p:suffix=".jsp"
    />
    

    /WEB-IBF/views/login.jsp를보기로 사용하십시오.

    후자의 접근 방식을 사용하면 WebContentInterceptor 접근 방식을 사용하여 캐싱을 멋지게 방지 할 수 있습니다.

    또한 모든 요청이 Spring 보안 필터 체인에 도달했는지 확인하십시오.

  3. ==============================

    3.우리는 스프링 보안을 사용하지 않기 때문에 모든 구성 속성에 익숙하지 않지만 내가 너라면 브라우저 캐싱 문제를 조사하는 것으로 시작할 것입니다. 테스트하기 쉬워야합니다 ... (1) 뒤로 버튼을 누른 후 페이지를 다시로드하거나, 로그 아웃 한 후 (2) 브라우저 캐시 (쿠키가 아님)를 지우고 뒤로 버튼을 누릅니다. 이것이 바람직한 동작을하게되면 다음 단계는 HTTP 응답 헤더 속성을 포함시켜 브라우저 캐싱을 제어해야합니다.

    우리는 스프링 보안을 사용하지 않기 때문에 모든 구성 속성에 익숙하지 않지만 내가 너라면 브라우저 캐싱 문제를 조사하는 것으로 시작할 것입니다. 테스트하기 쉬워야합니다 ... (1) 뒤로 버튼을 누른 후 페이지를 다시로드하거나, 로그 아웃 한 후 (2) 브라우저 캐시 (쿠키가 아님)를 지우고 뒤로 버튼을 누릅니다. 이것이 바람직한 동작을하게되면 다음 단계는 HTTP 응답 헤더 속성을 포함시켜 브라우저 캐싱을 제어해야합니다.

    이것이 아니라면, 나는 당신의 Spring 보안 설정에서 무엇을 찾아야할지 모른다. 누군가가 대답을 알기 바랍니다.

    편집 : 방금 브라우저 캐시 문제 부분을 확인하는 또 다른 비슷한 질문을 발견 - 그 질문의 대답은 응답 헤더를 설정하는 데 사용하는 메커니즘을 포함하는 경우에 대비하여 - 봄 보안 로그 아웃 뒤로 버튼.

  4. ==============================

    4.불행하게도이 질문에 대한 답을 얻지 못하는 이상한 일을 해결하기 위해 더 이상이 코드로 돌아갈 수 없습니다. 개발자가 자신을 혼란스럽게 만들 수있는 놀라운 점.

    불행하게도이 질문에 대한 답을 얻지 못하는 이상한 일을 해결하기 위해 더 이상이 코드로 돌아갈 수 없습니다. 개발자가 자신을 혼란스럽게 만들 수있는 놀라운 점.

    이것이 (아직 입증되지 않은) 해답이라고 생각하지만, 다른 답변은 유용 할뿐만 아니라 상향 보를받을 가치가 있습니다. 당시에 생각한 솔루션은 Spring Security 필터가 관리 할 수있는 MVC와 같은 Spring 구조를 사용하는 대신 프렌드 엔드 코드였습니다. Spring의 Scheduler (여기 문서 참조)를 사용하고 어떤 방식으로 기억하고 있듯이 Spring Security를 ​​구현하는 데 필수적입니다.

    나는 우리가 REST 서비스를 호출하는 방식을 보여주는 프론트 엔드 코드를 게시하려고 시도 할 것이고 스프링 보안을 우회하는 것으로 증명할 것이다.

    당신이 동의하지 않으면 나에게 연락 주시기 바랍니다.

  5. from https://stackoverflow.com/questions/16819660/page-not-secured-after-log-out-and-click-back-button by cc-by-sa and MIT license