首先,咱们须要了解一下一个URL是怎么组成的:前端
// 协议 + 域名(子域名 + 主域名) + 端口号 + 资源地址 http: + // + www.baidu.com + :8080/vue
只要协议,子域名,主域名,端口号这四项组成部分中有一项不一样,就能够认为是不一样的域,不一样的域之间互相访问资源,就被称之为跨域。java
随着先后端分离开发的愈来愈普及,会常常遇到跨域的问题,当咱们在浏览器中看到这样的错误时,就须要意识到遇到了跨域:ios
首先,咱们使用vue-cli
来快速构建一个前端项目,而后使用axios
来向后台发送ajax请求。而后在控制台中打印出返回信息。这里就再也不多作赘述,后面我会单独写一篇文章来说一下如何使用vue-cli快速建立一个vue项目。ajax
这里再也不讲解使用
jsonp
的方式来解决跨域,由于jsonp
方式只能经过get
请求方式来传递参数,并且有一些不便之处。vue-cli
下面的几种方式都是经过**跨域访问技术CORS(Cross-Origin Resource Sharing)**来解决的。具体的实现原理咱们不作深刻的探究,这节课的目的是解决跨域问题~json
在Spring Boot 中给咱们提供了一个注解@CrossOrigin
来实现跨域,这个注解能够实现方法级别的细粒度的跨域控制。咱们能够在类或者方添加该注解,若是在类上添加该注解,该类下的全部接口均可以经过跨域访问,若是在方法上添加注解,那么仅仅只限于加注解的方法能够访问。axios
@RestController
@RequestMapping("/user")
@CrossOrigin
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/findAll")
public Object findAll(){
return userService.list();
}
}
复制代码
如今再去测试一下: 后端
Bingo,成功!跨域
这里能够经过实现WebMvcConfigurer
接口中的addCorsMappings()
方法来实现跨域。
@Configuration
class CORSConfiguration implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**");
}
}
复制代码
下面咱们将刚刚加上的注解给注释掉,看看能不能访问到这个接口:
不出咱们所料,果真仍是能够的~
咱们能够经过实现Fiter接口在请求中添加一些Header来解决跨域的问题:
@Component
public class CORSFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletResponse res = (HttpServletResponse) response;
res.addHeader("Access-Control-Allow-Credentials", "true");
res.addHeader("Access-Control-Allow-Origin", "*");
res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
res.addHeader("Access-Control-Allow-Headers", "Content-Type,X-CAF-Authorization-Token,sessionToken,X-TOKEN");
if (((HttpServletRequest) request).getMethod().equals("OPTIONS")) {
response.getWriter().println("ok");
return;
}
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
}
复制代码
不出意外的话,应该也能够在控制台获取到返回信息。
若是咱们在项目中使用了Nginx,能够在Nginx中添加如下的配置来解决跨域(原理其实和Filter相似,只不过把活儿丢给了运维🤔)
location / {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
if ($request_method = 'OPTIONS') {
return 204;
}
}
复制代码
原创文章,才疏学浅,若有不对之处,万望告知!
您的推荐就是对我最大的支持!