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 添加需要拦截的url
  • excludePathPatterns 添加不需要拦截的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参数只能获取一次的解决方案(参数拦截器 + 拦截器的注册)的主要内容,如果未能解决你的问题,请参考以下文章

从HttpServletRequest中获取body

黑马程序员javaweb教程:HttpServletRequest获取参数.doc

解决HttpServletRequest的输入流只能读取一次的问题

解决HttpServletRequest的输入流只能读取一次的问题

解决HttpServletRequest的输入流只能读取一次的问题

HttpServletRequest - 获取查询字符串参数,无表单数据