【JavaWeb】同域单点登录SSO实现

实现单点登录(SSO)功能的JavaWeb项目 htmltable {th, td {th {pre {简介:为确保Web应用中用户账号的安全和唯一性,需要实现单点登录(SSO)功能,即同一账号在任一时间仅允许一次登录。本项目讲解了如何通过会话管理、状态检查、会话失效和跨域会话管理等策略,在JavaWeb环境下,使用Servlet和JSP技术实现SSO。同时,还提供了关于处理登录请求、会话检查、登出处理以及数据库交互的具体实践,旨在加深对JavaWeb开发及用户安全的理解。 阅读详情

导读:单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。一般分为两种,一种是同域的,一种是不同域的,本文使用Cookie作为验证媒介,实现同域的单点登录。


简介

使用Cookie作为验证媒介,原理上不算复杂(实现起来业务逻辑还是比较复杂),用户在WebApp1中登录,将凭证保存在WebApp1的Cookie中,同时在WebApp2的Cookie中也进行保存,当用户访问WebApp2时,从Cookie中拿出凭证,直接就是登录状态。

简单来讲,逻辑如下图:(来源于JC_Huang的简书文章:单点登录的三种实现方式)。

本文代码部门参考了慕课网的课程。

                                              


登录实现

登录实现流程:

本文的登录实现流程,大致如下:

首先一共有三个Web服务器,一个用于管理登录的SSO服务器,两个Web应用。橘色的线,表示首次登录的流程,红色的线,表示登录过其中一个Web应用后,再登录第二个的流程。

由于WebApp1和WebApp2是等价的,下面只展示WebApp1的代码,稍作修改就是WebApp2的代码。

接下来的代码,根据这个流程进行。

                   


WebApp过滤器:

WebApp过滤器用来监控一切访问WebApp的请求。当Web应用启动,想进入默认index页面的时候,会被过滤器拦截。

首先设置两个属性,server表示SSO Server的地址,app表示当前Web应用的地址,然后从初始化参数里面获取。

接下来,在Cookie中搜寻,看是否有登录凭证ticket,第一次访问,肯定没有登录,ticket=null。

再从URL中获取,第一次访问,URL中没有ticket参数,依旧为空,所以跳转至登录SSO Server的/ssoLogin。

//WebApp1  Filter
@WebFilter(filterName = "UserFilter",urlPatterns = "/*",
initParams = {@WebInitParam(name="server",value="http://localhost:8080"),
        @WebInitParam(name="app",value="http://localhost:8082")})
public class UserFilter implements Filter {
    private String server;
    private String app;

    public void init(FilterConfig config) throws ServletException {
        server=config.getInitParameter("server");
        app=config.getInitParameter("app");
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        String ticket=null;
        //如果Cookies不为空
        if(null!=((HttpServletRequest)req).getCookies()){
            for(Cookie cookie:((HttpServletRequest)req).getCookies()){
                //看是否有我们需要的凭证Cookie
                if(Objects.equals(cookie.getName(),"Ticket_Granting_Ticket")){
                    ticket=cookie.getValue();
                    break;
                }
            }
        }

        //如果Ticket不为空,就表示已经登录过了,进入到主页
        if(!Objects.equals(null,ticket)){
            chain.doFilter(req, resp);
            return;
        }
        
        //Cookie中为空,则从URL获取
        ticket=req.getParameter("ticket");
        //如果能获取到,则将凭证保存至当前Web应用的Cookie
        if(!Objects.equals(null,ticket)&&!Objects.equals("",ticket.trim())){
           ((HttpServletResponse)resp).addCookie(new Cookie("Ticket_Granting_Ticket",ticket));
            chain.doFilter(req,resp);
            return;
        }
        //不能获取,则跳转至登录页面。
        else{
            ((HttpServletRe
USB2.0物理层实战:手把手教你用示波器抓取D+/D-信号(附波形分析) 本文是一份针对硬件工程师的USB2.0物理层信号调试实战指南。文章详细讲解了如何使用示波器捕获和分析D+/D-差分信号,从基础设置、核心信号状态解读,到信号完整性分析与常见问题排查,手把手教你定位USB通信故障。内容涵盖USB2.0协议物理层关键概念,并附有基础解码思路,旨在提升工程师的底层调试能力。 阅读详情

相关推荐

ESP32S3电池电量监测实战:从分压电路到IDF组件配置(附GitHub源码)

本文详细介绍了ESP32S3电池电量监测的完整实战方案。从硬件分压电路的电阻选型、滤波设计,到软件层面利用ESP-IDF的ADC校准机制提升精度,并重点讲解了如何集成bat_monitor开源组件快速实现电压采集、电量计算、充电检测与事件通知。文章提供了从原理到调试的完整指南和GitHub源码,帮助开发者构建稳定可靠的物联网设备电源管理系统。

ee345的博客 529

操作不能完成 (错误 0x00000709) 共享打印机无法连接解决办法

环境:windows Server 2012 + Win10 客户端 问题:使用计算机名和IP地址可以正常连接打印机,但是使用另外的A记录或CN记录无法连接,报此错误 原因:这是打印服务DNS解析的问题 故障补充:假设你的服务器电脑名称叫print01,但是你又建了一条A记录或者CNname 叫PR01,就会发现使用额外的A记录或CN记录就无法连接 故障截图: 操作不能完成 (错误...

瑞哥的博客 3万+

Applied Energy期刊小白论文投稿模板-流程经验分享

Applied Energy期刊小白论文投稿模板-流程经验分享,Elsevier期刊(爱思唯尔)投稿流程

zzu_Flyer的博客 4万+

P1196吃糖果游戏解题报告

 Name: P1196吃糖果游戏 Matrix67 第一次模拟赛 系列   Copyright: 始发于goal00001111的专栏;允许自由转载,但必须注明作者和出处  Author:  goal00001111  Date: 18-12-08 19:47  Description: 描述 Description     Matrix67和Shadow正在做一个小游戏。桌子上放着两堆糖果,M

goal00001111的专栏 2877

手把手教你搞定EMC EFT测试:从电源线到信号线的完整整改实战(附常见失败原因)

本文详细解析了EMC EFT测试中的常见问题及整改措施,从电源线到信号线的完整实战方案。通过四步定位法和成本最优整改策略,帮助工程师有效应对电快速脉冲群干扰,提升产品通过率并降低成本。

weixin_30920597的博客 497

在实车上进行lio-sam测试

PS:将雷达和imu相对固定后,拆下来,原地晃啊晃,直到xyz进度达到百分百,参考gif。标定完成后,会在result文件夹下生成result.txt。

如果想成为中心,那么就到中心去吧。 997

腾讯Android开发面试准备指南及参考答案

腾讯元宝高级Android开发职位面试准备指南 该职位要求扎实的Kotlin基础、架构设计能力和性能优化经验,重点关注Android客户端开发。面试流程约3轮,支持线上面试,流程较快。候选人需准备以下核心内容: 基础技术:Kotlin特性、Android开发生命周期、多线程编程 架构设计:MVVM/MVI模式应用、组件化解耦方案 性能优化:流畅度提升、内存管理、启动时间优化等实战案例 加分技能:Jetpack Compose开发、音视频处理、跨平台开发经验 建议结合项目经验准备具体案例,突出技术深度和问题解

郑伟强dev的专栏 1193

【Reality Capture 】01:Reality Capture1.5中文版安装教程(附安装包下载)

本文详细介绍了Reality Capture 1.5中文版的安装步骤。首先,下载并解压Reality Capture v1.4.0汉化版安装包,运行EpicInstaller并更改安装路径。接着,启动Epic Games Launcher,登录或注册账号后下载并安装软件。安装完成后,进入主界面并设置中文语言。此外,还提供了中文补丁的拷贝方法,将ui.xml和RealityCapture_CHS.exe文件分别放置到指定目录,并运行RealityCapture_CHS.exe以完成汉化。最后,文章提供了Rea

智慧空间实验室 1748

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上一篇: 【Hexo】yilia主题 添加 Subnav 社交图标 优快云 STEAM PSN等等
下一篇: 【Java】内部类调用方法内的局部变量为什么必须加final
csdn_inside
博客等级 码龄10年 52粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值