import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.ServletRequestBindingException;
import org.springframework.web.bind.ServletRequestUtils;
/**
* 自定义一个过滤器,请求中有accessToken就放行,否则返回401
*/
@Component
public class AccessFilter extends ZuulFilter {
/**
* pre:可以在请求被路由之前调用:身份认证、集群中选择请求的微服务、记录调试信息。
* routing:在路由请求时候被调用。
* post:在routing和error过滤器之后被调用:添加标准HTTP header。
* error:处理请求时发生错误时被调用。
*/
@Override
public String filterType() {
return "pre";
}
/**
* 多个过滤器中执行顺序,越小越优先
*/
@Override
public int filterOrder() {
return 0;
}
/**
* 过滤器是否需要被执行
*/
@Override
public boolean shouldFilter() {
return true;
}
/**
* 过滤器的具体逻辑
*/
@Override
public Object run() throws ZuulException {
RequestContext ctx = RequestContext.getCurrentContext();
try {
String accessToken = ServletRequestUtils.getStringParameter(ctx.getRequest(), "accessToken");
if (null != accessToken) { // 通过
System.out.println("通过...");
return null;
}
} catch (ServletRequestBindingException e) {
e.printStackTrace();
}
System.out.println("没有accessToken");
ctx.setSendZuulResponse(false); // 停止路由
ctx.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
return null;
}
}
访问:http://localhost:11000/provider/m1?accessToken=1
网友评论