日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

Spring cloud zuul跨域(一)

發(fā)布時(shí)間:2025/5/22 javascript 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring cloud zuul跨域(一) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

項(xiàng)目背景:
我們有web和大屏,以及移動(dòng)端,需要訪(fǎng)問(wèn)微服務(wù)接口。

然而大屏?xí)r自己打開(kāi)的網(wǎng)頁(yè),在網(wǎng)頁(yè)中通過(guò)js調(diào)用我的webapi。出現(xiàn)了跨域情況。

?

原因:
出現(xiàn)這個(gè)問(wèn)題,是由于跨域請(qǐng)求有2次請(qǐng)求。

第一次:options(查看請(qǐng)求可用性,確定請(qǐng)求后端是否支持請(qǐng)求類(lèi)型)

第二次:才是你的真實(shí)請(qǐng)求。(get/post...)

解決方案:(有缺點(diǎn),詳見(jiàn)最后)

PreFilter

/*** zuul轉(zhuǎn)發(fā)前過(guò)濾器*/ @Component public class PreFilter extends ZuulFilter {public PreFilter() {super();}@Overridepublic String filterType() {return FilterConstants.PRE_TYPE;}@Overridepublic int filterOrder() {return 0;}@Overridepublic boolean shouldFilter() { // return true; RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();//只過(guò)濾OPTIONS 請(qǐng)求if(request.getMethod().equals(RequestMethod.OPTIONS.name())){return true;}return false;}@Overridepublic Object run() {RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();HttpServletResponse response = ctx.getResponse();response.setHeader("Access-Control-Allow-Origin",request.getHeader("Origin"));response.setHeader("Access-Control-Allow-Credentials","true");response.setHeader("Access-Control-Allow-Headers","authorization, content-type");response.setHeader("Access-Control-Allow-Methods","POST,GET");String requestUrl = request.getRequestURL().toString();String requestUri = request.getRequestURI();String zuul = requestUrl.substring(0,requestUrl.indexOf(requestUri)); // zuul根路徑ctx.addZuulRequestHeader("zuul", zuul);//不再路由ctx.setSendZuulResponse(false);ctx.setResponseStatusCode(200);return null;}}

PostFilter

@Component public class PostFilter extends ZuulFilter {protected static final String SEND_ERROR_FILTER_RAN = "sendErrorFilter.ran";@Overridepublic String filterType() {return FilterConstants.POST_TYPE;}@Overridepublic int filterOrder() {return -1;}@Overridepublic boolean shouldFilter() {RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();//只過(guò)濾OPTIONS 請(qǐng)求if(request.getMethod().equals(RequestMethod.OPTIONS.name())){return false;}return true;}@Overridepublic Object run() {RequestContext ctx = RequestContext.getCurrentContext();HttpServletResponse response = ctx.getResponse();HttpServletRequest request = ctx.getRequest();response.setHeader("Access-Control-Allow-Origin",request.getHeader("Origin"));response.setHeader("Access-Control-Allow-Credentials","true");response.setHeader("Access-Control-Expose-Headers","X-forwared-port, X-forwarded-host");response.setHeader("Vary","Origin,Access-Control-Request-Method,Access-Control-Request-Headers");//允許繼續(xù)路由ctx.setSendZuulResponse(true);ctx.setResponseStatusCode(200);return null;} }

?

解決思路:讓options 請(qǐng)求進(jìn)入過(guò)濾后,允許跨域。

缺點(diǎn):網(wǎng)頁(yè)端出現(xiàn)了問(wèn)題。比如說(shuō)退出和登錄需要刷新兩邊。

終其原因是由于,header被設(shè)置了兩邊。因?yàn)檫^(guò)濾器無(wú)法分辨網(wǎng)頁(yè)提交的get/post和跨域請(qǐng)求的第二次get/post

轉(zhuǎn)載于:https://www.cnblogs.com/hanjun0612/p/10783070.html

總結(jié)

以上是生活随笔為你收集整理的Spring cloud zuul跨域(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。