一般我們會在InterceptorAdapter攔截器中對請求進行驗證
正常普通接口請求,request.getParameter()可以獲取,能多次讀取
如果我們的接口是用@RequestBody來接受數據,那麼我們在攔截器中
需要讀取request的輸入流 ,因爲 ServletRequest中getReader()和getInputStream()只能調用一次
這樣就會導致controller 無法拿到數據。
解決方法 :
1、自定義一個類 BodyReaderHttpServletRequestWrapper.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
import
java.io.BufferedReader;
import
java.io.ByteArrayInputStream;
import
java.io.IOException;
import
java.io.InputStreamReader;
import
javax.servlet.ReadListener;
import
javax.servlet.ServletInputStream;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletRequestWrapper;
import
org.springframework.util.StreamUtils;
/**
* @author WBG
* @date 2020/6/22 10:42
* @describe
*/
public
class
BodyReaderHttpServletRequestWrapper
extends
HttpServletRequestWrapper{
private
byte
[] requestBody =
null
;
//用於將流保存下來
public
BodyReaderHttpServletRequestWrapper(HttpServletRequest request)
throws
IOException {
super
(request);
requestBody = StreamUtils.copyToByteArray(request.getInputStream());
}
public
ServletInputStream getInputStream()
throws
IOException {
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
false
;
}
@Override
public
void
setReadListener(ReadListener readListener) {
}
};
}
@Override
public
BufferedReader getReader()
throws
IOException{
return
new
BufferedReader(
new
InputStreamReader(getInputStream()));
}
}
|
2、自定義 MyFilter 繼承Filter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
import
javax.servlet.*;
import
javax.servlet.http.HttpServletRequest;
import
java.io.BufferedReader;
import
java.io.IOException;
/**
* @author WBG
* @date 2020/6/22 14:32
* @describe
*/
public
class
MyFilter
implements
Filter {
@Override
public
void
init(FilterConfig filterConfig)
throws
ServletException {
System.out.println(
"開始"
);
}
@Override
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
(requestWrapper==
null
) {
chain.doFilter(request, response);
}
else
{
System.out.println(
"------------------------------請求報文----------------------------------"
);
System.out.println(getParamsFromRequestBody((HttpServletRequest) requestWrapper));
System.out.println(
"------------------------------請求報文----------------------------------"
);
chain.doFilter(requestWrapper, response);
}
}
/* *
* 獲取請求體內容
* @return
* @throws IOException
*/
private
String getParamsFromRequestBody(HttpServletRequest request)
throws
IOException {
BufferedReader br =
null
;
String listString =
""
;
try
{
br = request.getReader();
String str =
""
;
while
((str = br.readLine()) !=
null
) {
listString += str;
}
}
catch
(IOException e) {
e.printStackTrace();
}
return
listString;
}
@Override
public
void
destroy() {
System.out.println(
"destroy"
);
}
}
|
3、web.xm配置過濾器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<!--定義過濾器-->
<
filter
>
<!--定義過濾器攔截URL地址-->
<
filter-name
>test2</
filter-name
>
<!--過濾器的文件-->
<
filter-class
>com.zhhy.hy2000interface.utils.filter.MyFilter</
filter-class
>
</
filter
>
<
filter-mapping
>
<!--過濾器的名稱-->
<
filter-name
>test2</
filter-name
>
<!--過濾器負責攔截的URL-->
<!-- /* 會把所有的請求攔截下來 -->
<
url-pattern
>/*</
url-pattern
>
</
filter-mapping
>
|
(如果是Springboot,使用註解即可)