當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring cloud zuul跨域(一)
生活随笔
收集整理的這篇文章主要介紹了
Spring cloud zuul跨域(一)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
項目背景:
我們有web和大屏,以及移動端,需要訪問微服務接口。
然而大屏時自己打開的網頁,在網頁中通過js調用我的webapi。出現了跨域情況。
?
原因:
出現這個問題,是由于跨域請求有2次請求。
第一次:options(查看請求可用性,確定請求后端是否支持請求類型)
第二次:才是你的真實請求。(get/post...)
解決方案:(有缺點,詳見最后)
PreFilter
/*** zuul轉發前過濾器*/ @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();//只過濾OPTIONS 請求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();//只過濾OPTIONS 請求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");//允許繼續路由ctx.setSendZuulResponse(true);ctx.setResponseStatusCode(200);return null;} }?
解決思路:讓options 請求進入過濾后,允許跨域。
缺點:網頁端出現了問題。比如說退出和登錄需要刷新兩邊。
終其原因是由于,header被設置了兩邊。因為過濾器無法分辨網頁提交的get/post和跨域請求的第二次get/post
轉載于:https://www.cnblogs.com/hanjun0612/p/10783070.html
總結
以上是生活随笔為你收集整理的Spring cloud zuul跨域(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 洛谷 P1111 修复公路(最小生成树)
- 下一篇: Python爬虫beautifulsou