springcloud+zuul处理跨域请求

在前后端分离的项目中,遇到403错误通常与跨域有关。本文介绍了通过在Zuul中创建FirstFilter并使用@CrossOrigin注解来解决跨域问题,同时提到了前端使用jsonp方式处理跨域的另一种方案。

一、在做前后端分离的时候经常会遇见报错代码403,然后说什么options什么的东西,类似于下面这种
在这里插入图片描述
通过下面的的处理就能解决这个问题
二、主要是通过过滤器来实现
在zuul下新建一个FirstFilter 继承ZuulFilter

package com.beilu.apigateway.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.web.bind.annotation.RequestMethod;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @Description
 * @Author shen
 * @Date 2019/3/14 23:53
 **/
public class FirstFilter extends ZuulFilter {
    private Logger logger = LoggerFactory.getLogger(FirstFilter.class);

    @Override
    public String filterType() {
        return FilterConstants.PRE_TYPE;
    }

    @Override
    public int filterOrder() {
        return 0;
    }

    @Override
    public boolean shouldFilter() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        //只过滤OPTIONS 请求
        if(request.getMethod().equals(RequestMethod.OPTIONS.name())){
            return true;
        }

        return false;
    }

    @Override
    public Object run() throws ZuulException {
        logger.debug("*****************FirstFilter run start*****************");
        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-Allow-Headers","authorization, content-type");
        response.setHeader("Access-Control-Allow-Methods","POST,GET");
        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(false);
        ctx.setResponseStatusCode(200);
        logger.debug("*****************FirstFilter run end*****************");
        return null;
    }
}

之后再你需要的做跨域的请求上加上@CrossOrigin注解就OK了,如下这样就行

	@CrossOrigin
    @RequestMapping("pushNoticeToUser")
    @ResponseBody
    public Map<String,Object> pushNoticeToUser(@RequestParam("body")String body) throws ClientException 

当然这不是唯一的处理办法,上面的方法时后台做处理。然后还有就是前段可以做处理也行,就是前段请求的时候用jsonp的方式也行。想了解更过的同学自行百度了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值