装饰者模式对@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管理
浙公网安备 33010602011771号