同一 tomcat 不同项目 session 共享实现

说明

这里仅讨论 同一个tomcat,部署了两个工程(两个war包)。不涉及不同tomcat,不涉及集群

背景

tomcat中的工程A包含用户登录、退出、权限控制等功能;工程B包含业务功能接口。工程A将用户登录信息加密响应给前端,前端在请求工程B时将用户加密信息放入请求header,工程B解密获得用户信息。
这种方式在安全扫描中提示存在垂直越权问题。即低权限的用户如果拿到高权限用户的加密信息,就可以拿到高权限用户的数据

修复:

将用户信息存在session中

步骤1

服务器tomcat安装目录,conf文件夹下,sever.xml 文件标签新增配置

    <Host name="localhost"  appBase="webapps"  unpackWARs="true" autoDeploy="true"><Context path="/biz-m-rest" reloadable="true"  crossContext="true" sessionCookiePath="/" /><Context path="/mams-rest" reloadable="true" crossContext="true" sessionCookiePath="/" /></Host>

开启biz-m-rest、mams-rest服务session共享,sessionCookiePath=“/” 配置很重要,没有该配置 两个工程中打印的sessionId 不同

步骤2

工程A登录接口封装方法,将用户信息存入session中,sessionId 为key
网上很多博客用固定的key(session字符串),固定key虽然实现session共享,但是没有解决安全问题。本方法使用动态 sessionId 作为key

/*
*regUser参数为用户登录后,查询数据库封装的当前用户信息
*/
private void setUserInfoSissioin(SysRegisterUser regUser,HttpServletRequest request){HttpSession httpSession = request.getSession();String sessionId = httpSession.getId();logger.info("当前session id是=============:"+sessionId);Object jsonRegUser = JSON.toJSON(regUser);httpSession.setAttribute("user",jsonRegUser);ServletContext context = httpSession.getServletContext();context.setAttribute(sessionId, httpSession);}

步骤3

工程B中通过sessionId 获得用户信息

/**通过session 中保存的用户信息,和crctoken中解密的用户id 比较,相同返回true;否则返回false**/public Boolean isLoginUser(HttpServletRequest httpServletRequest){Boolean bool = false;String crcTokenUserId = getLoginUserId(); //cookie中解密的用户id(不安全)try {HttpServletRequest request = getRequest();String sessionId = request.getSession().getId();LOGGER.info("====biz_service session=====================start==="+sessionId);ServletContext Context = request.getServletContext();ServletContext Context1= Context.getContext("/mams-rest");  //共享session,和tomcat sever.xml 中配置一致if(Context1 !=null && !Context1.equals("")){HttpSession sess=(HttpSession)Context1.getAttribute(sessionId);if(sess.getAttribute("user")!=null){JSONObject jsonObject = new JSONObject().parseObject(sess.getAttribute("user").toString());String sessionUserId = jsonObject.getString("userId");  //session 中保存的用户idLOGGER.info("tomcat 共享session 测试=====================start====sessionUserId=002==="+sessionUserId);if(StringUtils.isNotBlank(sessionUserId)&&StringUtils.isNotBlank(crcTokenUserId)&&crcTokenUserId.equals(sessionUserId)){bool = true;}}}}catch (Exception e){//报错说明用户还没登录,拿不到session信息LOGGER.error("=============请先登录==========");e.printStackTrace();}return bool;}

测试:
工程A打印的sessionId
在这里插入图片描述
工程B打印的sessionId
在这里插入图片描述

动态获取工程A和工程B的sessionId,id相同,工程B才可以正确获取工程A中存的用户信息
保证工程A和工程B 有相同的sessionId 依赖 tomcat sever.xml中的配置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/718.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【树莓派】解密树莓派Python项目中神秘的导入错误

文章目录 问题导入python文件目录分析解决方案 问题导入 小编在使用树莓派编写python项目时出现了以下两种错误&#xff1a; ModuleNotFoundError : No module named Motor from ..hardware.motor import Motor portError: attempted relative import with no known parent p…

Python 进阶(三):Python使用ORM框架SQLAlchemy操作Oracle数据库

Python使用ORM框架SQLAlchemy操作Oracle数据库 前言1. 安装Oracle Instant Client2. 安装依赖库3. 导入模块并创建引擎4. 操作oracle数据库4.1 新增数据4.2 查询数据4.3 更新数据4.4 删除数据 前言 要详细连接Oracle数据库并使用SQLAlchemy进行操作&#xff0c;按照以下步骤进…

欧科云链在GEF论坛发起圆桌:监管科技与Web3合规发展图景与展望

6月15日&#xff0c;欧科云链在格林威治经济论坛发起了一场题为“监管科技与Web3合规发展图景与展望”的圆桌会议&#xff0c;此次会议由中国香港贸易发展局副执行董事PatrickLau博士主持。Stratford Finance首席执行官Angelina Kwan&#xff0c;BC科技集团有限公司董事会副主席…

【spring cloud学习】4、创建服务提供者

注册中心Eureka Server创建并启动之后&#xff0c;接下来介绍如何创建一个Provider并且注册到Eureka Server中&#xff0c;再提供一个REST接口给其他服务调用。 首先一个Provider至少需要两个组件包依赖&#xff1a;Spring Boot Web服务组件和Eureka Client组件。如下所示&…

功能测试的技术

目录 前言&#xff1a; 1) 基于最终用户/系统测试 2) 等价测试 3) 边界值测试 4) 基于决策的测试 5) 备用流量测试 6) 临时测试 前言&#xff1a; 功能测试是软件测试中最常见的一种测试类型&#xff0c;它旨在验证系统的功能是否符合设计要求和预期行为。在进行功能测…

HackTheBox - 学院【CPTS】复习1 - PASSWORD ATTACKS

前言 有一个月时间没发文章了&#xff0c;我在6月11号进入htb学院学习CPTS&#xff0c;在扎实的THM基础的加持下&#xff0c;我学的非常顺利&#xff0c;其实大部分内容都相当于复习&#xff0c;而学到的内容只是一些可能不太常见、又或者非常细节的小技巧&#xff0c;这也是非…

【Visual Studio】Qt 获取系统时间,并实时更新时间,使用 C++ 语言,配合 Qt 开发串口通信界面

知识不是单独的&#xff0c;一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏&#xff1a;Visual Studio。 这个需求来源于这个工程&#xff1a;【Visual Studio】Qt 的实时绘图曲线功能&#xff0c;使用 C 语言&#xff0c;配合 Qt 开发串口通信界面。 文章目录 Qt…

PHP 税务申报征收系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 税务申报征收系统 是一套完善的WEB设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 代码下载 https://download.csdn.net/download/qq_41221322/87959340https://downl…

【数据库】MySQL主从同步失败或重启后需要重新配置同步,主从同步延迟解决方案,mysql主从同步加速

最近在学习MySQL&#xff0c;主从同步方案。由于是新手&#xff0c;如有出现错误的地方&#xff0c;请大家谅解并留言指正。MySQL不同的版本配置稍有不同&#xff0c;最新版本8.0.27是默认开启binarylog的&#xff0c;见下图 查询MySQL信息 SELECT version,NOW() ;show variabl…

蓝桥杯专题-试题版-【01字符串】【2n皇后问题】【A+B问题】【Fibonacci数列】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

uni-app uni.switchTab和uni.reLaunch跳转tabbar页面

uni.switchTab&#xff1a; 跳转列表不会刷新 跳转到 tabBar 页面&#xff0c;并关闭其他所有非 tabBar 页面。 uni.reLaunch&#xff1a; 跳转列表会刷新 关闭所有页面&#xff0c;打开到应用内的某个页面。&#xff08;可以跳转到tabBar 页面&#xff09; 但如果是列表的自定…

CSS盒子模型

盒子模型 盒子模型盒子模型的介绍content内容区域的宽度和高度边框&#xff08; border &#xff09;内边距&#xff08; padding &#xff09;外边距&#xff08;margin&#xff09;盒子模型示例 盒子模型 目标&#xff1a;能够认识 盒子模型的组成 **&#xff0c;**能够掌握…