在完成一个前后端分离的项目中遇到了跨域问题,现在将这个问题的解决办法记录在案,在自我巩固的同时,也能够帮助有需要的人。
方法一
1、通过JavaWEB中的三大组件之一Filter完成拦截
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 该Filter起到拦截作用
*
* @author Jenson
* @since 2020/10/13 21:45
**/
@Component
public class CORSFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@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-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "*");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
如果是使用Spring的话,就不需要下边的配置,仅仅使用上面的这段代码就行。
2、使用SpringBoot的FilterRegistrationBean将其添加到容器中
@Configuration
public class CORSConfig {
@Autowired
private CORSFilter corsFilter;
@Bean
public FilterRegistrationBean corsFilter(){
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(corsFilter);
return bean;
}
}
方法二:
除了这种配置方式可以解决问题外,Spring也为我们提供了一个更加快捷的组件,我们可以直接做在他的基础上简单些一些配置再将其加入到容器中即可
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;
/**
* 全局跨域配置
*
* @author Jenson
* @since 2020/10/13 21:45
**/
@Configuration
public class GlobalCorsConfig {
/**
* 允许跨域调用的过滤器
*/
@Bean
public CorsFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
//允许所有域名进行跨域调用
config.addAllowedOrigin("*");
//允许跨越发送cookie
config.setAllowCredentials(true);
//放行全部原始头信息
config.addAllowedHeader("*");
//允许所有请求方法跨域调用
config.addAllowedMethod("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
}
大功告成。
对于这样配置的原因,我找到一篇说的比较好的文章,大家需要的可以移步 传送门