请选择 进入手机版 | 继续访问电脑版
搜索
热搜: 活动 交友 discuz
查看: 2506|回复: 0

[JAVA] Java实现跨域的5种方式

[复制链接]

29

主题

30

帖子

164

积分

超级版主

Rank: 8Rank: 8

积分
164
发表于 2024-3-31 11:02:01 | 显示全部楼层 |阅读模式

1. 返回新的 CorsFilter(全局跨域)

  1. package org.chuancey.config;

  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.web.cors.CorsConfiguration;
  5. import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
  6. import org.springframework.web.filter.CorsFilter;



  7. @Configuration
  8. public class GlobalCorsConfig {


  9.     @Bean

  10.     public CorsFilter corsFilter() {

  11.         //1. 添加 CORS配置信息
  12.         CorsConfiguration config = new CorsConfiguration();

  13.         // 放行哪些原始域
  14.         config.addAllowedOrigin("*");

  15.         // 是否发送 Cookie
  16.         config.setAllowCredentials(true);

  17.         // 放行哪些请求方式
  18.         config.addAllowedMethod("*");

  19.         // 放行哪些原始请求头部信息

  20.         config.addAllowedHeader("*");

  21.         // 暴露哪些头部信息

  22.         config.addExposedHeader("*");

  23.         //2. 添加映射路径

  24.         UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();

  25.         corsConfigurationSource.registerCorsConfiguration("/**",config);

  26.         //3. 返回新的CorsFilter

  27.         return new CorsFilter(corsConfigurationSource);

  28.     }



  29. }
复制代码

2. 重写 WebMvcConfigurer(全局跨域)

  1. package org.chuancey.config;

  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.web.servlet.config.annotation.CorsRegistry;
  4. import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
  5. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;



  6. @Configuration

  7. public class CorsConfig implements WebMvcConfigurer {



  8.     @Override

  9.     public void addCorsMappings(CorsRegistry registry) {

  10.         registry.addMapping("/**")

  11.                 //放行哪些原始域

  12.                 .allowedOrigins("*")

  13.                 .allowedHeaders("*")

  14.                 // 是否发送Cookie

  15.                 .allowCredentials(true)

  16.                 .allowedMethods("GET", "POST", "OPTIONS", "DELETE", "PUT", "PATCH")

  17.                 .maxAge(3600);

  18.     }



  19.     @Override

  20.     public void addResourceHandlers(ResourceHandlerRegistry registry) {

  21.         registry.addResourceHandler("/**")

  22.                 .addResourceLocations("classpath:/static/");

  23.         registry.addResourceHandler("swagger-ui.html")

  24.                 .addResourceLocations("classpath:/META-INF/resources/");

  25.         registry.addResourceHandler("doc.html")

  26.                 .addResourceLocations("classpath:/META-INF/resources/");

  27.         registry.addResourceHandler("/webjars/**")

  28.                 .addResourceLocations("classpath:/META-INF/resources/webjars/");

  29.     }

  30. }
复制代码


3. 使用注解 (局部跨域)

在控制器(类上)上使用注解 @CrossOrigin,表示该类的所有方法允许跨域。
  1. @RestController
  2. @CrossOrigin(origins = "*")
  3. public class VerificationController {

  4. }
复制代码

在方法上使用注解 @CrossOrigin
  1. @PostMapping("/check/phone")
  2.     @CrossOrigin(origins = "*")
  3.     public boolean checkPhoneNumber(@RequestBody @ApiParam VerificationPojo verification) throws BusinessException {
  4.         return false;

  5.     }
复制代码


4. 手动设置响应头(局部跨域)
使用 HttpServletResponse 对象添加响应头(Access-Control-Allow-Origin)来授权原始域,这里 Origin的值也可以设置为 “*”,表示全部放行。
  1. @RequestMapping("/home")
  2. public String home(HttpServletResponse response) {
  3.     response.addHeader("Access-Allow-Control-Origin","*");
  4.     return "home";

  5. }
复制代码


5. 使用自定义filter实现跨域
  1. import java.io.IOException;
  2. import javax.servlet.Filter;
  3. import javax.servlet.FilterChain;
  4. import javax.servlet.FilterConfig;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.ServletRequest;
  7. import javax.servlet.ServletResponse;
  8. import javax.servlet.http.HttpServletResponse;
  9. import org.springframework.stereotype.Component;


  10. @Slf4j

  11. @Configuration

  12. @WebFilter(filterName = "accessFilter", urlPatterns = "/*")

  13. public class MyCorsFilter implements Filter {

  14.   public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

  15.     HttpServletResponse response = (HttpServletResponse) res;

  16.     response.setHeader("Access-Control-Allow-Origin", "*");

  17.     response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");

  18.     response.setHeader("Access-Control-Max-Age", "3600");

  19.     response.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type");

  20.     chain.doFilter(req, res);

  21.   }



  22.   public void init(FilterConfig filterConfig) {log.info("AccessFilter过滤器初始化!");}


  23.   public void destroy() {}

  24. }
复制代码


xml使自定义Filter生效方式
  1. <!-- 跨域访问 START-->

  2. <filter>

  3. <filter-name>CorsFilter</filter-name>

  4. <filter-class>org.chuancey.filter.MyCorsFilter</filter-class>

  5. </filter>

  6. <filter-mapping>

  7. <filter-name>CorsFilter</filter-name>

  8. <url-pattern>/*</url-pattern>

  9. </filter-mapping>

  10. <!-- 跨域访问 END  -->
复制代码









上一篇:git 推送出现fatal: the remote end hung up unexpectedly解决方案
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

抖音账号
关注抖音
加入粉丝群,抽取论坛金币


Archiver|手机版|小黑屋|IT趣-GEEK社区

GMT+8, 2024-5-22 16:10 , Processed in 0.091089 second(s), 22 queries .

Powered by Discuz! X3.4. 技术支持 by 巅峰设计

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表