链接有" LoginCheck"在href属性
permission
{ [Function] here: [Function] }
但是它始终显示"注销再次登录!"即使我先使会话无效??
答案 0 :(得分:0)
两件事
首先:如果可能的话,总是希望将客户端重定向到目标页面/LoginController
,而不是发送请求。
因为某些容器如tomcat有一些错误导致目标页面将作为ASCII数据响应(只是尝试打印一些utf-8数据并看到它)。
除了这种技术之外,你的业务和代码也会变得复杂,如果你问我,就很难维护。
第二:我建议您不要按nullify
状态验证会话,因为如果您在其他地方创建会话,此页面会将客户端视为已记录的人员,因此您最好将某个属性设置为会话,也许是这样的:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
HttpSession ses=request.getSession();//let it be always created for this
boolean logged=ses.getAttribute("logged")==Boolean.TRUE;
//Redirects to LoginController.java if there is no session
if(logged){
response.sendRedirect("/login-controller");
return;//you cannot do anything with the request/response once it's redirected or forwarded.
}else{
PrintWriter out = response.getWriter();
out.print("Logout to login again!");
}
}
稍后使用登录表单将logged
属性设置为true
,表示用户已成功登录。
回到你的问题:
如果您坚持调试现有代码,则需要检查客户端可能调用的所有可能创建会话的路径(servlet,stuffs)。如果你很懒,你可能有一个会话监听器,只是有一个断点或显示堆栈,看看哪个组件创建会话,如下所示。
public class session_listener implements HttpSessionListener,ServletContextListener {
public session_listener() {}
@Override public void sessionCreated(HttpSessionEvent se) {
//have a break-point and check stack to see who just created the session
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
//have a break-point and check stack to see who just destroyed the session
}
@Override public void contextInitialized(ServletContextEvent sce){}
@Override public void contextDestroyed(ServletContextEvent sce) {}
}
简单地在web.xml
<web-app ... >
...
<listener>
<listener-class>arpit.tomar.session_listener</listener-class>
</listener>
...
</web-app>
请记住,会话无效并不会使会话对象因同一请求而变为空!没有。响应必须已成功获取客户端,这会通知客户端在此之后不发送会话cookie(如果它是cookie),因此当您的服务器并发工作时,您可能会同时收到n个请求,这些请求都表示同一个会话