Logout Servlet中的会话无效
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中,我在doPost
和doGet
方法中编写了上面的代码。 注销后会显示登录屏幕然后如果我按下后退按钮会在注销前显示上一屏幕,然后如果我点击任何页面显示“HTTP状态500”,现在如果我按下F5则会加热登录Servlet并获得完全访问权限用户
如何停止此问题显示使用后退按钮和F5用户登录后无法使用任何页面?
你在做什么是好的。 浏览器正在缓存之前的页面,当您单击后退按钮时,它将转到上一个缓存页面。
您需要添加不允许浏览器缓存页面的缓存标头。
Cache-Control: no-cache
1)当您点击浏览器上的后退按钮时,由于浏览器缓存,您将获得上一页。
2)当您在备份后单击任何页面时,您将获得状态500,因为会话对象已经无效,因此存在空指针exception。
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);
如果此用户不存在会话,则会为您提供空值。
9)如果您没有在请求参数中获取用户名和密码以及request.getSession(false);
给你空值意味着用户试图在不登录的情况下访问你的应用程序,现在你可以愉快地显示禁止的页面。
在每个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 }
您需要做的是根据会话将会话设置为属性。
request.getSession().setAttribute("sess",request.getSession());
使用此选项将其与当前会话进行比较。 如果此比较失败,则重定向到登录页面。 这应该在每个页面中完成。
这将创建一个新会话
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 }