跨域:
域:协议 + 域名 + 端口;三者完全相同则为同域,反之有其一不同均为不同域。
跨域请求:
当前【发起请求】的域和【请求指向】的域属于不同域时,该次请求称之为跨域请求。跨域请求是能访问到服务端的,但因为浏览器出于安全性考虑,有一个同源策略控制,请求被服务处理了。只不过返回的响应内容被浏览器拦截掉了。
同源限制:浏览器针对跨域请求做出同源限制资源访问:
- Cookie、LocalStorage 和 IndexDB 无法跨域访问;
- DOM元素无法跨域访问;
- Ajax无法跨域请求。
解决跨域的方式有大致,分为三种:
- 前端解决:如:JSONP
- 后端:
- 基于注解@CrossOrigin对某个或某些请求拦截
- 编写跨域过滤类
- 使用中间件:NIGINX做反向代理进行跨域处理(推介)
以下提供设置全局跨域处理配置类,网上一大堆自行百度。
原理:在response响应头里加上允许跨域的参数,代码如下:
package com.spring.jpa.controller;
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 {
@Bean
public CorsConfiguration corsConfiguration() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
//实际请求中允许携带的首部字段
corsConfiguration.addAllowedHeader("*");
//允许那些域跨域访问
corsConfiguration.addAllowedOrigin("*");
//允许那些请求方法
corsConfiguration.addAllowedMethod("*");
return corsConfiguration;
}
@Bean
public CorsFilter corsFilter(CorsConfiguration corsConfiguration) {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", corsConfiguration); // 4
return new CorsFilter(source);
}
}
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Component
public class CorsFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
//为response填充头部信息,实现跨域正常返回
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
chain.doFilter(req, res);
}
public void init(FilterConfig filterConfig) {}
public void destroy() {}
}