當(dāng)前位置:
首頁(yè) >
前端技术
> javascript
>内容正文
javascript
Spring cloud zuul跨域(一)
生活随笔
收集整理的這篇文章主要介紹了
Spring cloud zuul跨域(一)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
項(xiàng)目背景:
我們有web和大屏,以及移動(dò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)題。
- 上一篇: 洛谷 P1111 修复公路(最小生成树)
- 下一篇: Python爬虫beautifulsou