복붙노트

[SPRING] 스프링 MVC에서 브라우저 백 버튼 처리 방법

SPRING

스프링 MVC에서 브라우저 백 버튼 처리 방법

사용자가 로그온하면 세션 정보가 저장됩니다.  사용자가 기록 될 때 세션 정보가 지워집니다.  밖으로. 그러나 브라우저의 뒤로 버튼을 누르면 사용자 정보가 표시됩니다. 세션이 끝났으므로 확실하지 않습니다.  사용자 로그인 조작이 수행됩니다. 이 문제를 어떻게 해결합니까?  문제?

  ----------------------------log out -------------------------------

   @RequestMapping(value="logout.htm",method = RequestMethod.GET)
   public void logOut(HttpSession session,HttpServletResponse                 
   response,HttpServletRequest request) throws IOException{
    final String refererUrl = request.getHeader("Referer");
    response.setHeader(refererUrl, "no-cache");
    response.setHeader("Cache-Control", "no-cache");
    response.setDateHeader("Expires", 0);
    session.removeAttribute("user");
    session.invalidate();
    response.sendRedirect("index.htm");
   }
    ---------------------------------- login ---------------
  @RequestMapping(value="/userLogin",method=RequestMethod.POST)

  public @ResponseBody JsonResponse
 login(@ModelAttribute(value="user") User user, BindingResult     result,HttpServletRequest request,HttpSession session,ModelMap model) throws    UnsupportedEncodingException{

    JsonResponse res = new JsonResponse();

    if(!result.hasErrors()&& userService.findUser(user, request)){
        res.setStatus("SUCCESS");
        session.setAttribute("user",
      new String(user.getUsername().getBytes("iso-  8859-1"), "UTF-8"));
      }
         else{
        res.setStatus("FAIL");
        result.rejectValue("username","1");
        res.setResult(result.getAllErrors());
       }
      return res;
   }
   --------------------------profile --------------------------------------

    @RequestMapping(value="myProfile.htm",method = RequestMethod.GET)
   public String showmyProfile(@ModelAttribute(value="addUser") User user,Model          model,HttpServletRequest request,
        HttpServletResponse response,
         HttpSession session) throws IOException{

        if(session.getAttribute("user")== null){
        response.sendRedirect("index");
    }

해결법

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

    1.나는이 방법을 사용한다. 먼저 Filter를 구현하는 하나의 클래스를 만들고 doFilter () 메서드를 재정의합니다. doFilter ()의 코드는 다음과 같습니다.

    나는이 방법을 사용한다. 먼저 Filter를 구현하는 하나의 클래스를 만들고 doFilter () 메서드를 재정의합니다. doFilter ()의 코드는 다음과 같습니다.

     @Override
     public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    HttpServletResponse hsr = (HttpServletResponse) res;
    hsr.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
    hsr.setHeader("Pragma", "no-cache"); // HTTP 1.0.
    hsr.setDateHeader("Expires", 0); // Proxies.
    chain.doFilter(req, res);
     }
    

    web.xml의 filter 사용 후. 이 필터는 이것입니다.

      <filter>
        <filter-name>noCacheFilter</filter-name>
        <filter-class>com.example.NoCacheFilter</filter-class>
     </filter>
     <filter-mapping>
      <filter-name>noCacheFilter</filter-name>
      <url-pattern>/secured/*.jsp</url-pattern>// urls that not cached 
     </filter-mapping>
    
  2. ==============================

    2.서블릿 컨텍스트 내부에 인터셉터를 다음과 같이 구성하십시오.

    서블릿 컨텍스트 내부에 인터셉터를 다음과 같이 구성하십시오.

    <!--  configuration for handling browser back button  -->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**/*"/>
            <beans:bean id="webContentInterceptor" class="org.springframework.web.servlet.mvc.WebContentInterceptor">
                <beans:property name="cacheSeconds" value="0"/>
                <beans:property name="useExpiresHeader" value="true"/>
                <beans:property name="useCacheControlHeader" value="true"/>
                <beans:property name="useCacheControlNoStore" value="true"/>
            </beans:bean>
        </mvc:interceptor>
    </mvc:interceptors>
    

    참고 : 응용 프로그램을 테스트하는 동안 브라우저 캐시를 제거하는 것을 잊지 마십시오.

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

    3.스프링 보안 4.0에서는이 문제가 기본적으로 해결되었습니다. 보안 XML 설정에서도 추가 코드를 작성할 필요가 없습니다.

    스프링 보안 4.0에서는이 문제가 기본적으로 해결되었습니다. 보안 XML 설정에서도 추가 코드를 작성할 필요가 없습니다.

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

    4.

    response.setHeader(refererUrl, "no-cache");
    response.setHeader("Cache-Control", "no-cache");
    response.setDateHeader("Expires", 0);
    

    위의 코드는 캐시를 지우고 서버 측에서 세션을 만료합니다. 그러나 세션이 실제로 작동하는지 여부에 관계없이 세션 (HTML 또는 JSP)에서 확인하거나 처리해야합니다. 보기에 no-cache 및 no-store라고 말하기 위해 다음 메타 태그를 사용할 수 있습니다.

    <meta http-equiv="Cache-control" content="no-cache">
    

    또는

    <META HTTP-EQUIV="Cache-Control" CONTENT="No-Cache,Must-Revalidate,No-Store">
    

    브라우저 캐시 제어에 대해서는이 부분을 참조하십시오.

  5. from https://stackoverflow.com/questions/26420941/how-handle-browser-back-button-in-spring-mvc by cc-by-sa and MIT license