SpringBoot 过滤器代理请求,增加设置请求参数的函数 setParameter
Posted HackShendi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot 过滤器代理请求,增加设置请求参数的函数 setParameter相关的知识,希望对你有一定的参考价值。
Hi, I’m Shendi
敲代码的时候,总是会做大大小小的封装来提升敲代码的效率
当编写接口的时候,发现有一个参数很多接口都需要使用,并且这个参数使用前都需要经过同样的处理,如果不做封装,就会在需要使用的接口处都复制一段代码,非常麻烦
于是可以编写一个过滤器,设置请求参数,当参数到具体接口时,已经被处理过了
但是 Servlet 的请求 (Request)并未提供设置参数的函数,当获取参数 Map,并 put 参数时,会报错,于是只能通过代理的方式实现
HttpServletRequestWrapper 类,请求的包装类
新建一个类继承此类,就可以重写对应函数
例如
public class MyRequest extends HttpServletRequestWrapper
public MyRequest(HttpServletRequest req, String pc)
super(req);
this.pc = pc;
在过滤器中传入的请求为包装类的对象就可以了
MyRequest myReq = new MyRequest(req, pc);
chain.doFilter(myReq, resp);
myReq = null;
与请求参数有关联的有四个函数
- getParameterNames
- getParameterValues
- getParameterMap
- getParameter
经过测试,SpringBoot 项目传递参数到函数使用的是 getParameterValues 函数,于是重写此函数即可
非SpringBoot项目根据需求重写对应函数即可
最终,包含设置参数的封装代码如下
import java.util.HashMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
/**
* 自定义请求, 代理请求.
* <br>
* 目前包含设置请求参数的功能.
* <br>
* 创建时间 2022年5月22日
* @author Shendi <a href='tencent://AddContact/?fromId=45&fromSubId=1&subcmd=all&uin=1711680493'>QQ</a>
*/
public class MyRequest extends HttpServletRequestWrapper
/** 包含设置的请求参数 */
private HashMap<String, String[]> map = new HashMap<>();
public MyRequest(HttpServletRequest req)
super(req);
@Override
public String[] getParameterValues(String name)
// 如果参数在 map 内有, 优先 map
if (map.containsKey(name))
return map.get(name);
return super.getParameterValues(name);
/**
* 设置请求参数.
* <br>
* 创建时间 2022年5月22日
* @author Shendi <a href='tencent://AddContact/?fromId=45&fromSubId=1&subcmd=all&uin=1711680493'>QQ</a>
* @param key 参数名称
* @param value 值
*/
public void setParameter(String key, String value)
map.put(key, new String[] value );
过滤器如下
@WebFilter("/*")
public class MyFilter extends HttpFilter
private static final long serialVersionUID = 1L;
@Override
protected void doFilter(HttpServletRequest req, HttpServletResponse resp, FilterChain chain) throws IOException, ServletException
MyRequest myReq = new MyRequest(req);
myReq.setParameter("name", "Shendi");
chain.doFilter(myReq, resp);
myReq = null;
在接口内就可以获取到参数 name,即使用户没有传递
@RestController
@RequestMapping("/test")
public class MyController
@GetMapping
public String test(String name)
return name;
过滤器属于 Servlet,SpringBoot 要使用需要在启动类(Application) 中增加 @ServletComponentScan 注解,例如
@SpringBootApplication
@ServletComponentScan
public class Application
public static void main(String[] args)
以上是关于SpringBoot 过滤器代理请求,增加设置请求参数的函数 setParameter的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot 过滤器代理请求,增加设置请求参数的函数 setParameter
springboot跨域请求设置,且允许js请求携带cookies