攔截器獲取request的值之後,Controller拿不到值

原因:

在Spring中request的只能被獲取一次,攔截器獲取之後就會導致Controller拿不到值

解決方法:

將request的值進行備份,請求到達Controller的時候就會拿到這個值

  1. 創建一個自己的HttpServletRequestWrapper並繼承servlet的HttpServletRequestWrapper,爲了備份request中的 值。
    public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper {
    
        private final byte[] buff;
    
        public MyHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
            super(request);
            InputStream is = request.getInputStream();
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] b = new byte[1024];
            int len;
            while ((len = is.read(b)) != -1) {
                baos.write(b, 0, len);
            }
            buff = baos.toByteArray();
        }
    
        @Override
        public ServletInputStream getInputStream() throws IOException {
            final ByteArrayInputStream bais = new ByteArrayInputStream(buff);
            return new ServletInputStream() {
                @Override
                public int read() throws IOException {
                    return bais.read();
                }
            };
        }
    
        @Override
        public BufferedReader getReader() throws IOException {
            return new BufferedReader(new InputStreamReader(getInputStream()));
        }
    }

     

  2. 創建一個Filter,將該攔截器配置在項目中,爲了調用備份的HttpServletRequestWrapper
    public class MyRequestBodyFilter implements Filter {
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
            servletRequest = new MyHttpServletRequestWrapper(httpServletRequest);
            filterChain.doFilter(servletRequest, servletResponse);
        }
    
        @Override
        public void destroy() {
    
        }
    }

     

  3. 創建一個工具類,在攔截器中獲取request的值
    public class RequestUtils {
    
        public static String getRequestValue(HttpServletRequest request) throws IOException {
            StringBuffer sb = new StringBuffer();
            MyHttpServletRequestWrapper myHttpServletRequestWrapper = new MyHttpServletRequestWrapper(request);
            InputStream is = myHttpServletRequestWrapper.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String str;
            while ((str = br.readLine()) != null) {
                sb.append(str);
            }
            return sb.toString();
        }
    
    }

     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章