package com.bjpowernode.springcloud.filter;
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;
/**
* 自定义过滤器,并继承网关的过滤器抽象父类 ZuulFilter
*/
@Component
public class AuthFilter extends ZuulFilter {
/**
* 返回过滤器的类型,返回值决定当前过滤器的类型
* @return
*/
public String filterType() {
//pre表示前置过滤器 ,请求会在执行远程访问之前执行当前过滤器
return "pre";
}
/**
* 返回当前过滤器的需要,如果拥有多个同类型的过滤器,那么会根据返回值的大小决定执行的先后顺序
* 注意:返回值越小优先级越高越先执行
* @return
*/
public int filterOrder() {
return 0;
}
/**
* 是否启动当前过滤器,返回true表示启动当前过滤器 返回false表示不启动当前过滤器
* @return
*/
public boolean shouldFilter() {
return true;
}
/**
* 过滤器的具体执行方法,这个方法不能手动调用。在这个方法中用于完成当前过滤器的具体执行逻辑
* 注意:返回值类型在当前版本中没有特殊使用场景因此返回null即可
* @return
* @throws ZuulException
*/
public Object run() throws ZuulException {
//获取当前请求上下文对象
RequestContext requestContext=RequestContext.getCurrentContext();
//获取用户请求对象
HttpServletRequest request=requestContext.getRequest();
//获取请求中的参数token (用户的身份令牌),类似之前的AppKey或AppId
String token=request.getParameter("token");
//判断身份令牌是否有效,正常工作时应该到数据库获取其他可以持久化的位置中验证身份是否合法
if(token==null||!"123".equals(token)){
//进入if表示请求没有传递Token或传递了一个错误Token,表示没有身份要拒绝用户访问
//设置false表示,不继续执行请求,不访问远程服务,利用为用户返回响应
requestContext.setSendZuulResponse(false);
//设置响应编码为401 表示请求没有权限
requestContext.setResponseStatusCode(401);
//设置响应的头
requestContext.addZuulResponseHeader("content-type","text/html;charset=utf-8");
//设置响应体
requestContext.setResponseBody("非法请求");
}else{
System.out.println("用户拥有身份----------------");
}
//这个返回值,现在并没有用到,返回null即可
return null;
}
}