我正在研究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)
。
如果会话有效,我希望用户应该能够使用浏览器后退按钮。如果会话无效,他将无法使用浏览器后退按钮。
答案 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() {
}
}