有个注解@CrossOrigin(origins = "*",allowCredentials="true",allowedHeaders = "*",methods = {})是解决跨域问题的,这个注解可以加在方法上,也可以加在类上,但是作者没因为时间原因暂时没有调通,所以用了下面的方法解决了跨域的问题:
@Configuration
public class CorsConfiguration {
@Bean
public FilterRegistrationBean corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
org.springframework.web.cors.CorsConfiguration config = new org.springframework.web.cors.CorsConfiguration();
//加上了这一句,大致意思是可以携带 cookie
//最终的结果是可以 在跨域请求的时候获取同一个 session
config.setAllowCredentials(true);
// * 表示对所有的地址都可以访问
config.addAllowedOrigin("*");
// 跨域的请求头
config.addAllowedHeader("*");
// 跨域的请求方法
config.addAllowedMethod("*");
//配置 可以访问的地址
source.registerCorsConfiguration("/**", config);
FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
bean.setOrder(0);
return bean;
}
}
有可能在nginx配置了相同的解决跨域配置的时候,会报一些重复性配置的错误,会在response中请求头报文中出现重复的配置,这个时候,服务端可以通过以下方法移除请求头中重复的配置:
private void removeResponseHeader(ServletResponse rsp) {
HttpServletResponse response = (HttpServletResponse) rsp;
try {
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
Field declaredField = ResponseFacade.class.getDeclaredField("response");
declaredField.setAccessible(true);
Response resp = (Response) declaredField.get(response);
org.apache.coyote.Response coyoteResponse = resp.getCoyoteResponse();
MimeHeaders mimeHeaders = coyoteResponse.getMimeHeaders();
mimeHeaders.removeHeader("Access-Control-Allow-Origin");//如:Access-Control-Allow-Origin重复,删除你要删除的header的配置
} catch (Exception e) {
e.printStackTrace();
}
}