注销 Servlet 中的会话无效

2022-09-04 23:38:05
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);
}

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

如何阻止这个问题显示注销后使用后退按钮和用户不能使用任何页面?F5


答案 1

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

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

Cache-Control: no-cache

答案 2

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

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

3)当您刷新新请求时,将新请求发送到您的 servlet 或 JSP,那里有您的调用方法,它正在为您创建新的会话对象。request.getSession();

因此,您可以再次获得对所有页面的完全访问权限。

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

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

2)对于上面的 servlet 给出 url 模式 /*

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) 如果此用户不存在会话,则将为您提供 null 值。request.getSession(false);

9)如果您在请求参数中未获得用户名和密码,并且为您提供空值意味着用户正在尝试在不登录的情况下访问您的应用程序,那么现在您可以愉快地显示禁止的页面。request.getSession(false);