使用 Spring Boot 内置的 Tomcat 服务器时怎么在服务器上的http响应头设置Access-Control-Allow-Origin
时间: 2024-01-11 07:54:02 浏览: 138
在使用 Spring Boot 内置的 Tomcat 服务器时,可以使用过滤器(Filter)或拦截器(Interceptor)来设置http响应头的Access-Control-Allow-Origin。
1. 过滤器(Filter)方式
在Spring Boot应用程序中,可以编写一个过滤器(Filter)类来处理跨域问题。首先,需要在pom.xml文件中添加以下依赖:
```xml
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
```
然后创建一个实现javax.servlet.Filter接口的类CorsFilter:
```java
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Component
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletResponse res = (HttpServletResponse) response;
HttpServletRequest req = (HttpServletRequest) request;
res.setHeader("Access-Control-Allow-Origin", "*"); //设置允许跨域的域名,*表示所有域名都可以访问
res.setHeader("Access-Control-Allow-Methods", "*"); //允许的请求方法,*表示所有方法
res.setHeader("Access-Control-Allow-Headers", "*"); //允许的请求头字段,*表示任意请求头字段
chain.doFilter(req, res);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
}
```
2. 拦截器(Interceptor)方式
类似于过滤器方法,我们可以编写一个拦截器(Interceptor)类来处理跨域问题。拦截器与过滤器的区别是拦截器是基于Java的反射机制,而过滤器是基于函数回调。
首先,创建一个实现HandlerInterceptor接口的拦截器类CorsInterceptor:
```java
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
@Component
public class CorsInterceptor 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-Methods", "*"); //允许的请求方法,*表示所有方法
response.setHeader("Access-Control-Allow-Headers", "*"); //允许的请求头字段,*表示任意请求头字段
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 {
}
}
```
然后,需要在Spring Boot应用程序中注册拦截器。可以在WebMvcConfigurerAdapter配置类中注册拦截器:
```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Autowired
private CorsInterceptor corsInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(corsInterceptor);
}
}
```
以上两种方式都可以解决跨域问题,具体使用哪一种方式,可以根据实际情况来选择。
阅读全文