引言
在HTTP请求中,除了在queryString或者Body中携带请求参数,还可以通过请求头携带信息。
使用请求头有两种方式,一种是自定义请求头参数,一种是设置Cookie,前者是客户端设置,后者是服务端设置。
1.自定义请求头参数
前段通过ajax请求携带,后端可以获取
请求中携带
$.ajax({
type: "GET",
headers: { // 这里可以是自定义请求头,也可以是规范请求头字段
Accept: "application/json; charset=utf-8",
auth_token: "XXXX"
},
withCredentials: true,
url: "http://localhost:8080/api/getUserInfo",
data: {"tel":"1323456"},
contentType: "application/json",
dataType: "json",
success: function (data) {},
error: function (data) {}
});
服务端获取
String authToken = request.getHeader("auth_token");
注意,服务端无法对Header进行修改
可以对自定义header设置多个值,服务端获取的时候,会得到第一个值,即最先设置的值,因为header是一个数组,获取的时候是通过便利的方式获取的
org.apache.tomcat.util.http.MimeHeaders#getValue(java.lang.String)
public MessageBytes getValue(String name) {
for (int i = 0; i < count; i++) {
if (headers[i].getName().equalsIgnoreCase(name)) {
return headers[i].getValue();
}
}
return null;
}
2.设置Cookie
服务端在响应的时候设置Cookie,在cookie有效期内,且cookie path允许的情况下,请求端在下次请求的时候,会自动携带本次响应的Cookie,服务端可通过request获取
// 设置Cookie
Cookie userCookie = new Cookie("user_cookie", token);
userCookie.setPath("/");
response.addCookie(userCookie);
// 获取Cookie
for (Cookie cookie : request.getCookies()) {
String name = cookie.getName();
}
不同path,相同名称的Cookie可以共存,相同path不同名称的Cookie,最新设置的会覆盖之前设置的
在拦截器中修改request和response
在preHandle中可以修改response,在postHandle中不能修改response,因为此时response已经提交,无法修改。