4.5 过虑器 Zuul的核心就是过虑器,通过过虑器实现请求过虑,身份校验等。 4.5.1 ZuulFilter 自定义过虑器需要继承 ZuulFilter,ZuulFilter是一个抽象类,需要覆盖它的四个方法,如下:
1、 shouldFilter:返回一个Boolean值,判断该过滤器是否需要执行。返回true表示要执行此过虑器,否则不执 行。
2、 run:过滤器的业务逻辑。
3、 filterType:返回字符串代表过滤器的类型,如下 pre:请求在被路由之前 执行 routing:在路由请求时调用 post:在routing和errror过滤器之后调用 error:处理请求时发生错误调用
4、 filterOrder:此方法返回整型数值,通过此数值来定义过滤器的执行顺序,数字越小优先级越高。
4.5.2测试 过虑所有请求,判断头部信息是否有Authorization,如果没有则拒绝访问,否则转发到微服务。 定义过虑器,使用@Component标识为bean。
[AppleScript] 纯文本查看 复制代码
?
01 02 03 04 05 06 07 08 09 10 11 12 | @Component public class LoginFilterTest extends ZuulFilter { private static final Logger LOG = LoggerFactory.getLogger ( LoginFilterTest. class ) ; @Override public String filterType ( ) { return "pre" ; } @Override public int filterOrder ( ) { return 2 ; / / int值来定义过滤器的执行顺序,数值越小优先级越高 } @Override public boolean shouldFilter ( ) { / / 该过滤器需要执行 return true ; |
[AppleScript] 纯文本查看 复制代码
?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 | } @Override public Object run ( ) { RequestContext requestContext = RequestContext.getCurrentContext ( ) ; HttpServletResponse response = requestContext.getResponse ( ) ; HttpServletRequest request = requestContext.getRequest ( ) ; / / 取出头部信息Authorization String authorization = request.getHeader ( "Authorization" ) ; if ( StringUtils.isEmpty ( authorization ) ) { requestContext.setSendZuulResponse ( false ) ; / / 拒绝访问 requestContext.setResponseStatusCode ( 200 ) ; / / 设置响应状态码 ResponseResult unauthenticated = new ResponseResult ( CommonCode.UNAUTHENTICATED ) ; String jsonString = JSON.toJSONString ( unauthenticated ) ; requestContext.setResponseBody ( jsonString ) ; requestContext.getResponse ( ) .setContentType ( "application/json;charset=UTF‐8" ) ; return null; } return null; } } |
测试:
请求:http://localhost:50201/api/course/coursebase/get/4028e581617f945f01617f9dabc40000查询课程信息 1、Header中不设置Authorization
响应结果:
[AppleScript] 纯文本查看 复制代码
?
1 2 3 4 5 | { "code" : 10001 , "message" : "此操作需要登陆系统!" , "success" : false } |
2、Header中设置Authorization
成功响应课程信息。