前言:最近在做项目,后台使用SSM+Restful的url风格,因为前后台分离,前台静态界面和后台代码不在一个容器中,导致前台静态html的ajax访问后台出现跨域问题,经过查询资料,终于解决了问题,在此记录总结以后备用。
1.什么是跨域
可以参考:https://blog.csdn.net/tjcjava/article/details/76468225
2.解决方法
① @Configuration启动容器[email protected]注册Bean
参考:https://blog.csdn.net/Colton_Null/article/details/75195230
这种方法在容器初始化,也就是在项目启动的时候,就会去加载这个类,实现规则的register
package com.xxx.common.filter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
@Configuration
public class CorsConfig {
public CorsConfig() {
// TODO Auto-generated constructor stub
}
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", buildConfig()); // 4 对接口配置跨域设置
return new CorsFilter(source);
}
private CorsConfiguration buildConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
//“*”代表全部。”**”代表适配所有接口。
//其中addAllowedOrigin(String origin)方法是追加访问源地址。如果不使用”*”(即允许全部访问源),则可以配置多条访问源来做控制。
corsConfiguration.addAllowedOrigin("*"); // 1 设置访问源地址
corsConfiguration.addAllowedHeader("*"); // 2 设置访问源请求头
corsConfiguration.addAllowedMethod("*"); // 3 设置访问源请求方法
return corsConfiguration;
//corsConfiguration.addAllowedOrigin("http://www.aimaonline.cn/");
//corsConfiguration.addAllowedOrigin("http://test.aimaonline.cn/");
}
}
② 继承WebMvcConfigurationSupport
参考:https://blog.csdn.net/kcp606/article/details/80036420
这种方式也会在容器初始化的时候触发addCorsMappings(CorsRegistry registry)方法。
package com.xxx.common.filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class CORSFilter extends WebMvcConfigurerAdapter {
/**
* Creates a new instance of CORSFilter.
*/
public CORSFilter() {
// TODO Auto-generated constructor stub
}
@Override
public void addCorsMappings(CorsRegistry registry){
super.addCorsMappings(registry);
registry.addMapping("/**");//针对所有接口
//下面这三个方法我怎么也找不到,我找了spring-webmvc的4.3.9/4.3.22/5.1.6三个版本
//CorsRegistry里面都只有addMapping(String pathPattern)和Map<String, CorsConfiguration> getCorsConfigurations()这两个方法
//不知道allowedMethods(),allowedOrigins(),allowedHeaders()这三个方法来自哪个版本
//不过只调用addMapping("/**")依然可以解决跨域问题,不过如果你有一些个性化需求,比如拦截或者放过部分方法,那么则不可用。
//registry.allowedMethods("*")
// .allowedOrigins("*")
// .allowedHeaders("*");
}
}
③@CrossOrigin注解
@CrossOrigin默认允许所有访问源和访问方法。
第一种:加在controller方法/类上
@CrossOrigin
@RequestMapping(value = "/insertUser2", method = RequestMethod.POST)
//method用于过滤请求类型,如果此时映射方法名正确,但是为post请求,那么会方位失败
//e.g http://localhost:9022/api/user/insertUser2?age=3&name=李强&sex=男
public boolean insertUser2(@RequestParam(value = "age") String age,@RequestParam(value = "name") String name,@RequestParam(value = "sex") String sex){
return tService.insert2(name,age,sex);
}
第二种: 加在controller方法/类上,指定访问源
其中@CrossOrigin中的2个参数:
origins : 允许可访问的域列表
maxAge:准备响应前的缓存持续的最大时间(以秒为单位)。
@CrossOrigin(origins = "http://localhost:8088", maxAge = 3600)
@RestController
@RequestMapping("/user")
public class TestController {
xxxx
}
④nginx代理
这个没有测过,可参考:https://github.com/Kuangcp/Memo/blob/master/Linux/Tool/Nginx.md#%E8%B7%A8%E5%9F%9F%E9%97%AE%E9%A2%98%E7%9A%84%E9%85%8D%E7%BD%AE