如果是 spring 4.2 版本以上的跨域问题解决, @CrossOrigin注解既可注解在方法上,也可注解在类上。
我主要说 springmvc 4.1 以下版本的处理方式
拦截器中放过options校验请求
// 拦截器中判断,如果请求方式 是 options 直接放回false 不请求业务代码
String m = request.getMethod();
if("options".equalsIgnoreCase(m.toLowerCase())){
response.addHeader("Access-Control-Allow-Origin","*");
response.addHeader("Access-Control-Allow-Methods","*");
response.addHeader("Access-Control-Max-Age","100");
response.addHeader("Access-Control-Allow-Headers", "Content-Type");
response.addHeader("Access-Control-Allow-Credentials","false");
return false;
}
Controller方法添加跨域请求头
response.addHeader("Access-Control-Allow-Origin","*");
response.addHeader("Access-Control-Allow-Methods","*");
response.addHeader("Access-Control-Max-Age","100");
response.addHeader("Access-Control-Allow-Headers", "Content-Type");
response.addHeader("Access-Control-Allow-Credentials","false");
web.xml 里 dispatchOptionsRequest true 允许校验请求
<servlet>
<servlet-name>backend</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>dispatchOptionsRequest</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>backend</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>