自定义网关过滤器
【摘要】 自定义网关过滤器
过滤器就是在请求的传递过程中,对请求和响应做一些修改
客户端的请求先经过“pre”类型的filter,然后将请求转发到具体的业务服务,收到业务服务的响应之后,再经过“post”类型的filter处理,最后返回响应到客户端。
pre: 这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现参数校验、权限校验、流量监控、日志输出、协议转换等;
post:这种过滤器在路由到达微服务以后执行。这种过滤器可用做响应内容、响应头的修改,日志的输出,流量监控等。
只需要记住四个功能:
1.给过滤器命名。
2.过滤器执行顺序。
3.是否开启过滤器?
4.过滤器执行方法。
业务代码
配合的白名单
leyou:
filter:
allowPaths:
- /api/auth
- /api/search
- /api/user/register
- /api/user/check
- /api/user/code
- /api/item
过滤器的代码
@Component
@EnableConfigurationProperties(JwtProperties.class)
//要继承ZuulFilter类
public class LoginFilter extends ZuulFilter {
//自定义的配置类
@Autowired
private JwtProperties properties;
/**
* 返回四种类型:
* pre pre-routing过滤,路由前过滤
* routing 在路由请求时被调用
* post routing和error过滤器之后被调用
* error 处理请求发生错误的时候调用
* @return
*/
@Override
public String filterType() {
return "pre";
}
//过滤器执行顺序。
@Override
public int filterOrder() {
return 5;
}
//是否开启过滤器
//做接口白名单的过滤
@Override
public boolean shouldFilter() {
// 获取上下文
RequestContext ctx = RequestContext.getCurrentContext();
// 获取request
HttpServletRequest req = ctx.getRequest();
// 获取路径
String requestURI = req.getRequestURI();
// 判断白名单
// 遍历允许访问的路径
for (String path : this.filterProp.getAllowPaths()) {
// 然后判断是否是符合
if(requestURI.startsWith(path)){
return false;
}
}
return true;
}
//业务方法验证token
@Override
public Object run() throws ZuulException {
// 获取上下文
RequestContext ctx = RequestContext.getCurrentContext();
// 获取request
HttpServletRequest request = ctx.getRequest();
// 获取token
String token = CookieUtils.getCookieValue(request, jwtProp.getCookieName());
// 校验
try {
// 校验通过什么都不做,即放行
JwtUtils.getInfoFromToken(token, jwtProp.getPublicKey());
} catch (Exception e) {
// 校验出现异常,返回403
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(403);
logger.error("非法访问,未登录,地址:{}", request.getRemoteHost(), e );
}
return null;
}
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)