【问题标题】:How to invalidate the session in jsp如何使jsp中的会话无效
【发布时间】:2013-08-18 09:20:56
【问题描述】:

我正在使用 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>

【问题讨论】:

  • 你为什么使用scriptlet? stackoverflow.com/questions/3177733/…
  • 我正在使用自定义标签,这就是为什么..
  • 这不是在 JSP 中编写 session.lnvalidate() 的充分理由。编写一个专门的 servlet 来执行无效并简单地调用,在您的 JSP 中提供指向它的链接。如果您确实想确保用户在尝试登录之前已退出,请编写一个过滤器来执行此操作并将其连接到登录流程。

标签: jsp


【解决方案1】:

这取决于框架

代码

<%
session.invalidate();
%>

使会话无效,但“easy:myTag”有什么作用?

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

【讨论】:

  • 是的,我正在使用自定义标签,您将会话无效放在单独的页面中是什么意思?我在此页面上使用会话无效的原因是,每当用户进入此页面时,他每次都必须登录...请解释我应该做什么
  • 一般来说会话无效是有效的,但它取决于页面生命周期。首先,如果您使用的是 J2EE 身份验证服务,则不能直接调用登录页面,而是在单独的页面中执行注销,然后将用户重定向到主页。然后,容器检查用户,如果未通过身份验证,它会重定向到登录页面。这个生命周期在docs.oracle.com/javaee/6/tutorial/doc/glxce.html 中有描述
【解决方案2】:

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

在幕后,系统从 cookie 中提取用户 ID 或 附加 URL 数据,然后使用该 ID 作为键进入 之前创建的 HttpSession 对象。但这一切都完成了 对程序员透明:您只需调用 getSession。如果不 在传入的 cookie 或附加的 URL 信息中找到会话 ID, 系统创建一个新的空会话。而且,如果 cookie 正在 使用(默认情况),系统还创建一个传出 名为 JSESSIONID 的 cookie,具有表示会话的唯一值 ID。因此,尽管您在请求上调用 getSession,但该调用可以 影响反应。 因此,您可以致电 request.getSession 仅当设置 HTTP 响应合法时 headers:在发送任何文档内容之前(即刷新或 提交)给客户。

如本文件所述: 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,因此请确保 与其他开发人员协调使用注销命令 您的网站。

【讨论】:

    猜你喜欢
    • 2012-07-26
    • 2013-01-04
    • 2019-08-18
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 2014-11-26
    • 1970-01-01
    相关资源
    最近更新 更多