展开全部

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

如果是这样的话,我们需要使用一个 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);

...

}

}

java获取当前request_java如何在一个普通的类中获取request对象相关推荐

  1. java读取ES配置生成ES管理类,获取ES连接

    java读取ES配置生成ES管理类,获取ES连接 1.Elasticsearch是基于Lucene开发的一个分布式全文检索框架,向Elasticsearch中存储和从Elasticsearch中查询, ...

  2. java 普通类request_[Java教程]spring在普通类中获取session和request

    [Java教程]spring在普通类中获取session和request 0 2014-08-12 08:01:13 在使用spring时,经常需要在普通类中获取session,request等对像. ...

  3. java 获取继承字段_java – 从类中获取所有字段(甚至是私有的和继承的)

    我在做大学项目. 我需要从类中获取所有字段.甚至私人和继承.我试图获取所有声明字段,然后投射到超类并重复. 我的代码片段: private void listAllFields(Object obj) ...

  4. 【SpringBoot】在普通类中获取spring容器中的bean

    这段时间公司搞封闭开发,做一个联通总部的客服系统项目,是基于springboot的.在开发工程中遇到一个页面datagrid数据排序的功能,因为有多个表的数据都要用到排序功能,于是我就写了一个排序功能 ...

  5. java定义私有变量_java – 为什么在类中声明变量私有?

    我会开始道歉,因为我确信这已经在其他地方回答 – 我只是找不到一个解释它的方式我明白的答案!我正在做一个MSc转换课程,还有一些基本的基础,我仍然在努力,包括这一个 – 为什么使变量私有更好. 说我有 ...

  6. SharedPreferences获取时报空指针异常,以及普通类中使用SharedPreferences存储数据

    在Activity中使用SharedPreferences似乎很简单,只要把获得 SharedPerferences preference = getSharedPreferences("X ...

  7. 在普通类中获取spring容器中的bean

    在普通类中获取spring容器中的bean 1.工具类 package com.itheima.hchat.util;import org.springframework.beans.BeansExc ...

  8. Java反射之Filed(类中的属性对象)

    通过反射机制获取类中的属性对象. 1.获取类中所有的public属性(包括父类):getFields(): public class TestFiled {class A{public int age ...

  9. 枚举类中获取枚举值的几种方法

    在开发的过程中我们经常会定义枚举类,枚举类中获取枚举值的方式也有很多种,下面我们就探究一下大家常用的几种方式: 枚举类 public enum TestEnum {ONE(1,"one&qu ...

最新文章

  1. 科研经验1:云笔记积累个人知识体系
  2. Web模糊测试工具Powerfuzzer
  3. springmvc怎么解析post_秋招跳槽,面试是拦路虎?【spring、springMVC】- 常见面试题汇总...
  4. 三个剩两个,两个剩一个,最后一个都没剩下。
  5. java中文件处理之图片_在Java 7中处理文件
  6. 使用了BeanUtils的简单操作
  7. JAVAWEB项目如何实现验证码
  8. hsf 架构_HSF源码剖析 - 汪兴的个人空间 - OSCHINA - 中文开源技术交流社区
  9. AutoCAD dwg(dxf)图外有多余的点或者线解决办法
  10. python 表白程序代码_程序员如何实现表白代码
  11. 微软大战Google Earth的利器-虚拟3D地球“Virtual Earth3D”!
  12. 架设国外服务器怎么维护,架设海外服务器流程分享
  13. 京剧戏曲电脑主题 +唯美爱心win7主题 +刺猥和苹果卡通主题
  14. 在R语言中进行局部多项式回归拟合(LOESS)
  15. 2004年下半年 网络工程师 上下午试卷【附带答案】
  16. log4j2漏洞各大厂应对措施
  17. LJ5.1 - 水下可见光通信UVLC研究进展
  18. CRB开发-列表视图按钮添加
  19. react的行内样式和外链样式
  20. 3分钟搞懂阿里云服务器安装Nginx并配置静态访问页面

热门文章

  1. 二、在元件库里画元件
  2. android多语言希伯来语,希伯来语APP
  3. 概述 - Linux内存管理(一)
  4. 面试题总结之windows/linux内存管理
  5. 在Godday虚拟主机上面配置BlogEngine.NET虚拟目录的处理方法
  6. 用java写qt界面_c++用Qt之后写图形界面是否比Java用swing简单
  7. Spring中的RowMapper接口的作用
  8. Pandas中Series结构的切片详解以及常用技巧
  9. linux rootkit 端口复用,Linux Rootkit系列三:实例详解 Rootkit 必备的基本功能
  10. 使用 Drone CI Docker 扩展为您的笔记本电脑带来持续集成