2011-11-04 116 views
2

可能重复:
Prevent user from going back to the previous secured page after logout无效会话 - Servlet的

我想知道如何在JSP和servlet无效会话。在我的网站上,当一个人登出时登录登录页面,但点击返回按钮时,他可以访问上一页。我无法理解在哪里把session.invalidate()

并进一步在那里,当一个人退出打我应该使它无效,在login.jsp的或我的其他网页。

我的过滤器类: -

import java.io.IOException; 

import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 

import javax.servlet.annotation.WebFilter; 


public class LoginFilter implements Filter{ 


     @Override 
     public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
      HttpServletRequest request = (HttpServletRequest) req; 
      HttpServletResponse response = (HttpServletResponse) res; 




      HttpSession session = request.getSession(false); 

      if (session == null || session.getAttribute("currentSessionUser") == null) { 
       response.sendRedirect("Loginpage.jsp"); // No logged-in user found, so redirect to login page. 

       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); 
      } else { 
       chain.doFilter(req, res); // Logged-in user found, so just continue request. 
      } 
     } 

} 

在web.xml中我已经写了: -

<filter> 
     <filter-name>loginFilter</filter-name> 
     <filter-class>LoginFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>loginFilter</filter-name> 
     <url-pattern>/ARMS/*</url-pattern> 
    </filter-mapping> 

在我Loginpage.jsp我刚刚写

<% 
session.invalidate(); 
%> 

好吗?其次,我不清楚目录结构。我把它的屏幕截图.. enter image description hereenter image description here

我使用的Apache Tomcat 5.5服务器,所以我想我不应该把url-pattern的注释滤波器类吧?因为它只支持tomcat 7及以上版本。

+0

超出无效时登录会话('session.invalidate()')? –

+0

@BheshGurung - 我在登录页面写了session.invalidate。这是错的吗? “注销”是登录页面的超链接 – Dhruv

+0

看起来当用户点击“注销”链接时,您正在重定向到登录页面,并且在该页面中,您首先使会话无效并呈现登录表单。如果是这种情况,那么你的代码没有问题。问题在于您的页面正在被浏览器缓存,当用户单击后退按钮时,浏览器会显示该页面。要处理这个问题,请按照第一条评论中BalusC的链接发布。 –

回答

0

我使用servlet日志出局的唯一目的。当用户点击注销按钮,它引导他们到该页面,这反过来又检查活动的会话,如果它发现一个,来电session.invalidate(),然后将用户重定向回主页(或任何你想)。

HttpSession session = request.getSession(false); 

if(session != null){ 
    session.invalidate(); 
    RequestDispatcher rd = request.getRequestDispatcher("Loginpage.jsp"); 
    rd.forward(request, response); 
} else { 
    //There is no session. Redirect somewhere 
} 

这只是一个简单的例子。

+1

这是用户点击“注销”,但不是浏览器的后退按钮,纠正我,如果我错了。谢谢 – Dhruv