13
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);
}

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

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

4

5 回答 5

5

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

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

Cache-Control: no-cache
于 2013-03-25T11:18:30.173 回答
1

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

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

于 2014-06-10T11:24:25.603 回答
0

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

HttpSession session  = request.getSession();

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

}else
{

  // redirect to login page

 }

如果您在上面的代码中为会话添加空检查,那也很好。

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
}
于 2013-03-25T11:24:46.033 回答
-3

您需要做的是将会话设置为基于会话的属性。

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

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

于 2013-03-25T11:16:36.303 回答
-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 
    }
于 2014-06-13T12:28:36.033 回答