spring中,在Java任何位置获取request对象

看RequestContextListener和RequestContextHolder源代码不难看出,是用过ThreadLocal实现的。

ThreadLocal是什么呢?看词义,它并非是一个线程,它不是一个Thread,而是一个线程局部变量,其实功能非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有该变量。

每一个HTTP请求、都是一个独立的线程,有一个独立的ThreadLocal。利用该特性我们可以利用ThreadLocal进行、HTTP请求生命周期的暂时存取值,不同类之间进行传值。

而RequestContextListener就是通过这一特性实现的。

操作方法如下:

第一步:在web.xml中,加入如下监听。

<listener>  
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>    
</listener>

第二步:写一个静态getRequest方法。

import org.springframework.web.context.request.RequestContextHolder;  
import org.springframework.web.context.request.ServletRequestAttributes;  
/** 
 * 获取当前请求对象 
 * @return 
 */  
public static HttpServletRequest getRequest(){  
    try{  
    return ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();  
    }catch(Exception e){  
        return null;  
    }  
    }

这样在web请求过程中,在任何地方都可以调用这个静态方法获取request对象了。
本文来自:http://thinkgem.iteye.com/blog/2150947

在Web开发中,获取和使用`request`对象的方式会根据所使用的框架或技术栈有所不同。以下是一些常见场景下的实现方法。 ### 在 JSP/Servlet 中获取 request 对象 在传统的 Java Web 开发中,如使用 JSP 或 Servlet,可以直接通过内置的 `request` 对象来处理客户端请求。 - **获取表单参数**:可以使用 `getParameter()` 方法获取单个参数值。 ```java String username = request.getParameter("username"); ``` - **获取多个相同名称的参数值**:如复选框数据,可使用 `getParameterValues()` 方法。 ```java String[] hobbies = request.getParameterValues("hobby"); ``` - **设置和获取属性**:使用 `setAttribute()` 和 `getAttribute()` 方法可以在请求范围内传递数据。 ```java request.setAttribute("user", user); User user = (User) request.getAttribute("user"); ``` - **获取 Cookie**:使用 `getCookies()` 方法获取客户端的所有 Cookie。 ```java Cookie[] cookies = request.getCookies(); ``` 以上操作均适用于 Tomcat 等支持 Servlet 规范的容器[^1]。 ### 在 Spring MVC 中获取 request 对象 Spring MVC 提供了多种方式来获取 `HttpServletRequest` 对象。 - **通过 Controller 方法参数直接获取**: ```java @GetMapping("/example") public String example(HttpServletRequest request) { String param = request.getParameter("param"); return "success"; } ``` - **通过工具类静态方法获取**:可以借助 `RequestContextHolder` 获取当前线程中的 `request` 对象。 ```java HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); ``` 注意:如果不在 Web 上下文中调用此方法,可能会抛出类似 `SaTokenException: 非Web上下文无法获取Request` 的异常[^3]。 - **拦截器中获取 JSON 请求体并转换为 Java 对象**: 可以通过 `HandlerInterceptor` 拦截请求,并读取输入流将 JSON 数据反序列化为 Java 对象。 ```java @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { StringBuilder sb = new StringBuilder(); BufferedReader reader = request.getReader(); String line; while ((line = reader.readLine()) != null) { sb.append(line); } String jsonBody = sb.toString(); ObjectMapper mapper = new ObjectMapper(); MyRequestObject obj = mapper.readValue(jsonBody, MyRequestObject.class); // 处理逻辑... return true; } ``` ### 在 ASP.NET 中获取 Request 对象 在 .NET 平台上的 ASP.NET 应用中,可以通过 `Page_Load` 或事件处理函数中的 `EventArgs` 获取 `Request` 对象。 - **获取 GET 参数**: ```csharp string value = Request.QueryString["value"]; ``` - **页面跳转并传递参数**: ```csharp protected void btnRedirect_Click(object sender, EventArgs e) { Response.Redirect("Request.aspx?value=获得GET方式页面传送的值"); } ``` ### 总结 无论是在 JSP、Spring MVC 还是 ASP.NET 中,`request` 对象都是 Web 开发中处理客户端请求的核心组件之一。开发者可以根据具体需求选择合适的方式来获取和操作 `request` 对象中的数据。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值