java 普通类获取session_如何在Java的普通类中获取Session以及request对象

展开全部

你是指你的 web 项目中使用到一个工具性的类,它的e69da5e6ba9062616964757a686964616f31333337613865形参中没有 HttpRequest 或 HttpSession 参数?

如果是这样的话,我们需要使用一个 ThreadLocal 变量,我们把当前  request 的变量绑定到里面,在一个 request 请求的生命周期内我们在方法调用的各个更深的层次中都可以直接使用它而不需要在每个方法中都传递这个 request 参数,保存在某个地方就容易导致因为多个请求共用同一个实例而出问题,所有 context 相关的变量不保存在任何业务类相关并且可能被多线程共用的对象实例中才是保证不会出现线程安全问题的途径。

例如,这个例子中我们只要把 web.xml 中配置好 ContextFilter 后它就会自动在请求开始时绑定一个 context,结束后自动销毁,在这中间的任何时刻我们都可以通过 MyWebContext.getCurrentContext() 得到我们的 HttpServletRequest 实例和其它相关的 context 变量:// MyWebContext 记录当前 Request 的所有 context 变量。因为 servlet 是一个请求绑定一个线程的,我们用 ThreadLocal 不会有线程安全问题。

class MyWebContext {

private static final ThreadLocal contexts = new ThreadLocal();

// 拿出当前线程绑定的 context

public static MyWebContext getCurrentContext() {

return (MyWebContext) contexts.get();

}

public static MyWebContext createContext() {

return new MyWebContext();

}

// 绑定一个 context 到当前线程

public static void setContext(MyWebContext context) {

contexts.set(context);

}

public static void clearContext() {

contexts.set(null);

}

private HttpRequest request;

public void setRequest(HttpRequest request) {

this.request = request;

}

public HttpRequest getRequest() {

return this.request;

}

}

class ContextFilter implements Filter {

public void doFilter(ServletRequest, SerlvetResponse, FilterChain chain) {

// 创建并绑定我们的 context

MyWebContext context = MyWebContext.createContext();

context.setRequest(request);

MyWebContext.setContext(context);

try {

chain.doFilter(request, response);

} finally {

// 销毁 context

MyWebContext.clearContext();

}

}

}

class MyToolClassWithoutRequestParameter {

public static String getFileUploadPath() {

// 其它方法只要它是工作在 servlet 请求调用键中间的某个时刻,它就肯定能拿到 Filter 绑定进去的 Request,这样我们就不必要在每次方法调用中都额外地传递一个 HttpRequest 参数,当调用层次很深时这能明显减少复杂性。

MyWebContext contex = MyWebContext.getCurrentContext();

HttpRequest request = context.getRequest();

HttpServletContext servletContext = ...;

HttpSession session = request.getSession(false);

...

}

}

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

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

相关文章

[PAT乙级]1020 月饼

月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。 注意:销售时允许取出一部分库存。样例给出的情形是这样的&#…

java中的asList_Java Arrays.AsList原理及用法实例

java.util.Arrays的asList方法可以方便的将数组转化为集合,我们平时开发在初始化ArrayList时使用的比较多,可以简化代码,但这个静态方法asList()有几个坑需要注意:一. 如果对集合使用增加或删除元素的操作将会报错如下代码:List l…

为什么顶尖高手,都是长期主义者?

点击蓝字关注,回复“职场进阶”获取职场进阶精品资料一份在当下这个浮躁的社会,很多人都认为“快”才是真理,“慢”就是原罪。大家都对一夜腾飞的故事津津乐道,却觉得坚守一生最终获得大成的故事不够性感。但事实是怎么样的呢&…

Invitation Cards POJ - 1511 SPFA(dijkstra+反向建图+邻接表(下标过大)+输入输出用stdio(iostream超时))

题目大意: 有编号1~P的站点, 有Q条公交车路线,公交车路线只从一个起点站直接 到达终点站,是单向的,每条路线有它自己的车费。有P个人早上从1出发 ,他们要到达每一个公交站点, 然后到…

Asp.Net Boilerplate微服务实战(一)概述

ABP目前分为两个主版本:原版ABP框架,以及新版本也就是大家通常说的AbpvNext,官方后将ABP原版本框架命名为Asp.Net Boilerplate,新版本ABPvNext称为ABP框架。为方便阅读,本系列将原版本ABP框架统一称为Asp.Net Boilerpl…

[PAT乙级]1022 D进制的A+B

输入两个非负 10 进制整数 A 和 B (≤2​30​​−1)&#xff0c;输出 AB 的 D (1<D≤10)进制数。 输入格式&#xff1a; 输入在一行中依次给出 3 个整数 A、B 和 D。 输出格式&#xff1a; 输出 AB 的 D 进制数。 输入样例&#xff1a; 123 456 8输出样例&#xff1a; 1…

Tree Recovery(二叉树递归遍历+求后序遍历模板)

题意&#xff1a;已知先序和中序&#xff0c;将后序求出来 Little Valentine liked playing with binary trees very much. Her favorite game was constructing randomly looking binary trees with capital letters in the nodes. This is an example of one of her creati…

java中函数是什么_[一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念...

本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍什么是函数式编程?java程序员第一反应可能会理解成类的成员方法一类的东西此处并不是这个含义,更接近是数学上的函数看一下百度百科中关于函数的说明函数的定义&#xff1a;给定一个数集A&#xff0c;假设其…

分布式系统不得不说的CAP定理

21天学会C语言&#xff1f;3天学会弹钢琴&#xff1f;放弃一切错误方法&#xff0c;从今天开始“刻意练习”&#xff0c;因为这才是最强大的&#xff0c;也是唯一正确的学习方法。--《刻意练习》Anders Ericsson引言CAP问题已经成了计算机科学中一个研究领域&#xff0c;之前说…

[PAT乙级]1021 个位数统计

输入格式&#xff1a; 每个输入包含 1 个测试用例&#xff0c;即一个不超过 1000 位的正整数 N。 输出格式&#xff1a; 对 N 中每一种不同的个位数字&#xff0c;以 D:M 的格式在一行中输出该位数字 D 及其在 N 中出现的次数 M。要求按 D 的升序输出。 输入样例&#xff1a;…

java 造数据_java测试造数据神器JavaFaker

背景构造测试数据时&#xff0c;需要绞尽脑汁浪费时间&#xff0c;JavaFaker可以释放你的生产力githup地址安装com.github.javafakerjavafaker0.17.2使用随机生成一百个学生及考生分数学生模型/*** 测试model 学生*authorszhu*/public class Student implements Comparable{/**…

Largest Rectangle in a Histogram (动态规划+奇思妙想单调栈)求最大矩状图面积

感觉动态规划都是玄妙的很&#xff0c;思维题吧&#xff08;单调栈思维&#xff09; 题解&#xff1a;让求最大矩形面积&#xff0c;宽为1&#xff0c;暴力超时 可以发现 当第i-1个比第i个高的时候 比第i-1个高的所有也一定比第i个高 于是可以用到动态规划的思想 令l…

ASP.NET Core分布式项目实战(详解oauth2授权码流程)--学习笔记

最近公司产品上线&#xff0c;通宵加班了一个月&#xff0c;一直没有更新&#xff0c;今天开始恢复&#xff0c;每日一更&#xff0c;冲冲冲任务13&#xff1a;详解oauth2授权码流程我们即将开发的产品有一个用户 API&#xff0c;一个项目服务 API&#xff0c;每个服务都需要认…

java 先进先出的map_「 深入浅出 」java集合Collection和Map

本系列文章主要对java集合的框架进行一个深入浅出的介绍&#xff0c;使大家对java集合有个深入的理解。 本篇文章主要具体介绍了Collection接口&#xff0c;Map接口以及Collection接口的三个子接口Set&#xff0c;List&#xff0c;Queue。什么是集合Java集合类存放于 java.util…

二叉搜索树(模板)

题意:先给一组数据构建一颗二叉搜索树作为标准树。紧跟着n组数据中&#xff0c;判断每组 数据构成的二叉搜索树是否和标准树yi一样。 思路&#xff1a;两棵树如果一样的话&#xff0c;就是拥有一样的节点&#xff0c;在每个节点上具有相同的值&#xff0c;且 在相同遍历条件下&…

C++类模板中的static成员

从类模板实例化的每一个模板类有自己的类模板数据成员&#xff0c;该模板的所有对象共享一个static数据成员。 代码如下: #include <iostream> using namespace std;template<typename T> class Person { public:static int a;};template<typename T> int …

C#并发编程之初识并行编程

写在前面之前微信公众号里有一位叫sara的朋友建议我写一下Parallel的相关内容&#xff0c;因为手中商城的重构工作量较大&#xff0c;一时之间无法抽出时间。近日&#xff0c;这套系统已有阶段性成果&#xff0c;所以准备写一下Parallel的相关内容&#xff0c;正好也延续之前的…

java 下拉列表 枚举_「Java三分钟」精准而优雅——枚举类详解

关注我&#xff0c;每天三分钟&#xff0c;带你轻松掌握一个Java相关知识点。1.为什么要用枚举你在读一个老工程代码时&#xff0c;是否经常看见有几个类&#xff0c;里面放着成百上千的静态常量&#xff0c;场面相当恐怖&#xff0c;而且如果不加注释&#xff0c;很多你都不知…

Not so Mobile(二叉树递归输入同时建树){天平}

题意&#xff1a; 给出一个大天平&#xff0c;大天平中还有许多小天平&#xff0c;求出所有的天平是否平衡&#xff1b;平衡条件为wldl wrdr&#xff1b; 题目 Before being an ubiquous communications gadget, a mobile was just a structure made of strings and wires …

C++类型转换基本语法

static_cast 用于内置的数据类型 还有具有继承关系的指针或者引用 代码如下: #include <iostream> using namespace std;class Building {}; class Animal{}; class Cat:public Animal{};int main() {int a 97;char c static_cast<char>(a);cout << c &l…