1. 程式人生 > >HttpServletRequest取請求體資料的問題

HttpServletRequest取請求體資料的問題

  之前公司做了一個專案,需要與app對接。因為做的是通用服務,app那邊是需要直接訪問的,這樣每次請求兩邊都需要一個憑證來完成一個互相認證的過程。說一下我們專案採用的方式吧,app那邊將請求引數進行一定規則的加密,生成一個sign值,與引數一起傳遞過來,然後後端在攔截器中同樣將引數按同樣的規則加密,對比sign值是否一致,一致則通過,同理,app那邊也是這樣的認證過程。討論好方案之後自然就是開始寫程式碼了。

  首先自然想到的是通過攔截器藍完成認證的過程。但是在測試過程中發現,攔截器都返回true了,卻到不了controller層。程式碼配置什麼的都沒問題,上網查資料才發現

request.getInputStream();  request.getReader(); request.getParameter();這些方法都只能被執行一次,再次執行就無效了。思路就是新建一個類A繼承HttpServletRequestWrapper並重寫getInputStream()方法,然後新建一個過濾器,將servletRequest替換成我們新建的類A。主要程式碼如下:

public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {

    private final String body;

    public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
        super(request);
        StringBuilder stringBuilder = new StringBuilder();
        BufferedReader bufferedReader 
= null; try { InputStream inputStream = request.getInputStream(); if (inputStream != null) { bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); char[] charBuffer = new char[128]; int bytesRead = -1;
while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { stringBuilder.append(charBuffer, 0, bytesRead); } } else { stringBuilder.append(""); } } catch (IOException ex) { throw ex; } finally { if (bufferedReader != null) { try { bufferedReader.close(); } catch (IOException ex) { throw ex; } } } body = stringBuilder.toString(); } @Override public ServletInputStream getInputStream() throws IOException { final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes()); ServletInputStream servletInputStream = new ServletInputStream() { public int read() throws IOException { return byteArrayInputStream.read(); } }; return servletInputStream; } @Override public BufferedReader getReader() throws IOException { return new BufferedReader(new InputStreamReader(this.getInputStream())); } public String getBody() { return this.body; } }
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        ServletRequest requestWrapper = null;
        if (request instanceof HttpServletRequest) {
            requestWrapper = new BodyReaderHttpServletRequestWrapper((HttpServletRequest) request);
        }
        if (null == requestWrapper) {
            chain.doFilter(request, response);
        } else {
            chain.doFilter(requestWrapper, response);
        }

    }