如果会话无效,则禁用浏览器后退按钮

时间:2014-04-29 06:45:43

标签: javascript html jsp back-button

我正在研究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);

它工作正常,但它会导致另一个问题。如果用户登录并进入欢迎页面。然后用户按下按钮,然后说“显示用户详细信息&#34;并且用户被带到&#34;显示用户详细信息&#34;页。现在,如果用户单击后退按钮返回欢迎页面。他保持同样的状态&#34;显示用户详细信息&#34;页面,因为欢迎页面上的window.history.forward(1)

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

3 个答案:

答案 0 :(得分:7)

您可以在注销页面上停用后退按钮。这样用户一旦点击退出就无法返回。 将此脚本添加到页面

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

还有你的jsp,

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

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

希望这会有所帮助!!

答案 1 :(得分:4)

这很完美。我使用以下内容来清除缓存。并且我在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");

}
%>

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

答案 2 :(得分:0)

试试此代码

在项目中添加此类“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() {
}
}

@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

相关问题