跨站 HTTP 请求(Cross-site HTTP request)是指发起请求的资源所在域不同于该请求所指向资源所在的域的 HTTP 请求。这里有域名的不同,端口号的不同。
很多浏览器在发起跨域访问时是会询问用户是否需要发送该请求,或者干脆不发送跨域访问请求。(最好的办法是不使用ajax之类的,不要在前端发起跨域请求,在后台服务器发送该请求,可以使用Spring的RestTemplate)禁止跨域访问的原因是处于安全的考虑,但由的时候处于业务的需要,需要跨域访问。这里只讲解怎么处理服务端跨域的支持。前端ajax发跨域请求也是需要特殊设置的,具体就百度json,或者ajax跨域。
在项目中使用的是Spring2.X,(没办法接盘的项目),如果是Spring4.X及以上,一个注解就可以支持跨域访问,使用@CrossOrigin注解Controller即可。
在debug中发现跨域访问时请求无法进入到Controller层,只能到达Filter。只要为该请求配置一个Filter,设置下请求头即可添加跨域支持。
配置Filter。
<filter>
<description>允许跨域访问</description>
<filter-name>SimpleCORSFilter</filter-name>
<filter-class>com.hyb.filter.SimpleCORSFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SimpleCORSFilter</filter-name>
<url-pattern>/cardWrap/push_web/*</url-pattern>
</filter-mapping>
在Filter中设置请求头,添加跨域访问支持
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-Methods",
"POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
chain.doFilter(req, res);
}