SpringCloud-使用路由网关的服务过滤功能-拦截登录前是否有token为例
场景
SpringCloud-使用路由网关统一访问接口(附代码下载):
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102733039
在上面已经实现使用路由网关统一访问接口后,下面使用路由网关的服务过滤功能。
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。
实现
前面使用Zuul实现路由统一网管功能。启示Zuul还有一个功能是服务过滤功能。
只需要继承ZuulFilter类并在类上添加@Component注解就可以了。
在项目包下新建filter包,包下新建类LoginFilter
package com.badao.hello.spring.cloud.zuul.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.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@Component
public class LoginFilter extends ZuulFilter {
private static final Logger logger = LoggerFactory.getLogger(LoginFilter.class);
/**
* 配置过滤类型,有四种不同生命周期的过滤器类型
* 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 {
//获取HttpServletRequest对象
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
logger.info("{} >>> {}", request.getMethod(), request.getRequestURL().toString());
//获取请求参数token--令牌
String token = request.getParameter("token");
if (token == null) {
logger.warn("Token is empty");
//s设置Zuul响应为false
context.setSendZuulResponse(false);
//设置响应状态码为401-没有权限
context.setResponseStatusCode(401);
try {
//向页面显示内容
context.getResponse().getWriter().write("no authority");
} catch (IOException e) {
}
} else {
logger.info("OK");
}
return null;
}
}
注:
需要重写4个方法,具体作用如下。
在具体过滤方法中,这里是判断请求时是否有token参数,没有则是没有权限。
filterType
配置过滤类型,有四种不同生命周期的过滤器类型
1. pre:路由之前
2. routing:路由之时
3. post:路由之后
4. error:发送错误调用
filterOrder
配置过滤的顺序,数值越小越靠前。
shouldFilter
配置是否需要过滤:true/需要,false/不需要。
Object run() throws ZuulException
过滤器的具体业务代码
至此整个服务体系的结构如下

我们依次启动Eureka服务、服务提供者、两个服务消费者、zuul的Application启动类

再打开浏览器输入:
http://localhost:8769/api/a/hi?message=HelloZuul

此时如果带着token参数去请求,再次打开浏览器输入:
http://localhost:8769/api/a/hi?message=HelloZuul&token=badao

赞 (0)
