HttpServletRequestReplacedFilter.java 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package com.yingying.tourist.request;
  2. import org.apache.commons.io.IOUtils;
  3. import org.springframework.core.annotation.Order;
  4. import org.springframework.stereotype.Component;
  5. import javax.servlet.*;
  6. import javax.servlet.annotation.WebFilter;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletRequestWrapper;
  9. import java.io.BufferedReader;
  10. import java.io.ByteArrayInputStream;
  11. import java.io.IOException;
  12. import java.io.InputStreamReader;
  13. /**
  14. * request.getInputStream()/getReader 只能获取一次的问题
  15. *
  16. * @author sks
  17. *
  18. */
  19. @Component
  20. @Order(1)
  21. @WebFilter(filterName = "HttpServletRequestReplacedFilter", urlPatterns = "/*")
  22. public class HttpServletRequestReplacedFilter implements Filter {
  23. @Override
  24. public void destroy() {
  25. // TODO Auto-generated method stub
  26. }
  27. @Override
  28. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  29. ServletRequest requestWrapper = null;
  30. if (request instanceof HttpServletRequest) {
  31. String contentType = request.getContentType();
  32. if (contentType != null && contentType.contains("application/json")) {
  33. requestWrapper = new BodyReaderHttpServletRequestWrapper((HttpServletRequest) request);
  34. }
  35. }
  36. if (null == requestWrapper) {
  37. chain.doFilter(request, response);
  38. } else {
  39. chain.doFilter(requestWrapper, response);
  40. }
  41. }
  42. @Override
  43. public void init(FilterConfig arg0) throws ServletException {
  44. // TODO Auto-generated method stub
  45. }
  46. private class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {
  47. private final byte[] rawData;
  48. public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
  49. super(request);
  50. rawData = IOUtils.toByteArray(request.getReader());
  51. }
  52. @Override
  53. public BufferedReader getReader() throws IOException {
  54. return new BufferedReader(new InputStreamReader(getInputStream()));
  55. }
  56. @Override
  57. public ServletInputStream getInputStream() throws IOException {
  58. final ByteArrayInputStream bais = new ByteArrayInputStream(rawData);
  59. return new ServletInputStream() {
  60. @Override
  61. public int read() throws IOException {
  62. return bais.read();
  63. }
  64. @Override
  65. public boolean isFinished() {
  66. return bais.available() == 0;
  67. }
  68. @Override
  69. public boolean isReady() {
  70. return true;
  71. }
  72. @Override
  73. public void setReadListener(ReadListener arg0) {
  74. throw new RuntimeException("Not implemented");
  75. }
  76. };
  77. }
  78. }
  79. }