SpringMVC中获取HttpServletRequest

https://www.cnblogs.com/redos/p/14945483.html

方式一
使用@Autowired或者写在Controller的处理方法中,Spring容器会帮忙注入

@Controller
public class HelloController {
    @Autowired
    private HttpServletRequest request; //$Proxy36@5861

    @GetMapping("index")
    public String index(HttpServletRequest request1) { // RequestFacade@5861
        Map<String, String[]> parameterMap = request.getParameterMap();
        return "index";
    }
}

方式二
使用RequestContextListener监听器,RequestContextListener实现ServletRequestListener监听器接口,该监听器监听HTTP请求事件,web服务器接收的每一次请求都会通知该监听器。
在web.xml中配置:

<listener>
  <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
HttpServletRequest request2 =
                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); // RequestFacade@5861

方式三
1、使用ThreadLocal来存放当前线程的HttpServletRequest

public class UserContext {
    /**
     * Servlet容器为每个Http请求分配一个工作线程,把每个用户的请求保存到自己的线程中
     */
    private static ThreadLocal<HttpServletRequest> tl = new ThreadLocal<>();

    public static void set(HttpServletRequest request) {
        tl.set(request);
    }

    public static HttpServletRequest get() {
        return tl.get();
    }
}

2、配置拦截器,将用户的请求保存到ThreadLocal中

public class LoginInterceptor implements HandlerInterceptor {
  @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 请求保存请求到当前线程中
        UserContext.set(request);
  }
  .....
}
posted @ 2022-03-18 11:52  1131012  阅读(660)  评论(0)    收藏  举报