问题描述:
1、表现为:SecurityUtils.getSubject().getPrincipal()为null,获取不到登录用户信息。
2、debug发现后台接收到的sessionid不一致,就是说,对于shiro来说,每个url都是一个新的会话,因此拿不到用户信息。
问题产生的原因还是是因为跨域。
解决办法:
1、shiro正常配置(略);
2、后端设置跨域;
3、前端设置withCredentials = true
后端设置跨域:我设置的是我自己8085
public class CorsFilter implements Filter {
public CorsFilter() {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpServletRequest request = (HttpServletRequest) servletRequest;
response.setHeader("Access-Control-Allow-Origin", "http://localhost:8085");
response.setHeader("Access-Control-Allow-Methods", "GET,POST,DELETE,PUT,OPTIONS");
response.setHeader("Access-Control-Max-Age", "86400");
// 为true时Access-Control-Allow-Origin不能为*
response.setHeader("Access-Control-Allow-Credentials", "true");
// 此处为允许请求携带的所以请求头,如果要限制,可自行定义
response.setHeader("Access-Control-Allow-Headers", request.getHeader("Access-Control-Request-Headers"));
filterChain.doFilter(request, response);
}
@Override
public void init(FilterConfig fConfig) throws ServletException {
}
@Override
public void destroy() {
}
}
PS:需要注意的是
// 为true时Access-Control-Allow-Origin不能为*
response.setHeader("Access-Control-Allow-Credentials", "true");
前端设置:我这里是agaular,vue项目或者别的前端自行搜索设置withCredentials 即可
app.config(["$httpProvider", function($httpProvider) {
if (!$httpProvider.defaults.headers.get) {
$httpProvider.defaults.headers.get = {};
}
$httpProvider.defaults.withCredentials = true;
// 禁用 IE AJAX 请求缓存
$httpProvider.defaults.headers.get['If-Modified-Since'] = new Date().getTime();
$httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';
$httpProvider.defaults.headers.get['Pragma'] = 'no-cache';
}]);
PS:重点就一句话,其余的可以忽略
$httpProvider.defaults.withCredentials = true;
这样访问的时候就可以保证sessionid一致,问题解决。
再贴一下jQuery里面的:
$(function() {
$.ajax({
type: "get",
url: baseUrl + "xxx",
xhrFields: {
withCredentials: true
},
cache: false,
success: function(data) {
localStorage.lastname = (data.object.name).substring(0, 5);
localStorage.userparentid = data.object.parentid;
$("#loginname").html(localStorage.lastname);
}
});
});
设置:
xhrFields: {
withCredentials: true
},
每个人遇到的问题原因可能各不相同,但是解决思路就是前后端保持一致,这样就能保证sessionid一致,shiro就会正常执行。