spring boot三种方式设置跨域
1、如图单个处理器添加:
responses.setHeader("Access-Control-Allow-Origin", "*"); responses.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); responses.setHeader("Access-Control-Allow-Credentials","true");
2、使用javax下servlet的过滤器filter
a、自定义Myfilter实现filter接口
b、全局设置如下:
/** * @program: te * @description: 配置跨域问题 * @author: Mr.zhourui * @create: 2020-04-29 15:08 **/ public class Myfilter extends HttpServlet implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { //todo } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletResponse resp = (HttpServletResponse) servletResponse; // 添加参数,允许任意domain访问 resp.setHeader("Access-Control-Allow-Origin", "*"); // 这个allow-headers要配为*,这样才能允许所有的请求头 --- resp.setHeader("Access-Control-Allow-Headers", "*"); resp.setHeader("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS"); resp.setHeader("Access-Control-Allow-Credentials","true"); } }
3、使用拦截器配置 注意:这里controller 需要加上
@CrossOrigin 注解使用
a、自定义拦截器MyInterceptor 实现springboot 的HandlerInterceptor 接口
/** * @author xuxueli 2015-12-12 18:09:04 */ @Component public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With"); response.setHeader("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS"); //浏览器会先发送一个试探请求OPTIONS,然后才会发送真正的请求,为了避免拦截器拦截两次请求,所以不能让OPTIONS请求通过 if ("OPTIONS".equals(request.getRequestURI())){ return false; } return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
b、加入webmvc 的配置中 在上下文使用
/** * @program: te * @description: * @author: Mr.zhourui * @create: 2020-04-29 14:48 **/ @Configuration @EnableWebMvc public class MyWebMvcConfigurerConfig extends WebMvcConfigurerAdapter { @Resource private MyInterceptor myInterceptor; // @Override // public void addCorsMappings(CorsRegistry registry) { // super.addCorsMappings(registry); // registry.addMapping("/**") // .allowedOrigins("*") // .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE") // .allowCredentials(true) // .allowedHeaders("*") // .maxAge(3600); // // } @Override public void addInterceptors(InterceptorRegistry registry) { //全部拦截 // registry.addInterceptor(myInterceptor).addPathPatterns("/**"); registry.addInterceptor(myInterceptor).excludePathPatterns("/**"); super.addInterceptors(registry); } }
4、最后一种针对springboot 可行
package com.fyun.tewebcore.filter; 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; /** * @program: te * @description: 跨域配置 * @author: Mr.zhourui * @create: 2020-05-13 14:30 **/ @Configuration public class CorsConfig { private CorsConfiguration buildConfig() { CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOrigin("*"); //允许任何域名 corsConfiguration.addAllowedHeader("*"); //允许任何头 corsConfiguration.addAllowedMethod("*"); //允许任何方法 return corsConfiguration; } @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", buildConfig()); //注册 return new CorsFilter(source); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现