HttpServletRequest参数只能获取一次的解决方案(参数拦截器 + 拦截器的注册)
Posted 364.99°
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HttpServletRequest参数只能获取一次的解决方案(参数拦截器 + 拦截器的注册)相关的知识,希望对你有一定的参考价值。
因为 HttpServletRequest的输入流只能读取一次(在整个项目中只能读取到一次),所以,需要做一些处理来存储 HttpServletRequest。
1.参数拦截器
可以定义一个参数拦截器类来获取参数,并存储
创建我们自己的拦截器类并实现 HandlerInterceptor 接口:
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
@Slf4j
@Component
public class ParamsInterceptor implements HandlerInterceptor
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
Map<String, Object> data = DataUtil.reqDataTransfer(request);
request.setAttribute(MyConstant.SYSTEM_PARAMS_KEY, data);
return true;
public interface MyConstant
String SYSTEM_PARAMS_KEY = "__chen_508_";
2.WebMvcConfigurer
实现WebMvcConfigurer接口中的addInterceptors方法把自定义的拦截器类添加进来
@Slf4j
@Configuration
public class WebMvcConfig implements WebMvcConfigurer
/*
@Bean
public HandlerInterceptor getParamsInterceptor()
return new ParamsInterceptor ();
*/
/**
* 添加拦截器
*/
@Override
public void addInterceptors(InterceptorRegistry registry)
// 参数拦截
InterceptorRegistration paramsInterceptor = registry.addInterceptor(new ParamsInterceptor());
paramsInterceptor.addPathPatterns("/stat/**")
.addPathPatterns("/api/fst/**")
.excludePathPatterns("/api/pay/**");
addPathPatterns
添加需要拦截的urlexcludePathPatterns
添加不需要拦截的url
3.分析
当完成上述两个步骤之后,对应的url请求就会被拦截,然后ParamsInterceptor拦截器会获取request的数据,并把数据存储到data中。
需要获取request参数的时候,需要使用getAttribute
。
public ResultBean getTablesData(HttpServletRequest request)
ResultBean resultBean = new ResultBean();
// 获取请求参数
Map<String, Object> params = (Map<String, Object>) request.getAttribute(MyConstant.SYSTEM_PARAMS_KEY);
......
至于拦截器和WebMvcConfigurer的依赖,就用spring-boot-starter-web
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
以上是关于HttpServletRequest参数只能获取一次的解决方案(参数拦截器 + 拦截器的注册)的主要内容,如果未能解决你的问题,请参考以下文章
黑马程序员javaweb教程:HttpServletRequest获取参数.doc
解决HttpServletRequest的输入流只能读取一次的问题
解决HttpServletRequest的输入流只能读取一次的问题