@File
2020-01-30T08:53:48.000000Z
字数 3435
阅读 160
java
getReader()getInputStream():@RequestBody 获取请求体时调用的方法
/*** 模拟请求对象类*/public class ParameterRequestWrapper extends HttpServletRequestWrapper {/*** 请求体容器*/private byte[] body;/*** 实例化自定义的请求信息对象* @param request 原始请求信息* @param clazz 请求参数映射类* @param unaryOperator 参数重置策略* @param <E>* @throws IOException*/public <E> ParameterRequestWrapper(HttpServletRequest request, Class<E> clazz, UnaryOperator<E> unaryOperator) throws IOException {super(request);// 将 BufferedReader 装换成 json 字符串String json = StreamUtil.readText(request.getReader());// 赋予请求体内容body = getData(json,clazz,unaryOperator).getBytes();}@Overridepublic BufferedReader getReader() throws IOException {return new BufferedReader(new InputStreamReader(getInputStream()));}/*** 在使用@RequestBody注解的时候,其实框架是调用了getInputStream()方法* 重写获取请求体的方法* @return 请求体输入流* @throws IOException*/@Overridepublic ServletInputStream getInputStream() throws IOException {final ByteArrayInputStream bais = new ByteArrayInputStream(body);return new ServletInputStream() {@Overridepublic boolean isFinished() {return false;}@Overridepublic boolean isReady() {return false;}@Overridepublic void setReadListener(ReadListener readListener) {}@Overridepublic int read() throws IOException {return bais.read();}};}/*** 主要的参数替换逻辑* @param json 请求体json字符串* @param clazz 装载请求体的对象* @param unaryOperator 请求体参数替换策略* @return 最终的请求体json字符串*/private <E> String getData(String json, Class<E> clazz, UnaryOperator<E> unaryOperator){// 对象转json字符串return JSON.toJSONString(unaryOperator.apply(// json字符串转对象JSON.toJavaObject(JSON.parseObject(json), clazz)));}}
@Componentpublic class H5RequestFilter extends OncePerRequestFilter {@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {// 重写request请求信息ParameterRequestWrapper parameterRequestWrapper = new ParameterRequestWrapper(// 最初的请求对象request,// 请求体装载对象User.class,// 重置策略user -> {// 参数重写user.setUserName("李大爷");user.setAge(18);return user;});// 传入新的请求信息对象filterChain.doFilter(parameterRequestWrapper, response);}}
getParameter():取一个普通参数的方法getParameterValues():取一个数组参数的方法getParameterMap():取所有参数的方法
public class RequestWrapper extends HttpServletRequestWrapper {/*** 参数容器*/private Map<String, String[]> params = new HashMap<>();public RequestWrapper(HttpServletRequest request) {super(request);//将现有parameter传递给paramsthis.params.putAll(request.getParameterMap());}/*** 重写getParameter,代表参数从当前类中的map获取* @param name* @return*/@Overridepublic String getParameter(String name) {String[]values = params.get(name);if(values == null || values.length == 0) {return null;}return values[0];}/*** 重写getParameterMap,代表参数从当前类中的map获取* @return*/@Overridepublic Map<String, String[]> getParameterMap() {return this.params;}/*** 同上* @param name 参数名* @return*/@Overridepublic String[] getParameterValues(String name) {return params.get(name);}/*** 批量修改参数* @param extraParams 参数map对象*/public void addParameter(Map<String, Object> extraParams) {for (Map.Entry<String, Object> entry : extraParams.entrySet()) {addParameter(entry.getKey(), entry.getValue());}}/*** 添加参数,根据类型转换* @param name 参数名* @param value 参数值*/public void addParameter(String name, Object value) {if (value != null) {if (value instanceof String[]) {params.put(name, (String[]) value);} else if (value instanceof String) {params.put(name, new String[]{(String) value});} else {params.put(name, new String[]{String.valueOf(value)});}}}}