【接口】接口调用报错,Redirect is not allowed for a preflight request
场景:前端Vue项目请求后端接口,有的接口能够调通,有的接口调不通,并且报错。问题描述前端报跨域问题的错误,调不通。request doesn’t pass access control check: Redirect is not allowed for a preflight request.原因分析:首先,排查后端接口是否收到请求,通过本地调试,接口有收到请求。但在Shiro拦截器中被拦截掉
·
场景:
前端Vue项目请求后端接口,有的接口能够调通,有的接口调不通,并且报错。
问题描述
前端报跨域问题的错误,调不通。
request doesn’t pass access control check: Redirect is not allowed for a preflight request.
原因分析:
- 首先,排查后端接口是否收到请求,通过本地调试,接口有收到请求。
- 但在Shiro拦截器中被拦截掉,通过断点排查。发现请求一般会有2次,第一次是OPTIONS,第二次才是GET或POST。
- 在代码中获取sessionId的时候,OPTIONS的Header中没获取到Token,结果OPTIONS请求失败,导致第二次请求直接失败。
protected Serializable getSessionId(ServletRequest request, ServletResponse response) {
String id = WebUtils.toHttp(request).getHeader(LOGIN_TOKEN_KEY);
System.out.println(WebUtils.toHttp(request).getRequestURI());
if (!StringUtils.isEmpty(id)) {
request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, id);
return id;
} else {
return super.getSessionId(request, response);
}
}
解决方案:
思路:在Shiro拦截器中,添加放开OPTIONS请求。
- 新建
ShiroUserFilter
public class ShiroUserFilter extends UserFilter {
@Override
protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {
// 在访问过来的时候检测是否为OPTIONS请求,如果是就直接返回true
HttpServletRequest httpRequest = (HttpServletRequest) request;
if (httpRequest.getMethod().equals(RequestMethod.OPTIONS.name())) {
return true;
}
return super.preHandle(request, response);
}
}
- 在
ShiroConfig
添加拦截器
// 必须放在authc前面
Map<String, Filter> filters = shiroFilterFactoryBean.getFilters();
// 注意这里不要用Bean的方式,否则会报错
filters.put("authc", new ShiroUserFilter());
shiroFilterFactoryBean.setFilters(filters);
filterChainDefinitionMap.put("/admin/**", "authc");
- 运行起来,尝试接口调用,OPTIONS成功放开
更多推荐
已为社区贡献1条内容
所有评论(0)