自定義MyHttpServletRequest解決過濾器攔截@RequestBody整體JSON請求問題


package information;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.springframework.util.StreamUtils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper {

    private byte[] requestBody = null;

    // 傳入是JSON格式 轉換成JSONObject
    public JSONObject getRequestBody() throws UnsupportedEncodingException {
        return JSON.parseObject((new String(requestBody, "UTF-8")));
    }

    public void setRequestBody(JSONObject jsonObject) throws UnsupportedEncodingException {
        this.requestBody = jsonObject.toJSONString().getBytes("UTF-8");
    }

    public MyHttpServletRequestWrapper(HttpServletRequest request) {

        super(request);

        try {
            requestBody = StreamUtils.copyToByteArray(request.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {
        if (requestBody == null) {
            requestBody = new byte[0];
        }
        final ByteArrayInputStream bais = new ByteArrayInputStream(requestBody);
        return new ServletInputStream() {
            @Override
            public int read() throws IOException {
                return bais.read();
            }

            @Override
            public boolean isFinished() {
                return false;
            }

            @Override
            public boolean isReady() {
                return true;
            }

            @Override
            public void setReadListener(ReadListener listener) {

            }
        };
    }

    @Override
    public BufferedReader getReader() throws IOException {
        return new BufferedReader(new InputStreamReader(getInputStream()));
    }
}

  代碼如上。

  自定義過濾器攔截到作為一個整體的JSON格式的請求以后,如果要讀取內容就必須調用request.getInputStream()獲取輸入流來讀取。但是這個方法在定義的時候因為不能調用reset方法,所以實際上調用一次以后,流讀取到了結束無法再次讀取,導致以后的請求無法獲取到參數。

  這里使用了一個自定義的HttpServletRequest來保存一下請求的內容,之后doChain連鎖把這個丟進去就好了。

  封裝了JSONObject的轉換,直接調用對應方法就可以修改請求參數內容了。

 

  參考:http://huangqiqing123.iteye.com/blog/2237263


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM