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;

与请求参数有关联的有四个函数

  1. getParameterNames
  2. getParameterValues
  3. getParameterMap
  4. 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

springboot跨域请求设置,且允许js请求携带cookies

nginx设置代理后端服务器增加前缀

nginx设置代理后端服务器增加前缀

spring cloud zuul filter 设置过滤请求