importcom.alibaba.fastjson.JSON;importcom.netflix.zuul.ZuulFilter;importcom.netflix.zuul.context.RequestContext;importcom.netflix.zuul.exception.ZuulException;importorg.apache.commons.lang.StringUtils;importorg.springframework.http.HttpStatus;importorg.springframework.stereotype.Component;importorg.springframework.util.AntPathMatcher;importjavax.servlet.http.HttpServletRequest;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;import staticorg.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;/*** 登录过滤器*/@Componentpublic class LoginFilter extendsZuulFilter {/*** 过滤器类型,前置过滤器
*@return
*/@OverridepublicString filterType() {/*filterType:返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下:自定义过滤器的实现,需要继承ZuulFilter,需要重写实现下面四个方法:
pre:可以在请求被路由之前调用
routing:在路由请求时候被调用
post:在routing和error过滤器之后被调用
error:处理请求时发生错误时被调用*/
returnPRE_TYPE;
}/*** 过滤器优先级,值越小,越优先
*@return
*/@Overridepublic intfilterOrder() {return 0;
}/*** 过滤器是否生效
* true: 生效
* false: 不生效
*@return
*/@Overridepublic booleanshouldFilter() {
RequestContext context=RequestContext.getCurrentContext();
HttpServletRequest request=context.getRequest();///apigateway/order/api/v1/order/test
System.out.println(request.getRequestURI());//http://127.0.0.1:9000/apigateway/order/api/v1/order/test
System.out.println(request.getRequestURL());//ACL: 访问控制列表//不需要拦截的接口
List noFIlter = new ArrayList<>();
noFIlter.add("/apigateway/product/**");
AntPathMatcher matcher= newAntPathMatcher();for (String pattern : noFIlter) {//pattern--/user/**
if(StringUtils.isNotEmpty(pattern)&&matcher.match(pattern, request.getRequestURI())) {return false;
}
}return true;
}/*** 业务逻辑
*@return*@throwsZuulException*/@Overridepublic Object run() throwsZuulException {
System.out.println("拦截了");//jwt权限设置
RequestContext context =RequestContext.getCurrentContext();
HttpServletRequest request=context.getRequest();//token
String token = request.getHeader("token");if(StringUtils.isEmpty(token)) {
token= request.getParameter("token");
}if(StringUtils.isEmpty(token)) {
Map result = new HashMap<>();
result.put("code", 400);
result.put("msg", "拦截了,没权限...");
context.setSendZuulResponse(false);
context.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
context.setResponseBody(JSON.toJSONString(result));//解决中文乱码
context.getResponse().setCharacterEncoding("UTF-8");
context.getResponse().setContentType("text/html;charset=UTF-8");
}return null;
}
}