天天看點

Spring攔截器從Request中擷取Json格式的資料

7 package com.newpp.core.interceptor;
 8 
 9 import java.io.BufferedReader;
10 import java.io.ByteArrayInputStream;
11 import java.io.IOException;
12 import java.io.InputStream;
13 import java.io.InputStreamReader;
14 
15 import javax.servlet.ServletInputStream;
16 import javax.servlet.http.HttpServletRequest;
17 import javax.servlet.http.HttpServletRequestWrapper;
18 
19 /**
20  * MyRequestWrapper.
21  * 
22  * @author havery
23  */
24 public class MyRequestWrapper extends HttpServletRequestWrapper {
25     private final String body;
26 
27     public MyRequestWrapper(HttpServletRequest request) throws IOException {
28         super(request);
29         StringBuilder stringBuilder = new StringBuilder();
30         BufferedReader bufferedReader = null;
31         try {
32             InputStream inputStream = request.getInputStream();
33             if (inputStream != null) {
34                 bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
35                 char[] charBuffer = new char[128];
36                 int bytesRead = -1;
37                 while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
38                     stringBuilder.append(charBuffer, 0, bytesRead);
39                 }
40             } else {
41                 stringBuilder.append("");
42             }
43         } catch (IOException ex) {
44             throw ex;
45         } finally {
46             if (bufferedReader != null) {
47                 try {
48                     bufferedReader.close();
49                 } catch (IOException ex) {
50                     throw ex;
51                 }
52             }
53         }
54         body = stringBuilder.toString();
55     }
56 
57     @Override
58     public ServletInputStream getInputStream() throws IOException {
59         final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());
60         ServletInputStream servletInputStream = new ServletInputStream() {
61             public int read() throws IOException {
62                 return byteArrayInputStream.read();
63             }
64         };
65         return servletInputStream;
66     }
67 
68     @Override
69     public BufferedReader getReader() throws IOException {
70         return new BufferedReader(new InputStreamReader(this.getInputStream()));
71     }
72 
73     public String getBody() {
74         return this.body;
75     }
76 }      

2.取值

MyRequestWrapper myRequestWrapper = new MyRequestWrapper((HttpServletRequest) request);
        String body = myRequestWrapper.getBody();      

2、繼承HttpServletRequestWrapper 和HttpServletResponse 兩個類對 getParameter(String str) 和getWrite()兩方法進行重寫,而方法中實作我們想要的操作

3、使用Filter過濾器,我們知道Filter是在請求到達servlet之前和servlet響應資訊到達浏覽器之前進行兩次攔截,而就在到達server之前我們将FilterChain的doFilter(request,reponse)方法的request參數替換為我們裝飾後的request而我們又重寫的getParameter(String str)方法,之後調用的就是這個方法,是以也就完成了

請求參數的過濾和修改

4、響應和請求其實是一樣的,也是替換了Response對象,進而調用我們重寫的方法實