SpringBoot解决跨域问题
方法一、spring boot中只用在Controller类上添加一个“@CrossOrigin“注解就可以实现对当前controller 的跨域 访问了,当然这个标签也可以加到方法上。
@CrossOrigin(origins = "http://192.168.1.10:8080", maxAge = 3600) @RequestMapping("rest_index") @RestController public class IndexController{
}
其他controller类继承以上这个类就可以解决跨域问题。
注意:“@CrossOrigin“注解要求jdk1.8以上版本
方法二、基于WebMvcConfigurerAdapter配置加入Cors的跨域(常用)
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 CorsConfig extends WebMvcConfigurerAdapter { /** * 就是注册的过程,注册Cors协议的内容。 * 如: Cors协议支持哪些请求URL,支持哪些请求类型,请求时处理的超时时长是什么等。 */ @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") // 所有的当前站点的请求地址,都支持跨域访问 .allowedOriginsPatterns("*") // 所有的外部域都可跨域访问。 如果是localhost则很难配置,因为在跨域请求的时候,外部域的解析可能是localhost、127.0.0.1、主机名(注意:SpringBoot2.4.0之后【allowedOriginsPatterns】代替【allowedOrigins】) .allowCredentials(true) // 是否支持跨域用户凭证 .allowedMethods("GET", "POST", "DELETE", "PUT") // 当前站点支持的跨域请求类型是什么 .maxAge(3600)
.allowedHeaders("*");
; // 超时时长设置为1小时。 时间单位是秒 } }
方法三、创建一个filter(过滤器)解决跨域(也支持springMVC)
@Component public class SimpleCORSFilter implements 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, HEAD"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "access-control-allow-origin, authority, content-type, version-info, X-Requested-With"); chain.doFilter(req, res); } public void init(FilterConfig filterConfig) {} public void destroy() {} }
四、使用nginx反向代理服务器解决跨域问题
很好的文章:阮一峰:http://www.ruanyifeng.com/blog/2016/04/cors.html
一个小小后端的爬行痕迹