繁体   English   中英

为什么会话变量总是具有非null值?

[英]why does the session variable always have a non null value?

链接的href属性中包含“ LoginCheck”

//LoginCheck.java
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    HttpSession ses = request.getSession(false);

    //Redirects to LoginController.java if there is no session
    if(ses==null){
        RequestDispatcher rd = request.getRequestDispatcher("/LoginController");
        rd.forward(request, response);
    }else{
        PrintWriter out = response.getWriter();
        out.println("Logout to login again!");
    }
}

但是它始终显示“注销以再次登录!” 即使我先使会话无效?

两件事情

第一:如果可能,请始终将客户端重定向到/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,东西)。 如果您很懒惰,则可能有一个会话侦听器,只是有一个断点或显示堆栈以查看哪个组件创建了会话,如下所示。

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>

请记住,使会话无效不会使具有相同请求的会话对象为null! 没有。 客户端必须成功获取响应,通知客户端此后不要发送会话cookie(如果是cookie),因此当服务器并发工作时,您可能一次收到n个请求,所有请求均指示相同的会话。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM