场景
在使用 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
,这是为什么呢?ヽ(・_・;)ノ
现在问题解决了,还是客户端的请求没有设置正确,只要需要带上/返回 认证信息 的请求都必须添加参数
credentials
。现在的请求大概是这样的: