装饰者模式对@RequestBody,@RequestParam参数进行urldecode

先看postman的请求,图1用于给@RequestParam 发参数,图2用于给 @RequestBody发参数

 

 

 

 新建User类用于接收@RequestBody的参数

package com.seeyii.entity;

import java.util.Arrays;

/**
 * @PackageName:com.seeyii.entity
 * @Description:
 */
public class User {
    private String name;
    private int age;
    private String gender;
    private String[] hobby;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String[] getHobby() {
        return hobby;
    }

    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                ", hobby=" + Arrays.toString(hobby) +
                '}';
    }
}

controller代码

@PostMapping("/test")
    public String queryRewardCompany( @RequestBody User user,@RequestParam String name){
        System.out.println(user);
        System.out.println(name);
        return user.toString();
    }

  编写

HttpServletRequestWrapper的装饰者类
package com.seeyii.filter;

import com.alibaba.fastjson.JSONObject;

import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;
import java.net.URLDecoder;

/**
 * 重写 HttpServletRequestWrapper
 *
 */
public class MadeHttpServletRequestWrapper extends HttpServletRequestWrapper {

    // 构造方法
    public MadeHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
        super(request);
    }

    /*
     * @method getParameterValues
     * @Description 处理 @RequestParam传值类型的 参数解码
     * @param name
     * @return String[]
     **/
    public String[] getParameterValues(String name) {
        String[] parameterValues = super.getParameterValues(name);
        if(parameterValues != null){
            for (int i = 0; i < parameterValues.length; i++) {
                try {
                    parameterValues[i] = URLDecoder.decode(parameterValues[i], "utf-8");

                } catch (UnsupportedEncodingException e) {
                    parameterValues[i] = parameterValues[i];
                }

            }
        }
        return parameterValues;
    }

    /*
     * @method getRequestURI
     * @Description 处理 @PathVariable传值类型的 参数解码
     * @return String
     **/
    public String getRequestURI() {
        String requestURI= super.getRequestURI();
        try {
            return  URLDecoder.decode(requestURI, "utf-8");
        } catch (UnsupportedEncodingException e) {
            return  requestURI;
        }
    }

    /*
     * @method getInputStream
     * @Description 处理 @RequestBody传值类型的 参数解码
     * @return ServletInputStream
     **/
    public ServletInputStream getInputStream() throws IOException {
        ServletInputStream inputStream=super.getInputStream();
        try {
            BufferedReader streamReader = new BufferedReader( new InputStreamReader(inputStream, "UTF-8"));
            StringBuilder responseStrBuilder = new StringBuilder();
            String inputStr;
            while ((inputStr = streamReader.readLine()) != null)
                responseStrBuilder.append(URLDecoder.decode(inputStr, "utf-8"));

            JSONObject jsonObject = JSONObject.parseObject(responseStrBuilder.toString());
            String param= jsonObject.toJSONString();
            final ByteArrayInputStream bais=new ByteArrayInputStream(param.getBytes());
            return new ServletInputStream() {
                @Override
                public boolean isFinished() {
                    return false;
                }

                @Override
                public boolean isReady() {
                    return false;
                }

                @Override
                public void setReadListener(ReadListener readListener) {
                    throw new UnsupportedOperationException();
                }

                @Override
                public int read() throws IOException {
                    return bais.read();
                }
            };
        } catch (Exception e) {
            e.printStackTrace();
        }
        return inputStream;
    }
}

编写过滤器,对httpRequest请求进行过滤

package com.seeyii.filter;


import org.springframework.core.annotation.Order;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;


/**
 * 处理@RequestParam、  @PathVariable 、  @RequestBody 类型的参数解码
 * @author liudexin
 *
 */
@WebFilter(filterName = "decodeFilter",urlPatterns = {"/*"})
@Order(2)
public class DecodeFilter implements Filter {


    @Override
    public void destroy() {
    }

    @SuppressWarnings("unchecked")
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {

        //通过装饰器模式  为request对象添加解码功能
        if (true) {
            ServletRequest requestWrapper = new MadeHttpServletRequestWrapper(
                    (HttpServletRequest) request);
            chain.doFilter(requestWrapper, response);
        } else {
            chain.doFilter(request, response);
        }
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
    }
}

在启动类里添加

@ServletComponentScan("com.xxx.filter")将filter给spring管理
posted @ 2021-09-18 15:47  杨吃羊  阅读(453)  评论(0)    收藏  举报