1

我正在使用 MVC 框架制作一个项目,其中我在多个页面上创建了会话,并且在每个页面上都有一个锚标记显示(注销),它将用户重定向到第一页(登录页面)。我想要做的是,当用户被重定向到登录页面时,它会检查是否已经存在现有会话,如果是,那么它会使会话无效并且用户必须再次登录。但是当我点击提交而不填写用户名/密码时,我的代码在会话无效后不起作用,它仍然采用旧值......请告诉我我哪里出错了?

         <jsp:useBean id="theBean" class="pack.java.MyModel"/>
        <jsp:setProperty name="theBean" property="name" param="userName"/>
         <jsp:setProperty name="theBean" property="pass" param="userPass"/>
         <%@ taglib uri="/WEB-INF/jsp2/taglib1.tld" prefix="easy" %>
         <html>
        <head>

        </head>
        <body >
        <form  method="post">
        <h1>Login please</h1>
        Enter username : <input type = text  name = userName  >
          </br>
        Enter password : <input type = password  name = userPass  >
       </br>
        <input type = submit name = submit value = submit>
        </br>
        <%

          HttpSession session=request.getSession(false);

        if(session!=null)
         {
          session.invalidate();
         }
          String btn = request.getParameter("submit");
         if(btn!=null)
      {
       %>

        <easy:myTag/>
       <% 

       }
       %>
    </form>
  </body>
</html>
4

2 回答 2

2

这取决于框架

编码

<%
session.invalidate();
%>

使会话无效,但“easy:myTag”是做什么的?

将会话无效放在单独的页面中;如果它有效,您必须调查自定义标签 myTag。

于 2013-08-18T09:28:29.587 回答
0

您的问题是您在响应标头之后调用了无效方式。一旦将 jsp 转换为 servlet,html 代码就位于这些命令行之前。试着把它放在<hmtl>标签之前。

在幕后,系统从 cookie 或附加的 URL 数据中提取用户 ID,然后将该 ID 用作先前创建的 HttpSession 对象表的键。但这对程序员来说都是透明的:你只需调用 getSession。如果在传入的 cookie 或附加的 URL 信息中未找到会话 ID,系统将创建一个新的空会话。而且,如果正在使用 cookie(默认情况),系统还会创建一个名为 JSESSIONID 的传出 cookie,其唯一值表示会话 ID。因此,尽管您在请求上调用 getSession,但该调用会影响响应。因此,只有在设置 HTTP 响应标头是合法的情况下才允许您调用 request.getSession:在任何文档内容已发送(即刷新或提交)到客户端之前。

如本文件所述: http ://www.java-programming.info/tutorial/pdf/csajsp2/08-Session-Tracking.pdf

从这个网站: http ://courses.coreservlets.com/Course-Materials/csajsp2.html

有关更多一般信息:

丢弃会话数据

处理完用户的会话数据后,您有三个选项。

• 仅删除您的servlet 创建的数据。您可以调用 removeAttribute("key") 丢弃与指定键关联的值。这是最常见的方法。

• 删除整个会话(在当前 Web 应用程序中)。您可以调用 invalidate 来丢弃整个会话。请记住,这样做会导致该用户的所有会话数据丢失,而不仅仅是您的 servlet 或 JSP 页面创建的会话数据。因此,Web 应用程序中的所有 servlet 和 JSP 页面必须就可能调用 invalidate 的情况达成一致。

• 注销用户并删除属于他或她的所有会话。最后,在支持 servlet 2.4 和 JSP 2.0 的服务器中,您可以调用 logout 将客户端从 Web 服务器中注销,并使与该用户关联的所有会话(每个 Web 应用程序最多一个)无效。同样,由于此操作会影响您自己以外的 servlet,因此请务必与您站点上的其他开发人员协调使用 logout 命令。

于 2014-07-09T23:16:46.703 回答