【问题标题】:Disable browsers back button if the session is invalidated [duplicate]如果会话无效,请禁用浏览器后退按钮 [重复]
【发布时间】:2014-06-14 23:05:17
【问题描述】:

我正在研究 JSP。我知道有很多关于这个主题的帖子,但没有什么对我有用。我有一个登录页面,它指向一个欢迎页面。当用户单击注销时会话无效,然后被重定向到登录页面。但是,如果用户单击浏览器的返回按钮,他将再次被带到欢迎页面,尽管如果他按下任何其他按钮或刷新页面,他将被带到登录页面,因为会话已过期。但是我不希望用户在注销后通过单击浏览器的后退按钮来访问欢迎页面。我尝试使用以下内容:

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="-1" />

但它不起作用。

我尝试使用:

window.history.forward(1);

它工作正常,但它会导致另一个问题。如果用户登录并被带到欢迎页面。然后用户按下一个按钮让我们说“显示用户详细信息”,用户被带到“显示用户详细信息”页面。现在如果用户单击返回按钮返回到欢迎页面。由于欢迎页面上的window.history.forward(1),他停留在相同的“显示用户详细信息”页面上。

如果会话有效,我希望用户应该能够使用浏览器的后退按钮。如果会话无效,他应该无法使用浏览器的后退按钮。

【问题讨论】:

  • 没关系,我明白了..!!
  • $().ready(function() { if(document.referrer != 'localhost:8181/'){ history.pushState(null, null, 'login'); window.addEventListener('popstate ', function () { history.pushState(null, null, 'login'); }); } });

标签: javascript html jsp back-button


【解决方案1】:

您可以禁用注销页面上的后退按钮。这样用户在单击注销后就无法返回。 将此脚本添加到页面,

<SCRIPT type="text/javascript">
    window.history.forward();
    function noBack() { window.history.forward(); }
</SCRIPT>

还有在你的jsp中,

   <BODY onload="noBack();"
    onpageshow="if (event.persisted) noBack();" onunload="">

另一个建议是,如果会话过期,不要盲目地将用户重定向到登录页面。只需在您的注销页面中有一个链接即可登录

希望对你有帮助!!

【讨论】:

    【解决方案2】:

    这是完美的工作。我使用以下内容清除缓存。我正在使 logout.jsp 中的会话无效,单击时,它会检查某些令牌属性(在用户登录时设置),如果找不到,它会重定向到登录页面。

    <%
    
    response.setHeader("Cache-Control","no-cache");
    response.setHeader("Cache-Control","no-store");
    response.setHeader("Pragma","no-cache");
    response.setDateHeader ("Expires", 0);
        if(session.getAttribute("token")==null){
        response.sendRedirect(request.getContextPath() + "/LogOut.jsp");
    
    }
    %>
    

    感谢您的建议。我一定会付诸行动的。感谢您的每一个帮助和建议。

    【讨论】:

    • 你在哪里添加了这段代码?在 logout.jsp 中?
    【解决方案3】:

    试试这个代码

    在您的项目中添加此类“NoCacheFilter”

     @WebFilter(servletNames = { "Faces Servlet" })
     public class NoCacheFilter implements Filter {
    
    /**
     * doFilter Method.
     * <p>
     * 
     * <pre>
     * 
     * </pre>
     * 
     * </p>
     * @param request
     * @param response
     * @param chain
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
            ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
    
        if (!req.getRequestURI().startsWith(req.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) {                                                                                                            
    
            res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
            res.setHeader("Pragma", "no-cache");
            res.setDateHeader("Expires", 0);
        }
    
        chain.doFilter(request, response);
    }
    
    /**
     * Initial Method.
     * <p>
     * 
     * <pre>
     * 
     * </pre>
     * 
     * </p>
     * @param filterConfig
     * @throws ServletException
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    
    /**
     * Destroy Method.
     * <p>
     * 
     * <pre>
     * 
     * </pre>
     * 
     * </p>
     */
    @Override
    public void destroy() {
    }
    }
    

    https://eclipse.googlesource.com/eclipselink/examples/mysports/+/b37750abf978fc8daee30ef4c214cf88857371b3/admin.web/src/main/java/eclipselink/example/mysports/admin/jsf/NoCacheFilter.java

    【讨论】:

      猜你喜欢
      • 2011-04-06
      • 2014-04-09
      • 2011-08-06
      • 2014-08-21
      • 2010-10-31
      • 2014-04-17
      • 2014-05-08
      相关资源
      最近更新 更多