当前位置:网站首页>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中的方法层层传值,只需要直接通过该局部变量取值即可。
边栏推荐
- VIM basic configuration and frequently used commands
- Replace Internet TV set-top box application through digital TV and broadband network
- The biggest pain point of traffic management - the resource utilization rate cannot go up
- OneNote 深度评测:使用资源、插件、模版
- JS operation DOM element (I) -- six ways to obtain DOM nodes
- 2017 8th Blue Bridge Cup group a provincial tournament
- Pat 1085 perfect sequence (25 points) perfect sequence
- El table table - get the row and column you click & the sort of El table and sort change, El table column and sort method & clear sort clearsort
- How do I remove duplicates from the list- How to remove duplicates from a list?
- Nodejs教程之Expressjs一篇文章快速入门
猜你喜欢
【力扣刷题】32. 最长有效括号
039. (2.8) thoughts in the ward
[MySQL] trigger
SAP UI5 框架的 manifest.json
Aiko ai Frontier promotion (7.6)
Set up a time server
Is this the feeling of being spoiled by bytes?
SAP Fiori应用索引大全工具和 SAP Fiori Tools 的使用介绍
【Redis设计与实现】第一部分 :Redis数据结构和对象 总结
for循环中break与continue的区别——break-完全结束循环 & continue-终止本次循环
随机推荐
Replace Internet TV set-top box application through digital TV and broadband network
Select data Column subset in table R [duplicate] - select subset of columns in data table R [duplicate]
FZU 1686 龙之谜 重复覆盖
Thinking about agile development
2022菲尔兹奖揭晓!首位韩裔许埈珥上榜,四位80后得奖,乌克兰女数学家成史上唯二获奖女性
document.write()的用法-写入文本——修改样式、位置控制
Why do job hopping take more than promotion?
Swagger UI tutorial API document artifact
R语言做文本挖掘 Part4文本分类
038. (2.7) less anxiety
El table table - sortable sorting & disordered sorting when decimal and% appear
JS according to the Chinese Alphabet (province) or according to the English alphabet - Za sort &az sort
Chris LATTNER, the father of llvm: why should we rebuild AI infrastructure software
Word bag model and TF-IDF
【论文解读】用于白内障分级/分类的机器学习技术
Torch Cookbook
Reinforcement learning - learning notes 5 | alphago
2017 8th Blue Bridge Cup group a provincial tournament
How do I remove duplicates from the list- How to remove duplicates from a list?
VIM basic configuration and frequently used commands