欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 前端技术 > javascript >内容正文

javascript

Spring cloud zuul跨域(一)

发布时间:2025/5/22 javascript 87 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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跨域(一)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。