Shiro 的 SessionId 是在什么时候设置到客户端的呢?

场景

在使用 Cors 进行跨域登录操作时,登陆一切正常,但客户端并没有添加 SessionId(Cookie 里面),不清楚发生了什么。。。

调用 js 代码:

fetch('http://localhost:8080/RMASystem/a/embeddedLogin', {
    method: 'POST',
    body: params,
})
    .then(res => res.json())
    .then(json => console.log(json))

返回的 json 数据:

{code: 200, message: "登录成功"}

后端 Java 代码基本如下:

/**
 * 用于内嵌页面进行登录
 *
 * @return 返回一个是否成功
 */
@RequestMapping(value = "${adminPath}/embeddedLogin", method = RequestMethod.POST)
@ResponseBody
public OperationResult embeddedLogin(
        HttpServletRequest request,
        HttpServletResponse response
) {
    final AuthenticationToken token = formAuthenticationFilter.createToken(request, response);
    try {
        systemAuthorizingRealm.doGetAuthenticationInfo(token);
        return OperationResult.buildSuccessResult("登录成功");
    } catch (Exception ex) {
        return OperationResult.buildErrorResult("登录失败");
    }
}

至于如何解决的跨域,只是在后台配置了一个拦截器:

在后台添加一个 Filter 过滤器

/**
 * 使用自定义的 Filter 拦截器实现跨域请求、
 * 适用于所有的 Java Web 项目并且不局限于某个框架
 * 注:此处的 @Component 仅为让 Spring 知道这个 Bean, 不然拦截器不会加载
 *
 * @author rxliuli
 */
public class CustomCorsFilterConfig implements Filter {
    @Override
    public void init(FilterConfig filterConfig) {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        //允许所有来源
        String allowOrigin = "*";
        //允许以下请求方法
        String allowMethods = "GET,POST,PUT,DELETE,OPTIONS";
        //允许以下请求头
        String allowHeaders = "Content-Type,X-Token";
        //允许有认证信息(cookie)
        String allowCredentials = "true";

        String origin = request.getHeader("Origin");
        //此处是为了兼容需要认证信息(cookie)的时候不能设置为 * 的问题
        response.setHeader("Access-Control-Allow-Origin", origin == null ? allowOrigin : origin);
        response.setHeader("Access-Control-Allow-Methods", allowMethods);
        response.setHeader("Access-Control-Allow-Credentials", allowCredentials);
        response.setHeader("Access-Control-Allow-Headers", allowHeaders);
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
    }
}

web.xml 文件中添加拦截器配置(注:如果可能就配置成第一个 Filter

<!--cors 跨域访问-->
<filter>
  <filter-name>customCorsFilterConfig</filter-name>
  <filter-class>CustomCorsFilterConfig</filter-class>
</filter>
<filter-mapping>
  <filter-name>customCorsFilterConfig</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

然而正常请求结束后并未在客户端的 cookie 中设置 SessionId,这是为什么呢?ヽ(・_・;)ノ

阅读 3.1k
2 个回答

现在问题解决了,还是客户端的请求没有设置正确,只要需要带上/返回 认证信息 的请求都必须添加参数 credentials

现在的请求大概是这样的:

fetch('http://localhost:8089/test/setSession', {
    credentials: "include"
})
    .then(res => res.json())
    .then(json => console.log(json))

shiro 注册了过滤器一类的东西去操作这些,话说 session id 不是 web 容器 在负责吗。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题