SpringBoot2.x系列教程37--整合SpringMVC之CORS跨域访问处理(下)
作者:一一哥
上一章节中,我给大家讲解了同源策略,跨域访问,以及CORS跨域访问的解决方案。接下来我就要讲解一下SpringBoot中如何实现跨域访问。
SpringBoot中跨域访问实现方案
- 全局配置实现方案
- 基于过滤器的实现方案
- @CrossOrigin注解实现方案
一. 全局配置实现方案
这是一种全局配置的实现方式,一般都是这种解决办法。
package com.yyb.boot.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* @Description Description
* @Author 一一哥Sun
* @Date Created in 2020/3/28
*
* 注意: WebMvcConfigurerAdapter这个类,@deprecated as of 5.0 {@link WebMvcConfigurer} has default methods (made
* possible by a Java 8 baseline) and can be implemented directly without the
* need for this adapter.
* WebMvcConfigurerAdapter这个类从5.0以后就过失了,5.0之后直接实现WebMvcConfigurer接口就行.
*
* 这是一种全局配置的实现方式,一般都是这种解决办法.
*/
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
//针对的映射
registry.addMapping("/**")
//针对的origin域名
.allowedOrigins("*")
//针对的方法
.allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
//是否允许发送Cookie
.allowCredentials(true)
//从预检请求得到相应的大时间,默认30分钟
.maxAge(3600)
//针对的请求头
.allowedHeaders("*");
}
}
二. 基于过滤器的实现方案
该方式基于过滤器来实现,简单明了。
package com.yyb.boot.filter;
import org.springframework.context.annotation.Configuration;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Description Description
* @Author 一一哥Sun
* @Date Created in 2020/3/28
*
* 基于过滤器的实现方式,简单明了.
*/
@Configuration
@WebFilter(filterName = "CorsFilter")
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) servletResponse;
response.setHeader("Access-Control-Allow-Origin","*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, PATCH, DELETE, PUT");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
filterChain.doFilter(servletRequest, servletResponse);
}
}
三. @CrossOrigin注解实现方案
@CrossOrigin注解来实现,更为简单。
package com.yyb.boot.web;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Description Description
* @Author 一一哥Sun
* @Date Created in 2020/3/28
*
* 以@CrossOrigin注解方式实现跨域访问.
*/
@RestController
public class UserController {
@CrossOrigin(origins = "http://localhost:8088")
@GetMapping("/msg")
public String showMsg() throws Exception {
return "success";
}
}
注意:
以上三种实现方法都可以解决跨域问题,常用的是种和第二种两种方式。
如果三种方式都用了的话,则采用就近原则。