在Logout Servlet中使会话无效

时间:2013-03-25 11:10:47

标签: java jsp servlets

HttpSession session  = request.getSession();
try
{      
    session.removeAttribute("logonSessData");
    session.invalidate();                               
    String pageToForward = request.getContextPath();
    response.sendRedirect(pageToForward);           
}
catch (Exception sqle)
{
    System.out.println("error UserValidateServlet message : " + sqle.getMessage());
    System.out.println("error UserValidateServlet exception : " + sqle);
}
在Logout servlet中的

我在doPostdoGet方法中编写了上面的代码。注销后会显示登录屏幕然后如果按下后退按钮会在注销前显示上一屏幕,然后如果我点击任何页面显示“HTTP状态500”,现在如果我按 F5 则会加热登录Servlet并获得用户的完全访问权限。

如何停止此问题显示使用后退按钮和 F5 用户登录后无法使用任何页面?

5 个答案:

答案 0 :(得分:5)

你在做什么是好事。浏览器正在缓存之前的页面,当您单击后退按钮时,它将转到上一个缓存页面。

您需要添加不允许浏览器缓存页面的缓存标头。

Cache-Control: no-cache

答案 1 :(得分:1)

1)当您点击浏览器上的后退按钮时,由于浏览器缓存,您将获得上一页。

2)当您在支持后点击任何页面时,您将获得状态500,因为会话对象已经无效,因此存在空指针异常。

3)当您刷新新请求转到您的servlet或JSP时,您正在调用request.getSession();方法,即为您创建新的会话对象。

因此您可以再次访问所有页面。

要避免此问题,您可以按照以下步骤操作。

1)在应用程序中创建一个servlet Ex:LoginCheckerServlet

2)为上面的servlet提供url pattern / *

3)因此将为所有请求执行servlet

4)现在在LoginCheckerServlet检查请求参数中的用户名和密码

5)如果他们要进行登录检查操作并显示欢迎页面

6)如果没有出现用户名密码,则有两种含义

     i)user is already logged in 

    ii)user is trying to access your app illegally

7)现在调用request.getSession(false);方法,它将为您提供会话对象,因为此用户已存在会话,因此您可以重定向到对用户信任的欢迎页面。

8)如果此用户没有会话,request.getSession(false);将为您提供空值。

9)如果你没有在请求参数中获得用户名和密码,以及request.getSession(false);给你空值意味着用户试图在不登录的情况下访问你的应用程序,现在你可以愉快地显示禁止的页面

答案 2 :(得分:-1)

在每个servlet中,检查Session是否为null。如果session不为null,则只执行请求处理,否则重定向到登录页面。

HttpSession session  = request.getSession();

if(Session !=null)
{
try
{      
    // acutal servlet actions

}else
{

  // redirect to login page

 }

如果你在上面的代码中为session添加null check也会很好。

HttpSession session  = request.getSession();
if(session !=null)
try
{      
    session.removeAttribute("logonSessData");
    session.invalidate();                               
    String pageToForward = request.getContextPath();
    response.sendRedirect(pageToForward);           }
catch (Exception sqle)
{
    System.out.println("error UserValidateServlet message : " + sqle.getMessage());
    System.out.println("error UserValidateServlet exception : " + sqle);
}
}else
{
  //session already null/ expired
}

答案 3 :(得分:-3)

您需要做的是根据会话将会话设置为属性。

request.getSession().setAttribute("sess",request.getSession());

使用此选项将其与当前会话进行比较。如果此比较失败,则重定向到登录页面。这应该在每个页面中完成。

答案 4 :(得分:-3)

这将创建一个新会话

HttpSession ss = request.getSession(true); //creates a new session.
  if(ss.isNew()){
    ss.invalidate();  //this clears the session
    ss = request.getSession(true); // creates a new session 
    }