概述
Zuul 不仅仅只是路由,还有很多强大的功能,本节演示一下它的服务过滤功能,比如用在安全验证方面。
创建服务过滤器
继承 ZuulFliter
类并在类上面增加 @Component
注解就可以使用服务过滤功能了,非常简单方便
package com.ycq.hello.spring.cloud.zuul.filter; import com.fasterxml.jackson.databind.ObjectMapper; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.HashMap; import java.util.Map; /** * Zuul 的服务过滤 * Title: LoginFilter * Description: * * @author yaoChuanQing * @date 2020-11-22 23:05 * @version 1.0.0 */ @Component public class LoginFilter extends ZuulFilter { /** * 配置过滤类型,有四种不同生命周期的过滤器类型 * 1. pre:路由之前 * 2. routing:路由之时 * 3. post:路由之后 * 4. error:发送错误调用 * @return */ @Override public String filterType() { return "pre"; } /** * 配置过滤的顺序 * @return */ @Override public int filterOrder() { return 0; } /** * 配置是否需要过滤:true/需要,false/不需要 * @return */ @Override public boolean shouldFilter() { return true; } /** * 过滤器的具体业务代码 * @return * @throws ZuulException */ @Override public Object run() throws ZuulException { RequestContext currentContext = RequestContext.getCurrentContext(); HttpServletRequest request = currentContext.getRequest(); String token = request.getParameter("token"); if(token == null){ HttpServletResponse response = currentContext.getResponse(); response.setContentType("text/html;charset=utf-8"); try { // 不发送 zuul 的响应 currentContext.setSendZuulResponse(false); //响应码 currentContext.setResponseStatusCode(401); ObjectMapper objectMapper = new ObjectMapper(); Map<String, Object> map = new HashMap<>(); map.put("status", 401); map.put("message", "非法请求"); response.getWriter().write(objectMapper.writeValueAsString(map)); } catch (IOException e) { e.printStackTrace(); } } return null; } }
filterType
返回一个字符串代表过滤器的类型,在 Zuul 中定义了四种不同生命周期的过滤器类型
- pre:路由之前
- routing:路由之时
- post:路由之后
- error:发送错误调用
filterOrder
过滤的顺序
shouldFilter
是否需要过滤,这里是 true
,需要过滤
run
过滤器的具体业务代码
测试过滤器
浏览器访问:http://localhost:8769/api/a/hi?message=HelloZuul 网页显示
{ "message": "非法请求", "status": 401 }
浏览器访问:http://localhost:8769/api/b/hi?message=HelloZuul&token=123 网页显示
You message is HelloZuul,You port is 8763