JSP Servlet 会话 invalidate() 不会使会话为空

2023-12-14

我的 JSP 项目中有三个简单的 Http Servlet 类:“LoginServlet”、“Logout Servlet”和“Profile Servlet”。

  • LoginServlet:通过为会话设置“name”属性来登录用户
  • LogoutServlet:注销用户并使会话无效
  • ProfileServlet:如果用户已登录,则显示用户欢迎信息

最后两个 servlet 如下,我认为是有问题的。

@SuppressWarnings("serial")
public class LogoutServlet extends HttpServlet {
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html");
            PrintWriter out=response.getWriter();

            HttpSession session=request.getSession(false);
            session.invalidate();

            request.getRequestDispatcher("link.jsp").include(request, response);

            out.print("You are successfully logged out!");

            out.close();
    }
}

And

@SuppressWarnings("serial")
public class ProfileServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        request.getRequestDispatcher("link.jsp").include(request, response);

        HttpSession session = request.getSession(false);
        if (session != null) {
            String name = (String) session.getAttribute("name");

            out.print("Hello, " + name + " Welcome to Profile");
        } else {
            out.print("Please login first");
            request.getRequestDispatcher("login.html").include(request,
                    response);
        }
        out.close();
    }
}

和 link.jsp:

<% HttpSession nsession = request.getSession(false);
if(nsession == null) {
%>
<a href="login.html">Login</a>
<%
}
else {
%>
<a href="LogoutServlet">Logout</a>
<%
}
%>
<a href="ProfileServlet">Profile</a>
<hr/>

问题是当用户登录时,当单击“Logout”链接并调用“LogoutServlet”时,会话未正确失效并且 ProfileServlet 仍然打印出来

"Hello, null Welcome to Profile"

而不是重定向到“login.html”页面,因为会话仍然不为空。因此,“link.jsp”页面上不会显示“Login”链接。这会阻止用户再次尝试登录。

EDIT:为了澄清问题,我制作了一个新的 html 页面并更新了 servlet 来执行以下操作

request.getRequestDispatcher("link.html").include(request, response);

还有“link.html”。

<a href="login.html">Login</a>
<a href="LogoutServlet">Logout</a>
<a href="ProfileServlet">Profile</a>
<hr/>

有趣的是,这正是我想要的!我想问题是

request.getRequestDispatcher("link.jsp").include(request, response);

但我无法解释为什么......


在 JSP 中,默认情况下会创建新会话(如果不存在),因此您将始终获得非空会话。您可以通过将以下页面指令添加到您的页面来禁用它:

<%@ page session="false" %>

欲了解更多信息,请检查以下内容为什么要设置 JSP 页面 session = “false” 指令?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSP Servlet 会话 invalidate() 不会使会话为空 的相关文章

随机推荐

  • Angular 中 angular.copy 的替代品是什么

    如何在 Angular 中复制对象并丢失其引用 有了 AngularJS 我可以使用angular copy object 但我在 Angular 中使用它时遇到一些错误 异常 参考错误 angular没有定义 假设你使用的是 ES6 你可
  • Android:可点击 TextView 中的 ClickableSpan

    我有一个可以包含可点击链接的文本视图 当单击其中一个链接时 我想开始一项活动 这工作正常 但也应该可以单击整个文本视图并启动另一个活动 这就是我当前的解决方案 TextView tv TextView findViewById R id t
  • 使用单击时中断停止 for 循环

    我有一个从 1 到 20 的简单循环 我想做的是通过单击按钮来停止循环 我所做的是 我设置了一个条件 即单击按钮后变量的值stop将更改为 1 这将触发break 但值没有改变 var stop 0 for let i 1 i lt 20
  • Homestead 上 Netbeans 中 Laravel Dusk 的 Xdebug

    在 Laravel Homestead 中 我已经能够使用 Xdebug 进行单元测试 功能测试 浏览器浏览等 但当我尝试使用 Xdebug for Dusk 时 它会挂起 在测试 浏览器文件夹中进行测试 我认为这些问题可能会有所帮助 但我
  • WPF 图像平移约束

    我试图找出如何限制平移 使图像完全保持在其包含边框的范围内 任何这方面的帮助将不胜感激 谢谢
  • 将 UIImage 转换为 Keras 模型的 MLMultiArray

    在 Python 中 我使用 keras 训练了一个图像分类模型 以接收 224 224 3 数组形式的输入并输出预测 1 或 0 当我加载保存模型并将其加载到 xcode 中时 它指出输入必须采用 MLMultiArray 格式 有没有办
  • 不可能向外界隐藏模板的实现(为了保护知识产权)。我对吗?

    我已阅读为什么模板只能在头文件中实现 and 为什么我不能将模板类的定义与其声明分开并将其放入 cpp 文件中 如果我创建模板 那么我还将提供对其的访问权限cpp 文件附加到他们的h files 或者直接将定义写入头文件中 因此 如果我想允
  • 无法更改图例符号 nvd3 气泡图

    在我的 nvd3 气泡图中 每组点都有不同的符号 但图例全部为圆圈 代码是here 我只遇到过这个 showLegend false 它可以隐藏或显示图例 我无法理解如何更改图例中的符号 nvd3 不允许您直接访问图例的内部结构 但是 您可
  • 如何在纵向应用程序中录制横向视频? (斯威夫特 2、iPhone)

    我需要在我的纵向 iPhone 应用程序中录制横向视频 是否可能 或者是否受到任何硬件限制的阻止 使用 AVCaptureVideoPreviewLayer 我能够更改预览方向 但视频仍然以纵向录制 欢迎任何想法 您应该能够将视频录制的方向
  • 如何将 cmake 与 boost asio 结合使用?

    我不明白boost asio在我的 C 程序中使用 cmake 我实际上已经尝试和谷歌搜索了很多小时 但我无法让它工作 我想包括boost asio在我的 Ubuntu 18 04 下的 c 项目中 带有一个 cmake 文件 所以我安装了
  • 如何从 Eclipse 为 javaCV 或 openCV 项目制作可运行的 jar

    我在 eclipse 中有一个 openCV 项目 现在 我试图使其可运行 Jar 但一旦尝试运行该 Jar 就无法启动它 我尝试遵循 https groups google com forum topic javacv ziqKIb7Pg
  • 如何在servlet中通过ajax获取数据?

    我想将页面上的一些数据发送到servlet 所以我写了下面的jquery来做到这一点 我用所有数据构建一个json字符串 并直接将其发送到servlet 但我不知道如何从servlet中的ajax获取全部数据 save click func
  • 优化 Sql Reporting Services 2005 中大报表的 PDF 导出

    首先 我知道运行非常大 长时间运行的报告是一个可怕的想法 我知道 Microsoft 有一条经验法则 规定 SSRS 报告的执行时间不应超过 30 秒 然而 有时 由于遵守州法律等外部力量 巨额报告是首选的祸害 在我的工作地点 我们有一个
  • Perl从命令行执行的问题

    上周我在 WinXP 上用 Strawberry Perl 替换了 ActivePerl 我发现我必须使用以下命令运行我的 Perl 脚本perl myperl pl 否则我只需要运行myperl pl在安装草莓之前 我怎么只能跑myper
  • Python:尝试使用请求发布表单

    我正在尝试使用 Python 和请求库登录网站进行一些抓取 我正在尝试以下操作 这不起作用 import requests headers User Agent Mozilla 5 0 payload username niceuserna
  • Django Forms 模板设计类

    Django Forms 框架非常出色 只需通过以下内容即可呈现整个表单 form as p 对于注册表 将上面的内容转换为 p p
  • 如何使用openjson递归解析JSON字符串

    我有以下 JSON 数据 set json N Book IssueDate 02 15 2019 Detail Type Any Type Author Name Annie Sex Female Chapter Section 1 1
  • 具有可变数量子视图的动态 UITableViewCell 高度

    我有一个UITableViewCell使用从远程源检索的数据动态填充 它具有基于单元格中表示的项目类型的可变数量的子视图 我通过使用动态计算单元格内容的大小NSMutableAttributedString和boundingRectWith
  • 无法从tomcat中自定义类加载器加载的类获取注释

    鉴于班级org popper example pages Login Page name Login public interface Login 出口到c pos example jar和以下 servlet public class P
  • JSP Servlet 会话 invalidate() 不会使会话为空

    我的 JSP 项目中有三个简单的 Http Servlet 类 LoginServlet Logout Servlet 和 Profile Servlet LoginServlet 通过为会话设置 name 属性来登录用户 LogoutSe