【发布时间】:2018-01-03 00:02:50
【问题描述】:
我们正在使用 Spring Restful、oAuth、MVC 服务器端,如果服务器和 Web 应用程序在同一台服务器上运行,它可以正常工作。
我们在不同的域中运行服务器和 Web 应用程序,我们面临无效会话错误。
当我们发出呼叫后浏览器发出 OPTIONS 请求时,立即发出呼叫失败。
我们启用了 CORS 过滤器,因此 OPTIONS 调用返回 200,但它使当前会话无效,因此下一个 post 调用失败。
我们没有发送 OPTIONs 请求,所以它直到拦截器仍然无效会话才到达。
我们尝试了以下解决方案:
- 分派 OPTIONS 请求并在拦截器中处理它。它创建新会话但无法存储它的持久性。所以还是失败了
- 在查询参数中发送自定义访问令牌标头和会话 Cookie,但我们无法在 JavaScript 中访问会话 cookie。
我试图避免在 OPTIONS 请求上创建新会话,请告诉我们如何在 Spring 或 Tomcat 中避免。
我们还需要为混合移动应用程序支持此解决方案(因为它不支持 cookie)。
启用 CORS:
在 web.xml 中:
<filter>
<filter-name>CORSFilter</filter-name>
<filter-class>com.tip.uiux.service.framework.CORSFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CORSFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在 CORSFilter.java 中
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("X-Frame-Options", "DENY");
response.setHeader("Access-Control-Allow-Methods","POST, GET, HEAD, OPTIONS");
response.setHeader("Access-Control-Allow-Headers",
"Custom-Access-Token, Origin, Accept, Session-Alias, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers");
//LOGGER.info("Request Filtered for Cross Origin Resource Sharing using CORSFilter with custom headers");
chain.doFilter(req, res);
}
【问题讨论】:
-
向我们展示您是如何启用 CORS 的。
-
@StanislavL,我们已经更新了这个问题。我们启用了 cors,这就是为什么它为 OPTIONS 请求返回 200
-
只有在调用选项时才会失败,否则它工作正常。
标签: java spring spring-mvc tomcat7 spring-rest