`
IrenBJ
  • 浏览: 28495 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

讨论在无法获取request对象的时候如何存取用户登录的session信息

    博客分类:
  • java
阅读更多

     首先,这个问题困扰了好久,一直想着是否能有更合适的方式来解决,下面我就先描述下需求吧,如有不理解的地方,欢迎提出疑问,并且给出良好的建议,谢谢!

 

     项目框架是SSH,大家再熟悉不过,用户登录操作后,将用户登录信息压入session中,这是常规做法,一般用户在维护数据的时候都会用到userSession的一些基本信息,如新增、修改和删除等。一般这样的操作大家都会认为请求大都是从action入口,所以必然能获取到request对象。但是我们现在的项目有点特殊,先介绍下我们项目的基本情况吧:

     系统分为浏览版和维护版的开发,并且这两块的开发是由两个独立的开发团队进行的,只有一个技术经理在中间进行协调工作,所以在开发的过程当中有些维护版产生的bug不得不由我们这些在现场开发浏览版的人来给他们维护,修改bug。

 

(以上是项目大概的背景资料,大家可以重点看下面)

    用户进行新增、修改和删除数据的时候记录日志,记录日志是利用Hibernate的拦截器来进行操作的,但是Hibernate的拦截器只会对使用Hibernate指定的方法,如save()、update()、delete()等方法进行拦截,据我所测试而不会对nativate的sql语句进行拦截,所以问题就出现了,在通过sql语句如(delete from table where id=1)删除数据的时候,Hibernate事件拦截器并不会对其进行拦截,恰恰巧合的是,我们项目里所有实体删除数据的时候都是用sql语句来执行操作的,并不会记录日志,直到后来我们发现了这个问题,因为涉及的地方比较多,不可能将之前的代码全部更新,只能在现有的代码中进行少量的修改。  

 

    之前的实现大概是下面这样的情况:

    创建一个包含所有实体删除方法的类AllDeleteSQL.java,用户删除数据时只需要调用这个类的静态方法,传入数据的ID即可完成删除操作(他们认为这同样能被Hibernate操作事件拦截器拦截并记录日志),此时并没有传入request参数,实际结果记录日志失败。

    我现在想到一种解决思想是:

    新增一个类ThreadLocalUtil.java类,里面有个ThreadLocal的全局静态变量,用户在进行登录操作的时候,将用户的session信息存放到这个类的ThreadLocal变量当中,下次再直接从这个变量中获取出来,具体的代码如下:

    ThreadLocalUtil.java

   package **.**;

import **.UserSession;

/**
 * 功能:存放用户登录后的session信息类
 * 每个用户登录调用静态方法存储相应的用户session信息
 * @author Administrator
 */
public class ThreadLocalUtil {

	private static volatile ThreadLocal<UserSession> localSession = new ThreadLocal<UserSession>();  //存放session信息的ThreadLocal全局变量
	
	public ThreadLocalUtil() {
	}
	
	
	/**
	 * 将用户的session信息set到该类的localSession变量当中
	 * @param us
	 */
	public static synchronized void setUserSessionToThreadLocal(UserSession us) {
		localSession.set(us);
	}
	
	/**
	 * 获取对应的localSession中保存的用户session信息
	 * @return localSession
	 */
	public static synchronized UserSession getUserSessionToThreadLocal() {
		return localSession.get();
	}
	
	/**
	 * 用户注销时将localSession中保存的用户信息清除
	 */
	public static void removeUserSession() {
		if(localSession.get()!=null) {
			localSession.remove();
		}
	}

}

 AllDeleteSQL.java的部分方法:

import **.UserSession;
import **.ThreadLocalUtil;

public class AllDeleteSQL {
	
	static CommDelete commDelete = CommDelete.getCommDelete();
	
	/**
	 * 删除业务需求
	 */
	public static String[] getRequirementDeleteSql(Long entityId, Long dataId){
		String sql = commDelete.delCommInfo(entityId, dataId);
		sql = sql + "update REQUIREMENT set DEL_FLAG = 1 where ID = " + dataId;
		sql = sql + ";";
		sql = sql + "update REQ_COMM set DEL_FLAG = 1 where REQ_ID = " + dataId;
		sql = sql + ";";
		sql = sql + getDelelteLogSQL(entityId,dataId);
		return sql.split(";");
	}
	
	/**
	 * 删除实体数据时拼接记录日志删除SQL
	 */
	public static String getDelelteLogSQL(Long entityId,Long dataId) {
		
		UserSession us = ThreadLocalUtil.getUserSessionToThreadLocal();
		StringBuilder dSql = new StringBuilder();
		if(us==null) {
			return "";
		} else {
			dSql.append("INSERT INTO EAM_LOG");
			dSql.append("(ID,  LOG_ENTITY,  LOG_DATA_ID,  LOG_TYPE,  LOG_ORG_ID,  LOG_PERSON_ID,  LOG_DATE)");
			dSql.append(" VALUES (");
			dSql.append(Long.parseLong(SequencerUtil.getSequence()));
			dSql.append(", ");
			dSql.append("(SELECT T.ENTITY_NAME_EN_FULL FROM EAM_ENTITY T WHERE T.ID=").append(entityId).append(")");
			dSql.append(", ");
			dSql.append("'" + dataId + "'");
			dSql.append(", ");
			dSql.append("'删除数据'");
			dSql.append(", ");
			dSql.append("'" + us.getUserOrgId() + "'");
			dSql.append(", ");
			dSql.append("'" + us.getUserArchPersonId() + "'");
			dSql.append(", ");
			dSql.append("'" + DateUtil.getCurrentDateTime("yyyy-MM-dd HH:mm:ss") + "'");
			dSql.append(" )");
			
			return dSql.toString();
		}
	}
}

用户登录时请求的action操作部分代码:

        		//将用户session信息存放到ThreadLocal中
        		UserSession us = (UserSession)request.getSession().getAttribute(Constants.USER_KEY);
        		ThreadLocalUtil.setUserSessionToThreadLocal(us);

 

        以上只贴出部分代码,但是主体部分全部出来了,不知道大家有没有看懂我解决该问题的思路,因为struts的action请求都是线程不安全的,这里也是我为什么在ThreadLocalUtil.java中采用同步方法来进行访问,这样使得在多线程下能够实时的访问同步变量更新后的值。

       按理说做到这里我觉得问题应该是解决了,当我测试的时候发现,结果并不然,在AllDeleteSQL.java中getDelelteLogSQL(args)方法中通过UserSession us = ThreadLocalUtil.getUserSessionToThreadLocal();语句来获取用户session信息,实际是这样获取的us信息并不稳定,有时候为空,有时候正确,当我以多个浏览器登录不同的用户时,获取的us信息时为空,时为当前用户的session信息,时为其他用户的session信息,记录的日志并不准确,问题依然没能彻底解决。

       思考,得不到解决办法,也查不到相关的资料如何处理这种情况,说到根源,还是因为我自己的基础知识不扎实导致的结果。

 

       在这里首先要说明一下,用ThreadLocal来存取用户session信息的方案是由我们技术经理提出的,说这种方式能够解决现在的问题,但是我并没有把事情做好,所以希望在此描述清楚自己的需求,能够和大家讨论下,看你们有没有碰到过类似的情况,你们是如何解决的,不妨说来听听,让我学习学习吧。

 

      如果你愿意耐心看完,对我的表达能力提出疑问,欢迎你提出宝贵的意见,并向你说声谢谢;

      如果你看完了还能发表下对我目前所碰到的问题给出你的意见,向你深表感谢;

      最后祝大家工作顺利^_^

2
2
分享到:
评论
2 楼 IrenBJ 2010-03-23  
    filter已经不可能了,呵呵,如果真要这样做的话,那改动量是比较大的,因为整个工程的删除操作都在这个类AllDeleteSQL.java中,看到这个类名就知道啦,另外如果要改的话,我还不如在每个action中调用该生成delete sql语句的时候传入request参数呢,这样不就可以获取到userSession信息了么。
    因为改动量太大,所以自己想的那种方式也没加以考虑,呵呵,不过还是很谢谢你的回复啦
1 楼 jasongreen 2010-03-23  
看到这个标题时,我想到的也是threadlocal。但这个操作最好是在filter中完成。

相关推荐

    deepseek经验分享-陈雄.pptx

    deepseek经验分享-陈雄.pptx

    采用springboot框架的基于Java的家政服务平台的设计与实现(Java项目编程实战+完整源码+毕设文档+sql文件+学习练手好项目).zip

    本家政服务平台就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此家政服务平台利用当下成熟完善的Spring Boot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。家政服务平台有管理员,雇主,雇员三个角色。管理员功能有个人中心,雇主管理,雇员管理,资料认证管理,项目类型管理,服务项目管理,需求信息管理,服务预约管理,申请预约管理,签订合同管理,雇主评价管理,留言板管理,系统管理。雇主可以发布需求,雇员可以申请预约,雇主支付报酬,雇主和雇员可以签订合同,雇主可以对雇员进行评价。家政服务平台的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:家政服务平台;Spring Boot框架;MySQL;自动化

    【毕业设计】“跑鸭”微信小程序-一款基于校园跑步的社交小程序【源码+论文+答辩ppt+开题报告+任务书】.zip

    【毕业设计】“跑鸭”微信小程序-一款基于校园跑步的社交小程序(实时里程配速、运动路径、整公里提醒、周榜月榜、打卡分享、热门推荐、线上活动、勋章墙、隐私设置 【源码+论文+答辩ppt+开题报告+任务书】.zip【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    大学生创新创业大赛项目 - 仿 Envato 的电商项目.zip

    大学生创业项目源码

    Python爬虫实例,一个简单的DEMO

    使用requests和BeautifulSoup库爬取豆瓣电影Top250的基本信息

    电动汽车(EV)保有量数据集(232K+记录,17特征)CSV

    数据集文件包含美国各地电动汽车 (EV) 注册的详细记录,其结构便于分析并与数据处理工具集成。它通常以 CSV 格式提供,以确保与各种数据分析平台的兼容性。 关键列和数据属性: 做:电动汽车制造商(例如,特斯拉、日产、雪佛兰)。 型:车辆的特定型号(例如,Model S、Leaf、Bolt)。 车型年份:车辆模型的制造年份。 电动续航里程:每次充电的估计电动行驶里程(以英里为单位)。 EV 类型:将车辆分类为电池电动汽车 (BEV) 或插电式混合动力电动汽车 (PHEV)。 州和县:车辆注册的地理位置,允许进行区域分布分析。 注册人数:每个地区每个车型注册的车辆数量,有助于识别高浓度的 EV 区域。

    施耐德ATV312变频器通过MCGS RTU通讯实现双机监控与控制的触摸屏集成解决方案,无PLC的施耐德ATV312变频器通讯示例:触摸屏控制监控两台变频器,功能多且省成本,改进型可调整步长 P&O

    施耐德ATV312变频器通过MCGS RTU通讯实现双机监控与控制的触摸屏集成解决方案,无PLC的施耐德ATV312变频器通讯示例:触摸屏控制监控两台变频器,功能多且省成本,改进型可调整步长 P&O MPPT(二区MPPT复现),光储系统MPPT 直流负载供电的单级离网光伏系统中,降压转器将太阳能光伏阵列和直流负载连接起来,同时确保最大功率点跟踪(MPPT) 和电池充电控制的良好运行。 在MPPT方面,提出了一种改进的自适应步长扰动观测(P&O)方法,以达到不同天气条件下太阳能光伏阵列的实际最大功率点(MPP),同时减少稳态振荡和功率损耗。 此外,电池充电控制侧使用三级充电控制器 (TSCC) 为铅酸电池站充电。 ,改进型P&O; 复现二区MPPT; 光储系统MPPT; 最大功率点跟踪(MPPT); 步长扰动观测; 降压转换器; 太阳能光伏阵列; 电池充电控制; 三级充电控制器(TSCC); 铅酸电池站。,改进型P&O MPPT技术,光储系统高效能量管理

    基于stm32家庭安全防控系统 (程序+WiFi)

    基于stm32家庭安全防控系统 (程序+WiFi)

    Maxwell电机与Simplorer联合仿真教程:矢量控制SVPWM算法与电路搭建详解,自定义电机模型替换指南,Maxwell电机与Simplorer联合仿真教程:电路搭建及矢量控制SVPWM算法实

    Maxwell电机与Simplorer联合仿真教程:矢量控制SVPWM算法与电路搭建详解,自定义电机模型替换指南,Maxwell电机与Simplorer联合仿真教程:电路搭建及矢量控制SVPWM算法实

    CNN-master.zip

    CNN相关以及垃圾分类数据集

    基于springboot框架的流浪动物救助网站的设计与实现(Java项目编程实战+完整源码+毕设文档+sql文件+学习练手好项目).zip

    互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱,出错率高,信息安全性差,劳动强度大,费时费力等问题,采用流浪动物救助网站可以有效管理,使信息管理能够更加科学和规范。 流浪动物救助网站在Eclipse环境中,使用Java语言进行编码,使用Mysql创建数据表保存本系统产生的数据。系统可以提供信息显示和相应服务,其管理员增删改查动物信息和动物信息资料,审核动物信息预订订单,查看订单评价和评分,通过留言功能回复用户提问。 总之,流浪动物救助网站集中管理信息,有着保密性强,效率高,存储空间大,成本低等诸多优点。它可以降低信息管理成本,实现信息管理计算机化。 关键词:流浪动物救助网站;Java语言;Mysql

    采用springboot框架的基于web的机动车号牌管理系统的设计与实现(Java项目编程实战+完整源码+毕设文档+sql文件+学习练手好项目).zip

    对机动车号牌信息管理的提升,也为了对机动车号牌信息进行更好的维护,机动车号牌管理系统的出现就变得水到渠成不可缺少。通过对机动车号牌管理系统的开发,不仅仅可以学以致用,让学到的知识变成成果出现,也强化了知识记忆,扩大了知识储备,是提升自我的一种很好的方法。通过具体的开发,对整个软件开发的过程熟练掌握,不论是前期的设计,还是后续的编码测试,都有了很深刻的认知。 机动车号牌管理系统通过MySQL数据库与Spring Boot框架进行开发,机动车号牌管理系统能够实现牌照换补申请管理,用户管理,牌照申请管理,牌照转移申请管理,车辆信息管理,公告信息管理等功能。 通过机动车号牌管理系统对相关信息的处理,让信息处理变的更加的系统,更加的规范,这是一个必然的结果。已经处理好的信息,不管是用来查找,还是分析,在效率上都会成倍的提高,让计算机变得更加符合生产需要,变成人们不可缺少的一种信息处理工具,实现了绿色办公,节省社会资源,为环境保护也做了力所能及的贡献。 关键字:机动车号牌管理系统,牌照,车辆信息

    Maxwell电机与Simplorer联合仿真教程:矢量控制SVPWM算法及电路搭建指南,包含详细视频与可复制电机模型替换示范,教程Simplorer与Maxwell电机联合仿真,详细教程包含电路

    Maxwell电机与Simplorer联合仿真教程:矢量控制SVPWM算法及电路搭建指南,包含详细视频与可复制电机模型替换示范,教程Simplorer与Maxwell电机联合仿真,详细教程包含电路

    Python实现基于IBES-ELM基于改进的秃鹰搜索优化算法优化极限学习机的数据回归预测 多指标的详细项目实例(含完整的程序,GUI设计和代码详解)

    内容概要:本文档详细介绍了一个名为《Python实现基于IBES-ELM基于改进的秃鹰搜索优化算法优化极限学习机的数据回归预测》的项目。该项目旨在通过结合改进的秃鹰搜索优化算法(IBES-EO)和极限学习机(ELM),优化ELM模型以提高其预测精度,尤其针对多指标、高维数据以及噪声数据的处理进行了探讨。项目涵盖了从数据预处理到建模预测的一系列完整流程,并提供了代码案例和GUI界面设计思路。文档详细阐述了模型的工作机制、适用场景及其实现细节。 适合人群:对机器学习有兴趣,特别是对ELM、IBES-EO感兴趣的研究人员、开发人员和技术爱好者。 使用场景及目标:适用于各种回归预测问题,包括但不限于金融预测、气象预测、健康数据分析和智能交通系统等。目标在于提供一种高效的解决方案,提高在大规模复杂数据集中进行回归预测的能力,同时也展示了如何将生物启发式的优化算法运用于改进现有的机器学习模型,为实际应用提供更多可能。 阅读建议:文档按照章节顺序编排,从背景介绍到具体实现再到最终总结。初学者可以从头至尾通读,以掌握全流程概念和技能;有一定经验的读者可以直接跳转至自己感兴趣的环节,例如优化算法的具体设计或者代码实现部分。建议边学习边动手实验,以达到最佳的学习效果,并可通过提供的完整示例代码加深理解和记忆。此外,项目中有关于系统架构设计、API接口搭建等内容也可作为实际工程项目参考。

    AdaBoost分类算法案例

    本案例使用鸢尾花萼长度(sepal length)、花萼宽度(sepal width)、花瓣长度(petal length)和花瓣宽度(petal width)作为特征,采用Adaboost算法将其进行分类。 同学们通过本案例学习Adaboost算法的理论基础以及在分类问题中的应用,同时通过实际操作加深对分类算法和数据分析的理解。更好的掌握机器学习算法,培养对数据科学的兴趣和实践能力。

    【毕业设计】基于微信小程序的农产品扶贫助农系统【源码+论文+答辩ppt+开题报告+任务书】.zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    【毕业设计】基于微信小程序的社区门诊管理系统【源码+论文+答辩ppt+开题报告+任务书】.zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    Wordpress-6.7.2.zip

    Wordpress-6.7.2.zip

    VID20250317191237.mp4

    VID20250317191237.mp4

Global site tag (gtag.js) - Google Analytics