会话验证过滤器,当会话过期时注销用户

2023-11-24

我有一个会话验证过滤器,可以在会话过期时注销用户。

这是一段代码,但这不起作用。不起作用意味着即使会话过期也不会重定向到登录页面。

请帮我解决这个问题。

public void doFilter(ServletRequest request, ServletResponse response, 
        FilterChain chain) throws IOException, ServletException {  
    HttpServletResponse res = (HttpServletResponse) response;  
    HttpServletRequest req = (HttpServletRequest) request;  

    HttpSession s = req.getSession(false);  

    if (s==null)
    {
        //redirect to login page with session expiry message   
    } else {  
        chain.doFilter(request, response);  
    }  
}

我有一个会话验证过滤器,可以在会话过期时注销用户。

老实说,这完全没有道理。如果您将登录用户存储为会话的属性,并根据会话中登录用户的存在来拦截“登录”状态,那么您根本不需要在以下情况下手动注销用户:会话已过期。当会话过期时,它的所有属性无论如何都会丢失,因此用户将“自动”注销。

以下是如何登录用户的示例doPost() of a servlet由登录表单的 POST 提交调用JSP.

String username = request.getParameter("username");
String password = request.getParameter("password");
User user = userService.find(username, password);

if (user != null) {
    request.getSession().setAttribute("user", user); // Login user.
    response.sendRedirect("userhome"); // Redirect to user home page.
} else {
    request.setAttribute("errormessage", "Unknown login, try again"); // Set error message.
    request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); // Redisplay login form.
}

您会看到,当登录有效时,用户将存储为会话属性。代码的剩余部分可以只检查它是否为空,以确定用户是否登录。每当会话过期时,它就会自动变为空。


即使会话过期,这也不会重定向到登录页面

我不知道你想做什么,因为最初的功能要求没有意义。然而,存在与会话过期和登录页面相关的两个常见功能需求。我猜你actually需要其中之一:

  1. “当访问者请求仅限登录用户访问的页面时,如何将访问者重定向到登录页面?”

    你需要创建一个filter并将其映射到受限制页面的(通用)URL 模式上。在过滤器中,只需检查用户是否存在于会话中,然后继续链,否则重定向到登录页面。

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        HttpSession session = request.getSession(false);
    
        if (session == null || session.getAttribute("user") == null) {
            response.sendRedirect("login"); // No logged-in user found, so redirect to login page.
        } else {
            chain.doFilter(req, res); // Logged-in user found, so just continue request.
        }
    }
    

  2. “如何在会话过期时自动将当前打开的页面重定向到登录页面?”

    Use the <meta>结合刷新HttpSession#getMaxInactiveInterval().

    <meta http-equiv="refresh" content="${pageContext.session.maxInactiveInterval};url=sessionexpired.jsp">
    

    这将自动将当前页面重定向到给定的url每当会话过期时。这${pageContext.session.maxInactiveInterval}表达式将内联会话过期时间(以秒为单位),这正是content属性需求。

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

会话验证过滤器,当会话过期时注销用户 的相关文章

随机推荐

  • Spark Dataframe 最大列数

    Spark Dataframe 的最大列数是多少 我尝试从数据框文档中获取它 但无法找到它 从体系结构的角度来看 它们是可扩展的 因此列数不应有任何限制 但它可能会导致节点上的负载不均匀 并可能影响转换的整体性能
  • Angular 4 - 取消订阅的最佳方式

    我很好奇如何取消所有订阅 我知道 takeWhile 和 takeUntil 我发现 takeUntil 对我来说更有用 据我了解 takeWhile 在我们获取数据后生效 然后取消订阅 直到组件被销毁 使用 takeUntil 和不使用它
  • 在 C# 中跨多个列表查找公共项的最快方法

    鉴于以下情况 List
  • 如何在 SQL Server 中将 float 转换为 varchar

    我有一个包含不同长度数字的浮点列 我正在尝试将它们转换为 varchar 有些值超过了 bigint 最大大小 所以我不能做这样的事情 cast cast float field as bigint as varchar 100 我尝试过使
  • 如何在 Mailgun HTTP API 中渲染 Rails 邮件程序视图

    我正在使用 Mailgun HTTP API 从 Rails 应用程序发送电子邮件 但我无法呈现邮件程序视图 这是我的邮件类 class MailgunMails lt ActionMailer Base def send complex
  • 如何固定文本区域的字符数宽度? (cols 属性不起作用)

    我想根据最大数量指定文本区域的宽度等宽字体他们应该能够在每一行中容纳的字符既没有多余的剩余空间 也没有溢出 有一些类似的问题 但一致的答案是使用cols属性 显然不起作用 如图所示这个jsFiddle 它的 HTML 是这样的
  • 如何使用 Spark 上下文访问 Web URL

    我尝试使用 textFile 方法从 Spark shell 中使用 WEB URL 但出现错误 也许这不是正确的方法 那么有人可以告诉我如何从 Spark 上下文访问 Web URL 我使用的是spark版本1 3 0 Scala 版本
  • 实体框架中的多个自引用关系

    我目前有一个名为EmployeeDetails如下所示 public class EmployeeDetails public int EmployeeDetailsId get set public string Name get set
  • 在 Java 中以 1000 个线程递增 AtomicInteger 不会生成值 1000 [重复]

    这个问题在这里已经有答案了 我正在执行一个java代码 其中我有一个AtomicInteger其中 1000 个线程正在尝试执行incrementAndGet 我预计最终值为 1000 但每次运行都会生成各种不同的值 代码如下 class
  • 如何在 JGit 中“git log --follow ”? (检索完整历史记录,包括重命名)

    我必须如何扩展以下 logCommand 才能获得 follow的选项git log命令工作 Git git new Git myRepository Iterable
  • 有关 asp.net mvc 上的 C# 和 bool 的帮助

    根据值打印 是 或 否 的最佳方法是什么 在我看来我想打印出来 模型 isStudent 我不想要 True 或 False 我想要 Yes 或 No 我必须写 if else 语句吗 编写一个辅助方法 public static clas
  • 更改嵌套记录中的属性值

    是否可以使用with关键字创建嵌套记录的新实例 其嵌套属性具有不同的值 两种情况 简单属性和集合 让我们看一个例子 class Program static void Main string args var company new Com
  • d3.js - 堆积条形图中的第 2 组数据值

    我有以下 csv 数据 date scanned unscanned compid sbu 01 2014 10 90 101 f r 02 2014 55 40 101 f r 03 2014 45 23 101 f r 04 2014
  • 太阳路径的计算

    我正在编写几种计算太阳穿过特定点的路径所需的方法 我使用两个不同的源编写代码进行计算 但都没有产生所需的结果 来源是 http www pveducation org pvcdrom properties of sunlight suns
  • Thymeleaf 使用 th:each 动态创建表单

    我想知道如何创建使用的表单th object对于循环中的每个对象th each 例如 我有以下代码 HTML
  • 异步回发不会导致 document.ready 被执行

    我必须对几个页面中使用的用户控件进行一些更改 用户控件包含一些 JQuery 来处理分页任务 显示 3 个月的数据并一次隐藏 9 个月 当控件加载时 它会自动显示当前季度并执行 document ready 中的这段代码 我遇到的问题是 在
  • 使用 OpenCV 进行模式识别

    我正在尝试检测绿色田野上的物体上的图案 该图案由三种颜色组成 两侧有两个粉色标记 中间有一个蓝色标记 排列得像交通灯一样 起初 我尝试将网络摄像头的图像转换为 HSV 色彩空间 并使用 cvInRangeS 隔离颜色 但随着白天房间内光线的
  • 如何选择活动模型序列化器关系所需的属性

    我正在使用JSONAPI格式随着主动模型序列化器创建一个 apiRails API 我有一个序列化器 它显示特定的post那有很多topics目前 在关系下列出了这些主题 目前它只列出了 id 和类型 我也想显示主题的标题 有人会说用inc
  • Android 应用程序发布后,如何向 SQLite 数据库添加新列?

    我想向 SQLite 数据库添加新列 但我已经在 Play 商店上发布了我的应用程序 因此 如果我编辑它 用户需要卸载并重新安装该应用程序 但我不想要那样 请帮忙 我是 Android 新手 1 增加 或简单地更改 您的数据库版本 2 这会
  • 会话验证过滤器,当会话过期时注销用户

    我有一个会话验证过滤器 可以在会话过期时注销用户 这是一段代码 但这不起作用 不起作用意味着即使会话过期也不会重定向到登录页面 请帮我解决这个问题 public void doFilter ServletRequest request Se