Springboot跨域注解详解

一、Springboot跨域注解概述

随着前端和后端分离越来越流行,跨域(Cross-Origin Resource Sharing,简称CORS)问题越来越普遍。当浏览器执行跨域请求时,会遵循同源策略来限制跨域请求。Springboot提供了很多解决跨域请求的方法,其中比较简单和实用的就是使用跨域注解。本文将详细介绍Springboot跨域注解及相关问题。

二、Springboot跨域注解使用方法

1、在需要允许跨域的Controller上使用@CrossOrigin注解。@CrossOrigin注解支持四个参数,分别是value、methods、allowedHeaders和maxAge。例如:

@RestController
@RequestMapping("/api")
public class UserController {
    
    @CrossOrigin(value = "*", maxAge = 1800, allowedHeaders = "*")
    @GetMapping("/users")
    public List getUserList() {
        //...
    }
}

2、在Springboot应用的配置文件中使用CorsFilter。例如:

@Bean
public CorsFilter corsFilter() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();
    config.addAllowedOrigin("*");
    config.addAllowedMethod("*");
    config.addAllowedHeader("*");
    config.setMaxAge(1800L);
    source.registerCorsConfiguration("/**", config);
    return new CorsFilter(source);
}

需要注意的是,使用CorsFilter需要添加依赖:spring-boot-starter-web、spring-boot-starter-tomcat、spring-boot-starter-validation。

三、Springboot跨域注解常见问题

1、Springboot跨域注解 vue无效

由于Vue的CORS请求默认会发送一个options的preflight请求,所以我们需要在服务端处理OPTIONS请求并添加相应的响应头信息。例如:

@RestController
public class CorsController {
 
    @RequestMapping("/api/**")
    public void cors(HttpServletRequest request, HttpServletResponse response) {
        response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        response.setHeader("Access-Control-Allow-Headers", "*");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Max-Age", "3600");
    }
}

2、Springboot跨域注解无效

在某些情况下,部署Springboot应用时,可能会发现@CrossOrigin注解无效。这时,我们可以尝试添加一个过滤器来处理跨域问题。例如:

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsFilter implements Filter {
 
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;
        response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        response.setHeader("Access-Control-Allow-Headers", "*");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Max-Age", "3600");
        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(req, res);
        }
    }
}

3、Springboot跨域注解指定IP

如果只允许特定的IP进行跨域请求,我们可以在@CrossOrigin注解中指定allowedOrigins参数。例如:

@RestController
@RequestMapping("/api")
public class UserController {
    
    @CrossOrigin(allowedOrigins = {"http://127.0.0.1:8080"})
    @GetMapping("/users")
    public List getUserList() {
        //...
    }
}

四、Springboot核心注解

除了@CrossOrigin注解外,Springboot还提供了很多核心注解,如@Controller、@RestController、@Autowired等。下面介绍三个比较常用的核心注解。

1、@Controller和@RequestMapping

@Controller注解用于标识一个类为Spring MVC的Controller,@RequestMapping则用于映射URL请求路径。例如:

@Controller
@RequestMapping("/api")
public class UserController {
    
    @GetMapping("/users")
    public List getUserList() {
        //...
    }
}

2、@RestController和@GetMapping

@RestController注解不仅包含@Controller注解的功能,还可以自动添加@ResponseBody注解。@GetMapping则是@GetMapping注解的缩写,用于处理HTTP GET请求。例如:

@RestController
@RequestMapping("/api")
public class UserController {
    
    @GetMapping("/users")
    public List getUserList() {
        //...
    }
}

3、@Autowired和@Service

@Autowired注解可以自动注入一个Bean,@Service注解则用于标识一个类为Spring的Service。例如:

@Service
public class UserServiceImpl implements UserService {
 
    @Autowired
    private UserRepository userRepository;
 
    @Override
    public List getUserList() {
        return userRepository.findAll();
    }
}

五、Springboot注解有哪些

除了上面介绍的注解外,Springboot还提供了很多其他的注解,如@Bean、@Configuration、@Component等。这些注解让Springboot的配置和开发变得更加简单和方便。

六、Springboot面试题及答案

1、什么是Springboot?

答:Springboot是一种基于Spring框架的快速开发、便于部署的JavaWeb框架。

2、Springboot的特点有哪些?

答:Springboot的特点包括:快速开发、轻量级、依赖管理、自动配置、无XML配置、内嵌Servlet容器和独立性。

3、如何使用Springboot处理跨域请求?

答:Springboot可以通过使用@CrossOrigin注解和CorsFilter来处理跨域请求。

4、Springboot中常用的注解有哪些?

答:Springboot中常用的注解包括:@Controller、@RestController、@Autowired、@Service、@Repository、@Bean、@Configuration、@Component等。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/219723.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-09 11:00
下一篇 2024-12-09 11:00

相关推荐

  • Hibernate注解联合主键 如何使用

    解答:Hibernate的注解方式可以用来定义联合主键,使用@Embeddable和@EmbeddedId注解。 一、@Embeddable和@EmbeddedId注解 在Hibe…

    编程 2025-04-29
  • 从ga角度解读springboot

    springboot作为目前广受欢迎的Java开发框架,其中的ga机制在整个开发过程中起着至关重要的作用。 一、ga是什么 ga即Group Artifacts的缩写,它是Mave…

    编程 2025-04-29
  • SpringBoot Get方式请求传参用法介绍

    本文将从以下多个方面对SpringBoot Get方式请求传参做详细的阐述,包括URL传参、路径传参、请求头传参、请求体传参等,帮助读者更加深入地了解Get请求方式下传参的相关知识…

    编程 2025-04-27
  • SpringBoot如何设置不输出Info日志

    本篇文章将带您了解如何在SpringBoot项目中关闭Info级别日志输出。 一、为什么要关闭Info日志 在开发中,我们经常会使用Log4j、Logback等框架来输出日志信息,…

    编程 2025-04-27
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25
  • git config user.name的详解

    一、为什么要使用git config user.name? git是一个非常流行的分布式版本控制系统,很多程序员都会用到它。在使用git commit提交代码时,需要记录commi…

    编程 2025-04-25

发表回复

登录后才能评论