[关闭]
@File 2020-01-30T08:53:48.000000Z 字数 3435 阅读 86

spring 重写请求对象

java


概要

  1. 通过 HttpServletRequestWrapper 重写一个 HttpServletRequest
  2. 通过过滤器提前吧 HttpServletRequest 换成自定义的 HttpServletRequestWrapper

一、重写 POST 请求体参数案例

1. 预定义一个继承 HttpServletRequestWrapper

  1. /**
  2. * 模拟请求对象类
  3. */
  4. public class ParameterRequestWrapper extends HttpServletRequestWrapper {
  5. /**
  6. * 请求体容器
  7. */
  8. private byte[] body;
  9. /**
  10. * 实例化自定义的请求信息对象
  11. * @param request 原始请求信息
  12. * @param clazz 请求参数映射类
  13. * @param unaryOperator 参数重置策略
  14. * @param <E>
  15. * @throws IOException
  16. */
  17. public <E> ParameterRequestWrapper(HttpServletRequest request, Class<E> clazz, UnaryOperator<E> unaryOperator) throws IOException {
  18. super(request);
  19. // 将 BufferedReader 装换成 json 字符串
  20. String json = StreamUtil.readText(request.getReader());
  21. // 赋予请求体内容
  22. body = getData(json,clazz,unaryOperator).getBytes();
  23. }
  24. @Override
  25. public BufferedReader getReader() throws IOException {
  26. return new BufferedReader(new InputStreamReader(getInputStream()));
  27. }
  28. /**
  29. * 在使用@RequestBody注解的时候,其实框架是调用了getInputStream()方法
  30. * 重写获取请求体的方法
  31. * @return 请求体输入流
  32. * @throws IOException
  33. */
  34. @Override
  35. public ServletInputStream getInputStream() throws IOException {
  36. final ByteArrayInputStream bais = new ByteArrayInputStream(body);
  37. return new ServletInputStream() {
  38. @Override
  39. public boolean isFinished() {
  40. return false;
  41. }
  42. @Override
  43. public boolean isReady() {
  44. return false;
  45. }
  46. @Override
  47. public void setReadListener(ReadListener readListener) {
  48. }
  49. @Override
  50. public int read() throws IOException {
  51. return bais.read();
  52. }
  53. };
  54. }
  55. /**
  56. * 主要的参数替换逻辑
  57. * @param json 请求体json字符串
  58. * @param clazz 装载请求体的对象
  59. * @param unaryOperator 请求体参数替换策略
  60. * @return 最终的请求体json字符串
  61. */
  62. private <E> String getData(String json, Class<E> clazz, UnaryOperator<E> unaryOperator){
  63. // 对象转json字符串
  64. return JSON.toJSONString(unaryOperator.apply(
  65. // json字符串转对象
  66. JSON.toJavaObject(JSON.parseObject(json), clazz)
  67. ));
  68. }
  69. }

2. 在过滤器中修改请求对象参数

  1. @Component
  2. public class H5RequestFilter extends OncePerRequestFilter {
  3. @Override
  4. protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
  5. // 重写request请求信息
  6. ParameterRequestWrapper parameterRequestWrapper = new ParameterRequestWrapper(
  7. // 最初的请求对象
  8. request,
  9. // 请求体装载对象
  10. User.class,
  11. // 重置策略
  12. user -> {
  13. // 参数重写
  14. user.setUserName("李大爷");
  15. user.setAge(18);
  16. return user;
  17. }
  18. );
  19. // 传入新的请求信息对象
  20. filterChain.doFilter(parameterRequestWrapper, response);
  21. }
  22. }

二、重写普通参数案例

1. 预定义一个继承 HttpServletRequestWrapper

  1. public class RequestWrapper extends HttpServletRequestWrapper {
  2. /**
  3. * 参数容器
  4. */
  5. private Map<String, String[]> params = new HashMap<>();
  6. public RequestWrapper(HttpServletRequest request) {
  7. super(request);
  8. //将现有parameter传递给params
  9. this.params.putAll(request.getParameterMap());
  10. }
  11. /**
  12. * 重写getParameter,代表参数从当前类中的map获取
  13. * @param name
  14. * @return
  15. */
  16. @Override
  17. public String getParameter(String name) {
  18. String[]values = params.get(name);
  19. if(values == null || values.length == 0) {
  20. return null;
  21. }
  22. return values[0];
  23. }
  24. /**
  25. * 重写getParameterMap,代表参数从当前类中的map获取
  26. * @return
  27. */
  28. @Override
  29. public Map<String, String[]> getParameterMap() {
  30. return this.params;
  31. }
  32. /**
  33. * 同上
  34. * @param name 参数名
  35. * @return
  36. */
  37. @Override
  38. public String[] getParameterValues(String name) {
  39. return params.get(name);
  40. }
  41. /**
  42. * 批量修改参数
  43. * @param extraParams 参数map对象
  44. */
  45. public void addParameter(Map<String, Object> extraParams) {
  46. for (Map.Entry<String, Object> entry : extraParams.entrySet()) {
  47. addParameter(entry.getKey(), entry.getValue());
  48. }
  49. }
  50. /**
  51. * 添加参数,根据类型转换
  52. * @param name 参数名
  53. * @param value 参数值
  54. */
  55. public void addParameter(String name, Object value) {
  56. if (value != null) {
  57. if (value instanceof String[]) {
  58. params.put(name, (String[]) value);
  59. } else if (value instanceof String) {
  60. params.put(name, new String[]{(String) value});
  61. } else {
  62. params.put(name, new String[]{String.valueOf(value)});
  63. }
  64. }
  65. }
  66. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注