spring boot 和nginx两种跨域处理(已验证)
程序员文章站
2022-03-25 15:02:31
什么是跨域?参考url: https://blog.csdn.net/weixin_42036952/article/details/88564647跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全限制。Url的一般格式:协议 + 域名(子域名 + 主域名) + 端口号 + 资源地址示例:https://www.baidu.cn:8080/say/Hello 是由https + www + baidu.cn + 8080 + say/Hello组成。...
什么是跨域?
参考url: https://blog.csdn.net/weixin_42036952/article/details/88564647
跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全限制。
Url的一般格式:协议
+ 域名(子域名 + 主域名)
+ 端口号
+ 资源地址
示例:https://www.baidu.cn:8080/say/Hello
是由https
+ www
+ baidu.cn
+ 8080
+ say/Hello
组成。
所谓同源是指,域名,协议,端口均相同;只要协议,子域名,主域名,端口号这四项组成部分中有一项不同,就可以认为是不同的域,不同的域之间互相访问资源,就被称之为跨域。
解决方案:
spring boot 跨域处理:
- 实现WebMvcConfigurer (已验证;并添加一个配置可以解决静态资源问题)
package com.hmmy.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class CorsConfig implements WebMvcConfigurer {
/**
* 跨域处理
*/
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
}
// @Override
// public void addResourceHandlers(ResourceHandlerRegistry registry) {
// registry.addResourceHandler("/**")
// .addResourceLocations("classpath:/resources/","classpath:/static/","classpath:/META-INF/resources/");
//// .addResourceLocations("file:C:/Picture/323223618780001/"); /** windows 系统配置路径*/
//// .addResourceLocations("file:/home/java/"); /** linux 系统配置路径*/
// }
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").
allowedOrigins("*"). //允许跨域的域名,可以用*表示允许任何域名使用
allowedMethods("*"). //允许任何方法(post、get等)
allowedHeaders("*"). //允许任何请求头
allowCredentials(true). //带上cookie信息
exposedHeaders(HttpHeaders.SET_COOKIE).maxAge(3600L); //maxAge(3600)表明在3600秒内,不需要再发送预检验请求,可以缓存该结果
}
};
}
}
application.properties文件配置(主要解决指定静态资源目录问题):
########### spring boot 静态资源路径配置 例如: file:/home/java/(linux) file:C:/Picture/(windows) ###########
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,file:C:/Picture/
- 使用拦截器实现 (未验证)
@Component
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse res = (HttpServletResponse) response;
res.addHeader("Access-Control-Allow-Credentials", "true");
res.addHeader("Access-Control-Allow-Origin", "*");
res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
res.addHeader("Access-Control-Allow-Headers", "Content-Type,X-CAF-Authorization-Token,sessionToken,X-TOKEN");
if (((HttpServletRequest) request).getMethod().equals("OPTIONS")) {
response.getWriter().println("ok");
return;
}
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
}
nginx 跨域处理:(已验证)
#设置需要跨域的指定文件(二选一)
location ^~/res/ {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET,POST';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
alias /data/web/res/;
}
#设置允许全局跨域(二选一)
server { ....
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET,POST';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
}
如图所示:
本文地址:https://blog.csdn.net/lixialv/article/details/107653756