天天看点

springboot下跨域解决的四种方法

    前言:最近在做项目,后台使用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

继续阅读