【JavaWeb】用监听器实现单一登录

Java实现单点登录(SSO)详解 单点登录(Single Sign-On,简称SSO)是目前比较流行的企业业务整合的解决方案之一,它的主要功能是:在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。单点登录的实现机制是:当用户第一次访问应用系统1的时候,因为还没有登录,所以会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行验证,如果通过验证,则应该返回给用户一个认证的凭据——ticket; 阅读详情

导读:监听器用来监视ServletContext/Session/Request的创建、初始化、销毁以及其中的属性变动。


监听器的分类

常见的主要有以下6个,分别处理Servlet全局、Session和Request。

  • ServletContextListener
  • ServletContextAttributeListener
  • HttpSessionListener
  • HttpSessionAttributeListener
  • ServletRequestListener
  • ServletRequestAttributeListenser

监听器的作用

由于每当一个用户访问一个网站都会产生一个会话或是一个请求,所以可以使用监听器来监视这些会话和请求,能够用于

  • 统计在线人数
  • 统计访问量
  • 应用启动时信息初始化
  • 与Spring结合

监听器的实现

根据需要实现上述的六种接口,对象监听器实现Init和Destroy方法,属性监听器实现Add/Remove/Replace方法。然后在web.xml中对监听器进行配置,相比于Servlet和Filter,监听器的配置更为简单。

ServletContextListener举例

public class MyServletContextListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        String appName=sce.getServletContext().getInitParameter("app_name");
        String version=sce.getServletContext().getInitParameter("version");
        sce.getServletContext().setAttribute("app_name",appName);
        sce.getServletContext().setAttribute("version",version);
        System.out.println("Init:"+appName+"  "+version);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        String appName=(String)sce.getServletContext().getAttribute("app_name");
        String version=(String)sce.getServletContext().getAttribute("version");
        System.out.println("Destroy:"+appName+"  "+version);
    }
}

在web.xml中进行配置,设置全局属性,用于获取。

<context-param>
    <param-name>app_name</param-name>
    <param-value>Listener Web</param-value>
</context-param>
<context-param>
    <param-name>version</param-name>
    <param-value>1.0</param-value>
</context-param>

<listener>
    <listener-class>listener.MyServletContextListener</listener-class>
</listener>

这样,一旦WEB应用一启动,监听器就能够监视ServletContext对象的创建和销毁,控制台就会输出"Init:Listener 1.0",关闭WEB应用,就会输出"Destroy:Listener   1.0"。

对于Session和Request也类似,只要一创建新的Session和Request,就会被监听器所捕获到,执行操作。

ServletContextAttributeListener举例

属性监视器用来监视属性的添加、变换和移除。新建一个全局属性监听器。

public class MyServletContextAttrListener implements ServletContextAttributeListener {
    @Override
    public void attributeAdded(ServletContextAttributeEvent scae) {
        System.out.println(scae.getName()+scae.getValue());
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent scae) {
        System.out.println(scae.getName()+scae.getValue());
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent scae) {
        System.out.println(scae.getName()+scae.getValue());
    }
}

新建一个jsp,用于添加全局属性:

<%
    application.setAttribute("servletContextPar","servlet");
%>

访问这个jsp,由于执行了添加属性的操作,所以会在后台输出属性名和属性值。

其它属性监听器类似。


监听器实现单一登录

类似QQ这种软件,当用户在别处登录时,本地登录将会被“挤掉”,可以用监听器来实现。下面的案例,使用HttpSessionAttributeListener来实现这个功能。

登录:

index首页有一个表单,用于提交用户名和密码,然后发送请求参数到login.jsp。在login.jsp中,将传过来的用户名存放在名为loginUser的session属性中,接着重定向到主页main.jsp。

<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<%
    String username=request.getParameter("username");
    session.setAttribute("loginUser",username);
    response.sendRedirect(request.getContextPath()+"/main.jsp");
%>

main.jsp中,需要获取重定向过来的username,并在页面上显示:

                                           

<%
    String user = (String)session.getAttribute("loginUser");
%>

<ul class="navig">
    <li><a href="index.html" class="scroll"><%=user  %></a><span>|</span></li>
    <li><a href="index.html" class="scroll">HOME</a><span>|</span></li>
    <li><a href="#portfolio" class="scroll">PORTFOLIO</a><span>|</span></li>
    <li><a href="#contact" class="scroll">CONTACT</a></li>
</ul>

过滤器拦截:

如果用户未经登录,就想访问main.jsp,会被拒绝,重新定向到登录页面,并附带一条错误信息,这就需要创建一个Filter来处理。

public class SessionFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest hrequest=(HttpServletRequest)request;
        HttpServletResponse hresponse=(HttpServletResponse)response;
        //获取session中的loginUser
        String loginUser=(String)hrequest.getSession().getAttribute("loginUser");
        if(loginUser==null){
            //如果为空,则表示用户没有登录,返回到index.jsp并附带消息
            hresponse.sendRedirect(hrequest.getContextPath()+"/index.jsp?flag=1");
        }else{
            chain.doFilter(request,response);
        }
    }
}

在index.jsp登录页面中,先获取过滤器传过来的flag参数,再显示警告。

<%
  String flag=request.getParameter("flag");
%>

<script type="text/javascript">
    var flag='<%=flag%>'
    if(flag=="1"){
        alert("尚未登录或在异地登录,请重新登录!")
      }
</script>

单例类构建:

由于只允许一个用户登录,需要一个单例类来封装这个用户。这个单例类用来映射用户名-SessionId,SessionId-Session的关系。由于3.0以上的Servlet不能由sessionId获取到session,所以需要直接写一个由sessionId获取session的方法。

还有一点,为什么不直接使用用户名去映射session,而是要通过sessionId来中转一下。这是因为同一个浏览器的同一个用户,如果退出了浏览器,此时session还在,当这个用户再访问网站时,会建立一个新的session,释放旧的session,浪费资源。如果通过用户名-sessionId,得知当前浏览器当前用户又一次登录了,直接用这个用户名之前的sessionId获取之前的session就行了,避免了资源浪费。

public class LoginCache {
    //单例类要点
    private static LoginCache instance=new LoginCache();
    private LoginCache(){}
    public static LoginCache getInstance(){ return instance; }
    
    //用户名跟sessionId映射
    private Map<String,String>loginUserSession=new HashMap<>();
    //sessionId和session的映射
    private Map<String, HttpSession>loginSession=new HashMap<>();

    public String getSessionIdByUsername(String username){
        return loginUserSession.get(username);
    }
    public HttpSession getSessionBySessionId(String sessionId){
        return loginSession.get(sessionId);
    }

    public void setSessionIdByUserName(String username,String sessionId){
        loginUserSession.put(username,sessionId);
    }
    public void setSessionBySessionId(String sessionId,HttpSession session){
        loginSession.put(sessionId,session);
    }
}

监听器构建:

public class LoginSessionListener implements HttpSessionAttributeListener {
    private static final String LOGIN_USER="loginUser";
    @Override
    public void attributeAdded(HttpSessionBindingEvent hsbe) {
        //获取新添加的属性名
        String attrName=hsbe.getName();
        //如果=loginUser,就表示有新用户登录了
        if(LOGIN_USER.equals(attrName)){
            //获得新登录的用户名
            String attrVal=(String)hsbe.getValue();
            //获得当前会话(新登录)的Session对象
            HttpSession session=hsbe.getSession();
            //获得SessionId
            String sessionId=session.getId();
            //在LoginCache中查找新登录的用户名是否存在
            String sessionId2=LoginCache.getInstance().getSessionIdByUsername(attrVal);
            if(sessionId2==null){
            }
            //如果存在
            else{
                //就获取之前用户的SessionId2,并将其释放
                HttpSession session2=LoginCache.getInstance().getSessionBySessionId(sessionId2);
                session2.invalidate();
            }
            //添加刚才登录的Session作为已存在的Session
            LoginCache.getInstance().setSessionIdByUserName(attrVal,sessionId);
            LoginCache.getInstance().setSessionBySessionId(sessionId,session);
        }
    }
}

这样,当从别的浏览器登录时,刷新当前浏览器,就会被挤掉。

java单用户登录实现(详细代码) 单用户登录的实现比较简单,只要在session上动动手脚就行了 单用户登录有两种实现方式 1)当前用户登录验证成功时,如果该用户的账号已经登录,则挤掉已登录的账号,由该用户登录 2)当前用户登录验证成功时,如果该用户的账号已经登录,则提示当前用户该账号已登录,并且不允许当前用户登录 阅读详情

相关推荐

Java实现单点登录的实战指南

上述代码仅为SSO实现中的一个非常简单的例子,实际应用中SSO系统要复杂得多,涉及前后端分离、不同客户端认证授权等复杂场景。在接下来的章节中,我们将进一步深入探讨SSO的原理、不同技术框架的实现方式,以及安全性实践等内容。通过对这些概念的深入理解,开发者可以构建出健壮、安全且易于使用的单点登录系统。单点登录(Single Sign-On,简称SSO)是一种用户登录管理技术,它允许用户在多个应用系统中仅使用一套登录凭证(例如用户名和密码)就可以访问所有相互信任的应用系统。

weixin_42466723的博客 1006

JSP+Servlet + Tomcat实现用户登录(五)使用listener实现在线(游客)人数统计【JavaWeb、无数据库】

但是,其实这样对在线人数的监听是不精准的,因为我们打开不同的页面登录不同的账号也会算作一个不同的人,准确来说监听的是。我是通过内置tomcat运行的,默认的配置就是idea会代替我们打开浏览器。会对所有请求进行监听,但是无法区分用户,因此无法做到对在线人数的监听。若需要精细的对真实的用户进行监听登录,则可能需要创建多个用户进行实现。我们需要在servlet服务器开启后,对变量进行赋值初始化。我们需要在servlet创建时,将在线人数的变量设置进入。进行监听,无法做到对用户的监听。对接口中的方法进行实现。

qq_22841387的博客 1927

Java用户登录的实现

Java用户登录的实现

通过监听器实现单点登录

本文实现单点登录, 1个账号只能在1个地方登录。例如:某账号在A地区登录之后, B地区如果登录了此账号,A地区就被强制下线。

toward_bob的专栏 1904

Java web实现账号单一登录,防止同一账号重复登录(踢人效果)

主要介绍了Java web实现账号单一登录,防止同一账号重复登录,有点类似于qq登录踢人效果,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

SikuliX实战:5分钟搞定游戏挂机脚本(附防检测思路与Python集成技巧)

本文详细介绍了如何使用SikuliX快速开发游戏挂机脚本,包括环境配置、基础原理、防检测策略及Python集成技巧。通过实战案例展示如何实现自动化任务、高级防检测方案,并结合Python提升脚本性能与智能度,帮助玩家高效完成重复性游戏操作。

weixin_33228769的博客 333

事件监听器--监听同一个用户重复登陆

事件监听器 一;监听同一个用户重复登陆    下面以一个用户登陆列;来讲解sessiong监听器的原理和用法 1,  创建一个容器来封装登陆用户的信息,代码如下: package org.luojs.lister; import java.util.ArrayList; import java.util.List; import com.luojs.struts.form.UserF...

老罗技术专栏 296

HyperLPR3车牌识别-Android-SDK光速部署与使用

基于深度学习高性能中文车牌识别 High Performance Chinese License Plate Recognition Framework.快速部署AndroidSDK

tunm 6117

Java web过滤器实现账号单一登录,防止同一账号重复登录,踢人效果

实现了Java web开发账号单一登录的功能,防止同一账号重复登录,后面登录的踢掉前面登录的,使用过滤器Filter实现的。可以先下载项目下来测试下效果。 有博客写的是没个一段时间(比如500ms)读取后台的session,这种方法除了会占用资源,还会出现访问session(请求1)的返回值和自己提交请求(请求2)的返回值发生冲突。比如请求1先提交,此时请求1的返回值还未返回到前端,请求2提交,实际上我们想要的是请求1的返回值先返回,然后再...

qq_34826261的博客 2492

单细胞测序避坑指南:为什么你的免疫组库数据总出问题?5‘转录组7个关键细节

本文深度解析了5'端单细胞测序技术在免疫组库研究中的应用与常见问题。文章从5'端建库的分子机制入手,重点剖析了其在捕获TCR/BCR序列上的独特优势,并系统梳理了从样本处理、文库构建到数据质控全流程中7个最易出错的细节,为研究者提供了一份实用的避坑指南,旨在帮助提升免疫组库数据的质量和可靠性。

weixin_29208327的博客 482

OpenAI Codex 科研实战:从文献整理到论文初稿的自动化流水线

在科研工作中,大量时间消耗在文献整理、数据清洗、结果反复排版等重复性任务上,而非真正的思考与创新。AI 编程代理作为一种能理解自然语言指令并直接操作文件、执行脚本的命令行工具,正逐渐改变科研工作流的组织方式。它基于云端大模型推理,本地无需 GPU,通过解析用户意图,自动完成代码生成、文件批量处理与任务拆解,将传统需要手动操作的工程过程转化为可验证、可追溯的指令执行。这类工具在学术场景中的价值尤为突出:科研人员可以将文献总结、数据预处理、统计分析与可视化出图交给代理完成,从而把精力聚焦在研究问题本身。Open

weixin_34318326的博客 458

JavaWeb---Servlet监听器实现单一登陆

1.  监听器实现单一登录 对session有过一点了解的人员应该都知道,在java中session的默认的销毁时间是大于或等于30分钟,如果你对session的生命周期不做任何配置的话,按照上面的设想,那么只要用户登陆上之后,这时该用户的状态设置为1,在大于30分钟的时间内如果该用户没有向服务器端发起任何请求的话,那么这个session就会被销毁掉,注意了,这时session生命周期结束以后

Cyn3465的专栏 2084

ABtest描述统计功效

我们在面试数据分析时,常常会问到如何确定样本量的问题,会有一个指标:统计功效(power),或者是1-β 统计功效会影响实验的可信度,甚至会影响实验所需的样本量,要了解统计功效,首先要理解两类统计错误 假如我们做了一个AB实验,且两组用户的数据均值为μ1和μ2,我们会有两个初始假设: H0:两个实验组的数据没有差别(μ1=μ2),这个假设也叫“零假设”,也叫原假设 H1:两个实验组之间的数据存在差别(μ1≠μ2),这个假设也叫“非零假设”,也叫备择假设 定义两类错误: 实验本身没有效应,但我们觉

qq_38134556的博客 896

SpringBoot项目使用监听器实现对在线用户的管理

主要分为两部分,一部分是监听在线用户,我用的是HttpSessionBindingListener来实现,另一个是根据SessionId实现对不同用户的下线管理. 参考资料: https://www.cnblogs.com/siv8/p/5904105.html https://blog.youkuaiyun.com/sihai12345/article/details/81098765 ...

KimiKudo的博客 4888

EGO_Planner代码学习(三):px4ctrl代码流程

上节阅读了EGO_Planner的轨迹服务器部分的代码,其实质是将规划器生成的轨迹进行离散化,间隔10ms计算当前时刻在轨迹上的位置,并发送到话题上。这两天抽空看了下控制器部分的代码,在l这个软件包里,它的功能是进行px4的模式识别和上层控制,通过线性控制器把发布过来的位置命令解算成飞控的控制量,通过mavros发送给px4。下面就详细看一下它的启动过程。

qq_41069236的博客 6805

iOS WKWebView H5微信支付跳转

iOS WKWebView H5微信支付跳转 需求:iOS客户端实现嵌入H5进行微信支付跳转到微信客户端,支付完成后再跳转回我们的APP,解决WKWebView无法跳转回APP的BUG. 阅读前提: 了解WKWebView基本初始化及使用 了解如何利用URL Schemes进行应用间跳转 公司或个人已经在微信后台注册了一级域名 GitHub地址(附代码) :iOS WKWebView H5微信支付跳转 简书地址 :iOS WKWebView H5微信支付跳转 博客地址 :iOS WKWe...

ForeverMyheart的博客 2046

【Vue3实践】(二)Vue3开发基础:响应式变量、双向绑定、计算属性、监听器

本篇主要是讲了VUE开发中经常会使用到的响应式变量、双向绑定的使用方式,并举例说明了计算属性和监听器之间的使用差别及各自的作用,有了本篇的基础,已经可以使用VUE做一些简单的开发了。 需要注意这么几个细节: - 响应式与双向绑定的联系与区别,`v-model`的作用 - 计算属性的使用限制,生成的快照属性不能别其他功能修改 - 监听器`watch`与`watchEffect`的区别,`watchEffect`与`computed`的区别 - 监听器监听数据源为对象时需要注意两个问题:**深层监听**、`n

积木成林,聚沙成塔 3616

YOLO26升级:CVPR2026 WDAM小波方向注意力+C2PSA,频域高频引导低频暗区复原,小目标检测精度跃升!

将 WDAM 引入 YOLO 的 C2PSA 模块,核心优势在于用极低的计算开销,为模型装上了一个“结构感知”的增强器,尤其适合处理密集小目标与边缘部署场景。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 367

JavaWeb 23 监听器 && 权限验证实现拦截

7.3 监听器 GUI 的时候 就讲过 监听器,而且 大量的在 应用。 什么叫 监听器呢,我们的 try catch 其实就有监听的成分,监听 一段代码 是否 出现了异常,然后再去 进行 处理。那么 监听 就是 观察 整个 过程是否 出现 某一特定条件。 比如说:当 按钮 点击时、当窗口创建时、等等,这都是 整个过程中 出现的 某一特定条件。 Web 也有 所谓的监听,我们 如果想要监听,就需要去 实现 监听器的接口。 实现 Session 创建和销毁的监听 package com.muquanyu.

小哞^同^学的技术博客 259

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

JavaWeb监听器简单介绍及一个登陆监听案例

版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.youkuaiyun.com/qq_38720976/article/details/84474950 监听器基本概念   JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域对象的创建与销毁事件,以...

星空下的承诺L的博客 2336

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

session监听器 监听在线用户和登录用户

<br /><!--web.xml--><br /><br /><listener><br /><listener-class><br />   包名+类全名<br /></listener-class><br /></listener><br />重写<br />public class SessionCount implements HttpSessionListener,HttpSessionAttributeListener {<br />static int count = CountSessio

yp120yp的专栏 1801

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

如何解决每次向后台发起请求时判断用户是否处于登录状态?

事件起因:              小x向我反应用户在我开发的系统中,在其中一个功能上待了很长时间,当用户跳转到其他界面上时,突然就掉线了。              他告诉我应当在用户每次向后台索取数据的时候进行用户登录状态的检验。              用户的登录状态其实是个比较繁琐的过程。按照业务的要求,当用户点击登录界面的保存密码按钮时,在本地的cookie进行长达七天的保存。

haliofwu的专栏 5万+

Java密码监听器_使用过滤器实现登陆验证、权限认证观察者模式和监听器(使用监听器实现统计在线IP、登录IP 、踢人功能)详解...

一、使用过滤器实现登录验证、权限认证1.创建5张表 /*使用过滤器实现权限过滤功能*//**创建数据库*/DROP DATABASEday20;CREATE DATABASEday20;USEDAY20;/*用户表*/DROP TABLE IF EXISTS USER;CREATE TABLE USER(useridVARCHAR(32) ,usernameVARCHAR(32),userpass...

weixin_29523709的博客 700

登入界面的创建与监听器

登入界面的创建与监听器 界面 1、创建一个界面所需要的组件 首先我们需要考虑一个界面的组件有哪些。 元素组件:输入(按钮、输入框)输出(显示文字、图片);这些元素组件提供了和用户的交互功能,让用户能输入账号,密码等。 但是为了将这些元素组件整合在一起,我们还需要一个组件来装纳其他组件,这个组件我们称为顶级容器组件,也就是界面。通过界面来使其他组件显示。 将这些组件整合在一起后,我们不可能让他们杂乱...

HNUTheMao的博客 849

Java-Web机试练习题一、后台管理系统——管理员管理模块

题目:后台管理系统——管理员管理模块 一、 语言和环境 1. 实现语言:JAVA 语言。 2. 环境要求:MyEclipse/Eclipse + Tomcat + MySql。 3. 使用技术:Jsp+Servlet+Jdbc 或 SpringMVC + Spring + Mybatis 二、 实现功能 使用 JSP+Servlet+JavaBean 实现某后台管理系统中的管理员管理模块,具体实现要求如下: 1. 首页显示所有管理员列表信息,如图 1 所示。 图 1 首页

红目香薰 3219

Javaweb中实现监听器的操作,进行重复登录的验证

在此之前,需要懂得是否重复登录是如何进行判断的: 1.用户进行登录的时候信息是存在session中进行信息的传递; 2.session传递的过程中我们可以知道是使用HttpSessionAttributeListener中一个add可以进行监听操作 3.session是存在服务器上面的不是存在客户端 4.每次的登录浏览器都会生成一个对应的sessionId,用来做标识识别,那么他们的内容是连接在一起的; 那么我们就可以进行一个操作了,session是存在服务端,那么我们就可以进行对session的操作,那么

谢先生的日记 819
上一篇: 【JavaWeb】用过滤器实现字符集设置和登录拦截
下一篇: 【JavaWeb】实现网页验证码
csdn_inside
博客等级 码龄10年 52粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值