先看一下最后的执行结果:
发起请求
添加额外参数后的返回结果
请求的接口及控制台打印的信息
@PostMapping("/user/userInfo") public JSONObject findUserInfo(@RequestBody JSONObject jsonObject){ logger.info("最终请求的参数:【{}】", jsonObject.toJSONString()); return jsonObject; }
代码实现:
创建ProjectFilter过滤器,实现Filter接口
import com.alibaba.fastjson.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Configuration; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.io.PrintWriter; /** * @author chuan * @title: ProjectFilter * @description: TODO(创建过滤器) * @date 2019/9/21 10:35 */ @Configuration public class ProjectFilter implements Filter{ private static Logger logger = LoggerFactory.getLogger(ProjectFilter.class); @Override public void init(FilterConfig filterConfig) throws ServletException { logger.info("data init ..."); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { /** * 创建ParamMangerCentreWrapper对象,继承HttpServletRequestWrapper * 可以通过构造方法传多个我们需要的参数 */ ParamMangerCentreWrapper paramMangerCentreWrapper = null; if(servletRequest instanceof HttpServletRequest) { try { paramMangerCentreWrapper = new ParamMangerCentreWrapper((HttpServletRequest) servletRequest); } catch (Exception e) { // 处理失败返回的信息 JSONObject jsonResult = new JSONObject(); jsonResult.put("code", "1001"); jsonResult.put("message", "请求失败!"); servletResponse.setCharacterEncoding("utf-8"); servletResponse.setContentType("application/json; charset=utf-8"); PrintWriter writer = servletResponse.getWriter(); writer.write(jsonResult.toJSONString()); return; } } if(null == paramMangerCentreWrapper) { filterChain.doFilter(servletRequest,servletResponse); } else { filterChain.doFilter(paramMangerCentreWrapper,servletResponse); } } @Override public void destroy() { logger.info("data destroy ..."); } }
创建ParamMangerCentreWrapper对象,继承HttpServletRequestWrapper类
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import org.apache.commons.lang3.StringUtils; import javax.servlet.ReadListener; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.Random; /** * @author chuan * @title: ParamMangerCentreWrapper * @description: TODO(请求添加额外参数) * @date 2019/9/21 11:06 */ public class ParamMangerCentreWrapper extends HttpServletRequestWrapper { /** * 随机数中间值 */ private static final int RANDOM_MIDDLE_VALUE = 5; private byte[] body; public ParamMangerCentreWrapper(HttpServletRequest request) throws IOException { super(request); JSONObject jsonObject = null; JSONArray jsonArray = null; BufferedReader br = request.getReader(); String str = ""; String inputLine; while ((inputLine = br.readLine()) != null) { str += inputLine; } if (StringUtils.isNotEmpty(str)) { try { jsonObject = JSONObject.parseObject(str); } catch (Exception e) { // TODO: handle exception jsonArray = JSONArray.parseArray(str); } } if(jsonObject != null) { // 额外添加的参数,实际开发中可查询接口返回数据 jsonObject.put("email","TS10001@test.com"); jsonObject.put("address"," 北京上海广州"); jsonObject.put("phone","1823901000X"); // 随机数模拟请求失败 int i = new Random().nextInt(10); if (i > RANDOM_MIDDLE_VALUE){ throw new RuntimeException("请求失败!"); } } if(jsonObject == null) { body = jsonArray.toJSONString().getBytes(); }else { body = JSON.toJSONString(jsonObject).getBytes(); } } @Override public BufferedReader getReader() throws IOException { return new BufferedReader(new InputStreamReader(getInputStream())); } @Override public ServletInputStream getInputStream() throws IOException { ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body); return new ServletInputStream() { @Override public int read() throws IOException { return byteArrayInputStream.read(); } @Override public boolean isFinished() { return false; } @Override public boolean isReady() { return false; } @Override public void setReadListener(ReadListener readListener) {} }; } }
创建UserController
/** * @author chuan * @title: UserController * @description: TODO(用户中心) * @date 2019/9/21 10:34 */ @RestController public class UserController { private static Logger logger = LoggerFactory.getLogger(UserController.class); @PostMapping("/user/userInfo") public JSONObject findUserInfo(@RequestBody JSONObject jsonObject){ logger.info("最终请求的参数:【{}】", jsonObject.toJSONString()); return jsonObject; } }
小结:
HttpServletRequestWrapper是HttpServletRequest的一个实现类,所以可以用HttpServletRequestWrapper替换HttpServletRequest,如果打开ServletRequestWrapper的源码 ,我们就会看到ServletRequestWrapper 采取了适配器模式,实际上内部操作的就是构造方法中传递的ServletRequest。
同理:HttpServletResponseWrapper可以在response输出页面内容之前,进行页面内容的过滤等操作。比如知名的页面装饰框架sitemesh,就是利用filter过滤器先截获返回给客户端的页面,然后分析html代码并最终装饰页面效果后返回给客户端。