当前位置:网站首页>Web开发小妙招:巧用ThreadLocal规避层层传值
Web开发小妙招:巧用ThreadLocal规避层层传值
2022-07-06 12:58:00 【华为云开发者联盟】
摘要:我们可以在处理每次请求的过程中,无需从Controller以及Service中的方法层层传值,只需要直接通过该局部变量取值即可。
本文分享自华为云社区《拦截器中巧用ThreadLocal规避层层传值》,作者:KevinQ。
Web开发中的一点麻烦事
最近,准确地说,是一直都有的一点麻烦事:函数层层传递。什么意思呢?比如说有个很常见的需求描述是:记录用户的某次操作明细。
以在Java的开源框架jfinal中,操作添加一个用户的接口为例,有:
public class XXController() { public void addUser() { // 获取操作人 Integer opUserId = Integer.parseInt(getHeader("opUserId")); // 获取其他参数... service.addUser(...., opUserId); renderAppMsg("添加用户成功"); }}
为了记录用户添加的具体操作内容以及信息错误,这个记录用户操作的记录可能需要穿透好层方法。
public class XXService() { public void addUser(String tel, String name, String password, Integer opUserId) { checkTel(tel, opUserId); checkName(name, opUserId); checkPassword(password, opUserId); } public void checkTel(String tel, Integer opUserId) { check(tel, opUserId); } publc void check(..., Integer opUserId) { // ... }}
举得这个例子或许不是很恰当,但是相信大家可以理解这个麻烦点在哪里。
函数调用链中的每个方法并不是需要这个参数,而可能仅仅是为了向下个被调用的函数传递这个参数。
那么是否有方法帮助我们来不需要这样逐层传递,从而获取接口请求参数的方法呢。
思考
这有点类似与一个全局变量,但是这个变量对每次请求来说是变化的,那么是否有一种方式能够让我们来保存这样一种:针对每次请求的全局变量呢?
在最近学习Shiro的过程中,以及学习若依开源框架的过程中,我们发现其均使用到了一个强大的Java类:ThreadLocal。
shiro使用ThreadLocal是用来保存当前登录对象,若依框架中,其中所使用的分页插件PageUtil使用ThreadLocal保存请求参数中的pageNum与pageSize等分页参数。因此我们是不是也可以使用ThreadLocal来达到同样的目的。
在拦截器中使用ThreadLocal暂存请求参数
为此,我们来尝试一下,通过ThreadLocal保存请求参数,通过拦截器我们可以拦截每次请求,如下是实现方式:
package com.holdoa.core.interceptor;import com.jfinal.aop.Interceptor;import com.jfinal.aop.Invocation;import javax.servlet.http.HttpServletRequest;public class RequestPool implements Interceptor { public static ThreadLocal<HttpServletRequest> localRequest= new ThreadLocal<>(); @Override public void intercept(Invocation inv) { localRequest.set(inv.getController().getRequest()); inv.invoke(); localRequest.remove(); } public static HttpServletRequest getRequest() { return localRequest.get(); }}
我们通过ThreadLocal将整个请求暂存起来,当然,为了节约内存,也可以只保存使用频次高的通用参数,比如当前登录人的信息等等。
使用参数
使用时,只需要我们通过这个线程局部变量取值即可:
String para = RequestPool.localRequest.get().getParameter("username");
如此,我们便可以在处理每次请求的过程中,无需从Controller以及Service中的方法层层传值,只需要直接通过该局部变量取值即可。
边栏推荐
- R語言可視化兩個以上的分類(類別)變量之間的關系、使用vcd包中的Mosaic函數創建馬賽克圖( Mosaic plots)、分別可視化兩個、三個、四個分類變量的關系的馬賽克圖
- OAI 5g nr+usrp b210 installation and construction
- Is this the feeling of being spoiled by bytes?
- SDL2来源分析7:演出(SDL_RenderPresent())
- Study notes of grain Mall - phase I: Project Introduction
- What's the best way to get TFS to output each project to its own directory?
- Start the embedded room: system startup with limited resources
- 2017 8th Blue Bridge Cup group a provincial tournament
- 【mysql】触发器
- Redis insert data garbled solution
猜你喜欢
Common English vocabulary that every programmer must master (recommended Collection)
[MySQL] basic use of cursor
966 minimum path sum
3D face reconstruction: from basic knowledge to recognition / reconstruction methods!
PHP saves session data to MySQL database
3D人脸重建:从基础知识到识别/重建方法!
Why does MySQL index fail? When do I use indexes?
Why do job hopping take more than promotion?
Aike AI frontier promotion (7.6)
基于深度学习的参考帧生成
随机推荐
Deployment of external server area and dual machine hot standby of firewall Foundation
'class file has wrong version 52.0, should be 50.0' - class file has wrong version 52.0, should be 50.0
Pat 1085 perfect sequence (25 points) perfect sequence
Hardware development notes (10): basic process of hardware development, making a USB to RS232 module (9): create ch340g/max232 package library sop-16 and associate principle primitive devices
Thinking about agile development
HMS core machine learning service creates a new "sound" state of simultaneous interpreting translation, and AI makes international exchanges smoother
1500萬員工輕松管理,雲原生數據庫GaussDB讓HR辦公更高效
R語言可視化兩個以上的分類(類別)變量之間的關系、使用vcd包中的Mosaic函數創建馬賽克圖( Mosaic plots)、分別可視化兩個、三個、四個分類變量的關系的馬賽克圖
El table table - sortable sorting & disordered sorting when decimal and% appear
Select data Column subset in table R [duplicate] - select subset of columns in data table R [duplicate]
3D face reconstruction: from basic knowledge to recognition / reconstruction methods!
通过数字电视通过宽带网络取代互联网电视机顶盒应用
R language visualizes the relationship between more than two classification (category) variables, uses mosaic function in VCD package to create mosaic plots, and visualizes the relationship between tw
Redis insert data garbled solution
The difference between break and continue in the for loop -- break completely end the loop & continue terminate this loop
Vim 基本配置和经常使用的命令
2022 fields Award Announced! The first Korean Xu Long'er was on the list, and four post-80s women won the prize. Ukrainian female mathematicians became the only two women to win the prize in history
Nodejs教程之让我们用 typescript 创建你的第一个 expressjs 应用程序
PHP saves session data to MySQL database
968 edit distance