首页 > 其他分享 >拦截器和跨域问题(转载)

拦截器和跨域问题(转载)

时间:2022-10-11 15:33:45浏览次数:76  
标签:Control 拦截器 跨域 Access 转载 response setHeader

拦截器解决跨域问题

梦梁鹿 于 2022-03-03 16:58:06 发布 6161 收藏 7
文章标签: java web安全
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45155235/article/details/123257256
版权
拦截器解决跨域问题
注:本文是用SpringBoot + Dubbo搭建的分布式工程,前后端分离,前端工程和后端工程的端口号不同,所以产生了前端请求跨域问题。

拦截器定义
注意,前端的请求域名如果是80端口,直接指定为"http://localhost",其他端口才具体指定。
如果你的项目有多个客户端域名,那么可以指定一个数组,如下:

	// 设置允许多个域名请求
	String[] allowDomains = {"http://localhost:8081","http://localhost:8082"};
	Set<String> allowOrigins = new HashSet<String>(Arrays.asList(allowDomains));
	String originHeads = httpServletRequest.getHeader("Origin");
	if(allowOrigins.contains(originHeads)){
	}

// 跨域请求处理拦截器
@Component
public class CorsInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 指定前端的请求域名
String allowDomain = "http://localhost";
String originHeads = request.getHeader("Origin");
if(allowDomain.equals(originHeads)){
//设置允许跨域的配置
// 这里填写你允许进行跨域的主机ip(正式上线时可以动态配置具体允许的域名和IP)
response.setHeader("Access-Control-Allow-Origin", originHeads);
}

    response.setHeader("Access-Control-Allow-Credentials", "true");

    response.setHeader("Access-Control-Allow-Headers",
            "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");

    response.setHeader("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");

    response.setHeader("X-Powered-By", "Jetty");

    String method = request.getMethod();
    if (method.equals("OPTIONS")) {

        response.setStatus(200);

        return false;
    }
    return true;
}

}
注意:拦截器与过滤器功能相似,使用相同逻辑的过滤器也能解决跨域问题,如下:

@Component
public class CorsFilterConfig implements Filter {

@Override
public void init(FilterConfig filterConfig) throws ServletException {
}

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
	
    HttpServletResponse response = (HttpServletResponse) res;
    HttpServletRequest request = (HttpServletRequest) req;
    response.setHeader("x-frame-options", "SAMEORIGIN");
    // 不使用*,自动适配跨域域名,避免携带Cookie时失效
    String origin = request.getHeader("Origin");
    if (StringUtils.isNotBlank(origin)) {
        response.setHeader("Access-Control-Allow-Origin", origin); }
    // 自适应所有自定义头
    String headers = request.getHeader("Access-Control-Request-Headers");
    if(StringUtils.isNotBlank(headers)) {
        response.setHeader("Access-Control-Allow-Headers", headers);
        response.setHeader("Access-Control-Expose-Headers", headers);
    }
    // 允许跨域的请求方法类型
    response.setHeader("Access-Control-Allow-Methods", "*");
    // 预检命令(OPTIONS)缓存时间,单位:秒
    response.setHeader("Access-Control-Max-Age", "3600");
    // 明确许可客户端发送Cookie,不允许删除字段即可
    response.setHeader("Access-Control-Allow-Credentials", "true");
    chain.doFilter(request, response);
}

@Override
public void destroy() {
}

}
拦截器配置
注意:如果项目中还有其他拦截器,应该配置在CorsInterceptor 之后,保证CorsInterceptor 解决跨域请求问题后,才放行到其他拦截器。

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {

@Autowired
private CorsInterceptor corsInterceptor;

/*
* 在配置类中指定拦截器的相关配置*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
	// 拦截所有请求
    String[] addPaths = {
            "/**"
    };
    String[] excludePaths = {
            "/**/*.css", "/**/*.js", "/**/*.png", "/**/*.jpg", "/**/*.jpeg"
    };
    registry.addInterceptor(corsInterceptor).addPathPatterns(addPaths).excludePathPatterns(excludePaths);
}

}
前端请求配置
跨域问题是前后端一起解决的,如果项目使用到Cookie,前端请求函数也要做相应的配置。
如果使用Vue axios,配置如下:

// 允许携带cookie
axio.withCredentials = true;
axio.defaults.withCredentials = true;
如果使用AJAV,配置如下:

$.ajax({
url: SERVER_URL + "/ticket/check",
type: "post",
xhrFields: {
withCredentials: true //解决跨服务传递时不传递cookie的问题,允许携带证书
},
crossDomain: true, //允许跨域
contentType:'application/json',
data:JSON.stringify({}),
dataType: "json",
success:function (resp) {
},
});
梦梁鹿
关注
1
点赞


7
收藏
打赏
打赏
0
评论

拦截器解决跨域问题
拦截器解决跨域问题注:本文是用SpringBoot + Dubbo搭建的分布式工程,前后端分离,前端工程和后端工程的端口号不同,所以产生了前端请求跨域问题。拦截器定义注意,前端的请求域名如果是80端口,直接指定为"http://localhost",其他端口才具体指定。如果你的项目有多个客户端域名,那么可以指定一个数组,如下: // 设置允许多个域名请求 String[] allowDomains = {"http://localhost:8081","http://localhost:80

标签:Control,拦截器,跨域,Access,转载,response,setHeader
From: https://www.cnblogs.com/liheng2233/p/16779403.html

相关文章

  • 转载:流动人口3.76亿,他们都去哪儿?2022-10-11
    https://m.thepaper.cn/baijiahao_20247546 流动人口3.76亿,他们都去哪儿?媒体:观察者网 2022-10-1111:13►文第一财经林小昭近年来,我国人口流动有哪些特征?国家......
  • 转载: 房贷利率下降,促进 楼市销售 上行 2022-10-10
    转载:https://baijiahao.baidu.com/s?id=1746295841564091930&wfr=spider&for=pc 这些城市房贷利率进入“3时代”,距离楼市销售回暖还有多远? 第一财经2022-10-10......
  • Java拦截器
    (1)浏览器发送一个请求会先到Tomcat的web服务器(2)Tomcat服务器接收到请求以后,会去判断请求的是静态资源还是动态资源(3)如果是静态资源,会直接到Tomcat的项目部署目录下......
  • 跨域配置以及promise.then返回结果几种情况
    Django报错403Forbidden.CSRFtokenmissingorincorrect的解决办法  在JS中,使用post方法提交数据到后台,出现错误:Forbidden(CSRFtokenmissingorincorrect......
  • 403 Invalid CORS request 跨域问题
    跨域问题跨域:浏览器对于javascript的同源策略的限制。以下情况都属于跨域:跨域原因说明示例域名不同www.jd.com与www.taobao.com域名相同,端口不同www.j......
  • 服务器端设置可以跨域
    //设置允许跨域访问该服务app.all('*',function(req,res,next){res.header("Access-Control-Allow-Origin","*");res.header('Access-Control-Allow-Method......
  • .net6 Api添加跨域
    参照:(7条消息).net6使用最小api(8)—开启跨域模式,通过扩展服务实现_hailang2ll的博客-CSDN博客步骤:一、在appsetting.json里添加配置文件//配置文件如上:"Cors":{"En......
  • Oracle pfile与spfile文件参数(转载)
    一、pfile与spfileOracle中的参数文件是一个包含一系列参数以及参数对应值的操作系统文件。它们是在数据库实例启动时候加载的,决定了数据库的物理结构、内存、数据库......
  • c语言整型变量用浮点型输出_转载
    C语言学习实践​​https://blog.csdn.net/solomon1558/article/details/40798901​​摘要本文将从C语言变量的本质,不同类型变量在内存中的存储方式,类型强制转换,格式输出4个......
  • Springboot中tomcat配置、三大组件配置、拦截器配置
    1.tomcat配置Springboot默认使用的就是嵌入式servlet容器即tomcat,对于web项目,如果使用的是外部tomcat,相关配置比如访问端口、资源路径等可以在tomcat的conf文件下配置。但是......