springmvc+shiro 同一会话,后台获取的sessionid不一致问题

问题描述:

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就会正常执行。

你可能感兴趣的:(知新,前端,shiro,session)