spring cloud zuul进行服务拦截

服务网关zuul还有个作用就是接口的安全性校验,这个时候我们就需要通过 zuul 进行统一拦截,zuul 通过继承过滤器 ZuulFilter 进行处理,下面请看具体用法。

新建一个类 ApiFilter 并继承 ZuulFilter:

@Component
public class ApiFilter extends ZuulFilter {

@Override
public String filterType() {
    return "pre";
}

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

@Override
public boolean shouldFilter() {
    return true;
}

@Override
public Object run() {
    //这里写校验代码
    return null;
}

}
其中:

filterType 为过滤类型,可选值有 pre(路由之前)、routing(路由之时)、post(路由之后)、error(发生错误时调用)。
filterOrdery 为过滤的顺序,如果有多个过滤器,则数字越小越先执行
shouldFilter 表示是否过滤,这里可以做逻辑判断,true 为过滤,false 不过滤
run 为过滤器执行的具体逻辑,在这里可以做很多事情,比如:权限判断、合法性校验等。
下面,我们来做一个简单的安全验证:

@Override
public Object run() {
//这里写校验代码
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
String token = request.getParameter(“token”);
if(!“12345”.equals(token)){
context.setSendZuulResponse(false);
context.setResponseStatusCode(401);
try {
context.getResponse().getWriter().write(“token is invalid.”);
}catch (Exception e){}
}
return null;
}
启动 gateway,在浏览器输入地址:http://localhost:8080/api/index,可以看到以下界面:

这里写图片描述

再通过浏览器输入地址:http://localhost:8080/api/index?token=12345,可以看到以下界面:

这里写图片描述

错误拦截
在一个大型系统中,服务是部署在不同的服务器下面的,我们难免会遇到某一个服务挂掉或者请求不到的时候,如果不做任何处理,服务网关请求不到会抛出500错误,对用户是不友好的。

我们为了提供用户的友好性,需要返回友好性提示,zuul 为我们提供了一个名叫 ZuulFallbackProvider 的接口,通过它我们就可以对这些请求不到的服务进行错误处理。

新建一个类 ApiFallbackProvider 并且实现 ZuulFallbackProvider 接口:

Component
public class ApiFallbackProvider implements ZuulFallbackProvider{

@Override
public String getRoute() {
    return "eurekaclient";
}

@Override
public ClientHttpResponse fallbackResponse() {
    return new ClientHttpResponse() {
        @Override
        public HttpStatus getStatusCode() throws IOException {
            return HttpStatus.OK;
        }

        @Override
        public int getRawStatusCode() throws IOException {
            return 200;
        }

        @Override
        public String getStatusText() throws IOException {
            return "{code:0,message:\"服务器异常!\"}";
        }

        @Override
        public void close() {

        }

        @Override
        public InputStream getBody() throws IOException {
            return new ByteArrayInputStream(getStatusText().getBytes());
        }

        @Override
        public HttpHeaders getHeaders() {
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            return headers;
        }
    };
}

其中,getRoute 方法返回要处理错误的服务名,fallbackResponse 方法返回错误的处理规则。

现在开始测试这部分代码,首先停掉服务提供者 eurekaclient,再重启 gateway,请求地址:http://localhost:8080/api/index?token=12345,即可出现以下界面:

这里写图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42844971/article/details/84397868