记录一次session做登录记录,写拦截器做权限验证时遇到的问题
问题发生前提
- 登录之后写session作为登录状态记录
- 写拦截器拦截所以请求
- 某些接口有自定义注解@loginrequired(require=””,role=?)
- 当required为ture,必须要登录,role为用户权限,低于某种权限不允许访问
具体问题
- 跨域问题
- login、logout接口可以正常使用sessionid一致,get即权限验证接口sessionid不一致
解决办法
跨域
在继承HandlerInterceptorAdapter的子类拦截器的preHandle方法里面对response设置header:
1
2
3
4
5
6
7
8
9// 请求跨域
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
// response.setHeader("Access-Control-Allow-Origin", "*");
// 允许携带 用户认证凭据(也就是允许客户端发送的请求携带Cookie)
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, PATCH, DELETE, PUT");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");在WebMvcConfigurer实现类webConfig里面重写对跨域的处理
1
2
3
4
5
6
7
8
9// 设置跨域访问
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "HEAD", "POST", "PUT", "PATCH", "DELETE", "OPTIONS", "TRACE")
// 允许携带 用户认证凭据(也就是允许客户端发送的请求携带Cookie)
.allowCredentials(true);
}直接在方法上面使用@CrossOrigin注解
客户端请求的时候需要携带Cookie,也就是下面一个问题了
客户端请求是携带身份验证
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16$.ajax({
url: "http://127.0.0.1:8080/sys/user/get",
method: "POST",
data: userName,
//携带cookie
xhrFields: {
withCredentials: true
},
success: function(data){
console.log(data);
},
error: function(data){
console.log("error:" + data.data);
}
})