2012-04-26 231 views
4
<% 
    response.setHeader("Cache-Control","no-cache,no-store,must-revalidate");//HTTP 1.1 
    response.setHeader("Pragma","no-cache"); //HTTP 1.0 
    response.setDateHeader ("Expires", 0); //prevents caching at the proxy server 
%> 

注销后,对正在添加的登录页面,如果您单击后退按钮,它显示了它在登陆旧的一页。我使用上述一个jsp 3个系和我包括这在我所有jsps里面的身体标记。这对某些jsps不起作用。有什么事情我们需要考虑在loggout之后停止缓存。如果一个jsp有Post方法的表单,这种技术不起作用。上后退按钮缓存问题注销后点击

在我的注销操作中,我正在执行此操作。

Cookie logoutCookie = new Cookie("somename", null); 
logoutCookie.setPath("/somename"); 
logoutCookie.setMaxAge(0); 
ServletActionContext.getResponse().addCookie(logoutCookie); 

谢谢。

回答

2

我包括这在我的身体标签内的所有JSP

这可能是太晚了当HTTP响应已经在t提交帽子点。当X个字符已经被写入时,HTTP响应将被提交,在你的情况下将是HTML <head>。您需要将这些行放在JSP文件的最顶端,而不是HTML表示的<body>


在一个不相关的说明中,通过将相同的代码行复制到多个文件中,您犯了一个巨大的设计错误。这不是DRY。无论何时您需要复制代码,您都应该停下来问问自己是否没有一个的地方来执行特定的代码。在你的情况下,你应该使用Filter来代替。有关具体示例,请参阅此答案:Prevent user from seeing previously visited secured page after logout。另外,在JSP中编写Java代码是一种不好的做法。检查How to avoid Java code in JSP files?

此外,您的注销方法很奇怪。不要将用户名存储在某个自定义Cookie中。你基本上是重新开始会议。只需将登录用户存储为会话属性,并使整个会话无效并发送重定向。

request.getSession().invalidate(); 
response.sendRedirect(request.getContextPath() + "/home.jsp"); 

有关背景资料会话,阅读本:How do servlets work? Instantiation, sessions, shared variables and multithreading

+0

在不允许页面被缓存后,我在fire狐狸中获取文档过期消息。这是当我回到页面,这是POST请求的某些操作的结果。什么是最好的解决方案。我无法在这里使用GET,谢谢。 – MadhuB 2012-08-20 12:14:20

+0

答案将是发送重定向,但由于这是GET,故事结束。与它一起生活,这就是POST的工作原理。 – BalusC 2012-08-20 12:16:40

0

你试过response.setHeader("Cache-control","no-store"); response.setHeader("Pragma","no-cache"); response.setDateHeader("Expires", -1);?我认为你在正确的地方错过了报价。

+0

是的,我试过这个。不适用于某些网页。 – MadhuB 2012-04-26 11:52:09

+0

'不适用于某些网页'不是真的有帮助。你是否每次都要登录这个人?运行中是否有过滤器?你如何检查用户是否首先被验证? – KodeSeeker 2012-04-26 12:31:09

2

如果您使用浏览器的后退按钮,则无法执行任何操作。该页面将始终来自缓存。

只要确保在用户单击注销时使会话无效。这样,当用户点击“返回”并尝试使用该页面时,他将被重定向到登录页面(如果您的站点编程正确)。

[编辑]

这里是我们把有没有缓存的HTTP 1.1头:

httpResponse.setHeader("Cache-Control", "private,no-store,no-cache"); 
+0

我不在这里使用会话。我只使用Cookie来获取登录的用户详细信息。 – MadhuB 2012-04-26 11:52:23

+1

那么,无论是否有会话,你是在讨论浏览器的后退按钮还是应用程序中的某个后退按钮? – tom 2012-04-26 11:54:01

+0

@Tom ::我的注销按钮是一个Ajax调用.. ajax调用结束后,它的重定向到登录页面。我可以在我的Ajax调用请求上设置“no-cache”选项吗? – user1050619 2014-05-06 23:48:35

0

创建一个会话属性让我们说“有效”,并与其他任何值,那么在JSP空初始化,只是登录凭据后被匹配。现在创建一个验证。jsp用下面的代码:

<% 
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. 
response.setHeader("Pragma", "no-cache"); // HTTP 1.0. 
if(session.getAttribute("valid")==null) 
{ 
    out.println("<script>parent.location.href='login.jsp'</script>"); 
} 
%> 

现在只需将这个jsp文件包含在每个jsp页面上并完成。不要忘记写“session.invalidate();”在logout.jsp

希望它能工作.. !!!