什么是跨域问题
跨域问题是由于浏览器的安全策略导致的,它会阻止一个网站在另一个网站上发起网络请求。
比如在一个域名下的网页无法访问另一个域名下的API,这就是一个典型的跨域问题。
解决方案
方案一:使用注解
在Spring Boot中,我们可以通过在Controller上添加@CrossOrigin注解来解决跨域问题。这个
注解有以下几个参数:
value:指定允许访问的域名,如果不指定,则允许所有域名访问。
allowedHeaders:指定允许访问的请求头,如果不指定,则允许所有请求头访问。
allowCredentials:是否允许携带凭证,如cookie等,默认为false。
methods:指定允许访问的HTTP方法,如GET、POST等,默认为所有HTTP方法。
以下是一个使用@CrossOrigin注解解决跨域问题的示例:
@RestController
@RequestMapping("/api")
@CrossOrigin(value = "http://localhost:8080", allowedHeaders = "*", allowCredentials = "true", methods = {RequestMethod.GET, RequestMethod.POST})
public class ApiController {
@GetMapping("/user")
public User getUser() {
// 返回用户信息
}
@PostMapping("/user")
public void updateUser(@RequestBody User user) {
// 更新用户信息
}
}
方案二:使用过滤器
除了使用注解,我们还可以通过编写过滤器来解决跨域问题。
下面是一个使用过滤器解决跨域问题的示例:
@Component
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", "*");
response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
response.setHeader("Access-Control-Allow-Headers", "authorization, content-type");
response.setHeader("Access-Control-Max-Age", "3600");
chain.doFilter(req, res);
}
}
上面的过滤器会添加一些响应头,允许所有域名访问该接口。
总结
Spring Boot提供了多种方式解决跨域问题,
我们可以根据实际情况选择使用注解或者过滤器来解决问题。
在使用注解时,需要注意指定允许访问的域名、请求头、HTTP方法等参数,以保证安全性。