• 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;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在过滤器中传入的请求为包装类的对象就可以了

    MyRequest myReq = new MyRequest(req, pc);
    chain.doFilter(myReq, resp);
    myReq = null;
    
    • 1
    • 2
    • 3

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

    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 });
    	}
    	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    过滤器如下
    @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;
    	}
    	
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在接口内就可以获取到参数 name,即使用户没有传递

    @RestController
    @RequestMapping("/test")
    public class MyController {
    
    	@GetMapping
    	public String test(String name) {
    		return name;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    过滤器属于 Servlet,SpringBoot 要使用需要在启动类(Application) 中增加 @ServletComponentScan 注解,例如

    @SpringBootApplication
    @ServletComponentScan
    public class Application {
    	public static void main(String[] args) {
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    ROS | ros::NodeHandle
    实用指南:在Windows平台上搭建轻NAS,实现可道云私有云盘的内网穿透公网访问
    奥威BI做数据可视化大屏报表,不踩坑更省心
    【Python&GIS】解决GIS属性表、矢量字段乱码,中文乱码
    散装问答-总结(更新中)
    Python 获取当前容器 CPU 负载和内存
    GRACE-FO L2产品的发布说明 - 版本UTCSR RL-06.1产品
    SpringBoot携带Jre绿色部署项目_免安装Jdk[Linux服务器]
    从北京到南京:偶数在能源行业的数据迁移实践
    Git命令行学习笔记
  • 原文地址:https://blog.csdn.net/qq_41806966/article/details/124917507