首先创建一个实现Filter的cors过滤器

import lombok.extern.slf4j.Slf4j;

import org.springframework.context.ApplicationContext;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* 功能描述 cors过滤类
*
* @author duke
* @since 2020-11-19
*/
@Slf4j
public class CorsFilter implements Filter { private static final String DEFAULT_ALLOW_HEADERS =
"Origin,x-cbg-victoria-rolename,X-Requested-With,Content-Type,Accept,client_id,appid,uuid,Authorization,TraceID"
+ ",haehead,traceid,x-app-id,x-service-type,x-cbg-language,x-sub-app-id,x-multi-consumer-appid,x-group"
+ ",trackid,Pragma,Cache-Control,x-honor-victoria-rolename,x-pix-app-type,x-pix-app-url,x-pix-csrf-token"
+ ",x-pix-main-role-code,x-pix-page-url,x-csrf-token"; private ApplicationContext context; /**
* init
*
* @param filterConfig param
* @throws ServletException ex
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException { } /**
* doFilter
*
* @param servletRequest param
* @param servletResponse param
* @param filterChain param
* @throws IOException ex
* @throws ServletException ex
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
log.info("request method:{},url:{},servletPath:{}", request.getMethod(), request.getRequestURL(),
request.getServletPath());
response.setCharacterEncoding("UTF-8"); // 配置来源 '*'
String originHeader = StringVerifyUtil.dealSpecialChar(request.getHeader("Origin"));
log.info("Duke current request origin= {} ", originHeader);
response.setHeader("Access-Control-Allow-Origin", originHeader);
// 允许获取证书
response.setHeader("Access-Control-Allow-Credentials", "true");
// 配置请求方法
response.setHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS,DELETE,PUT");
// 配置请求头,如果有自定义的请求头,必须配置
response.setHeader("Access-Control-Allow-Headers", DEFAULT_ALLOW_HEADERS); response.setHeader("Content-Type", "application/json;charset=UTF-8");
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // 支持HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // 支持HTTP 1.0. response.setHeader("Expires", "0");
response.setHeader("Access-Control-Max-Age", "3600"); // 设置过期时间 if ("OPTIONS".equals(request.getMethod())) {
log.info("OPTIONS request, let it response OK to browser.");
response.setStatus(HttpServletResponse.SC_OK);
} else {
filterChain.doFilter(servletRequest, servletResponse);
}
log.info("CorsFilter end------------------------------------------------------ ");
} /**
* destroy
*/
@Override
public void destroy() { } /**
* setContext
*
* @param context param
*/
public void setContext(ApplicationContext context) {
this.context = context;
}
}

然后在框架上注册这个类

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; /**
* 功能描述
*
* @author duke
* @since 2020-11-19
*/
@Configuration
public class FilterRegistry { @Autowired
ApplicationContext context; /**
* corsFilterRegistrationBean
*
* @return FilterRegistrationBean
*/
@Bean
public FilterRegistrationBean corsFilterRegistrationBean() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
CorsFilter corsFilter = new CorsFilter();
corsFilter.setContext(context);
registrationBean.setFilter(corsFilter);
registrationBean.addUrlPatterns("/*"); // 所有路径请求
registrationBean.setName("CorsFilter");
registrationBean.setOrder(1);
return registrationBean;
}
}

最新文章

  1. [转]一种简单的js时间控件
  2. windows7 64,32位下scrapy爬虫框架的环境搭建
  3. jQuery漂亮图标的垂直导航菜单
  4. UVALive 5000 Underwater Snipers --二分
  5. Debian 配置apt-get源
  6. CENTOS安装vnc
  7. C++:对象数组
  8. 【暑假】[深入动态规划]UVa 1412 Fund Management
  9. [jobdu]数组中出现次数超过一半的数字
  10. linux下查找文件
  11. 尚学堂 JAVA Day3 概念总结
  12. Java算法简介及排序剖析
  13. 服务端预渲染之Nuxt(爬坑篇)
  14. [Linux] 一个前端必会的 Nginx 免费教程-在虚拟机中用deepin测试
  15. Vue笔记(props和 mounted)
  16. JDBC的使用-----Statement
  17. odoo开发笔记--取消正在升级中模块
  18. Bootstrap模态框修改出现的位置和大小
  19. 数据库设计理论与实践·<三>物理设计
  20. 业务侧有大量timeout请求超时日志

热门文章

  1. NET-async-await是否会创建新线程
  2. [WPF]使用Fody提高效率
  3. 【Azure Developer】在Github Action中使用Azure/functions-container-action@v1配置Function App并成功部署Function Image
  4. 送给vue初学者的 vue.js技巧
  5. OpenMP 线程同步 Construct 实现原理以及源码分析(下)
  6. 如何通过Zabbix Docker配置HTTPS访问系统?
  7. 增加for循环-泛型的概念
  8. Solon 的插件热插拨管理机制(H-Spi)
  9. 11月21日内容总结——多进程实现TCP服务端并发、互斥锁、线程及代码实现、GIL全局解释器锁、信号量、event事件、进程池和线程池、协程
  10. Redis-05持久化