一、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
微信扫一扫
支付宝扫一扫