jersey利用filter和Dynamic binding来实现token拦截过滤请求
背景描述做app后端服务的coder都知道,很多服务都是无状态的,所谓的无状态,在这里我们可以简单的理解为(与传统web不同点)没有session。 那么这个时候怎么保证我们的请求安全性呢(这里我们所提到的安全性即用户请求来源和判断的安全性,不涉及验签,加密等数据来源之类的安全)。 需求描述我们要实现一个基于token令牌的请求拦截系统,针对我们的每一次的请求进行拦截。以此来判断用户数据的完整性,安全性。 那么我们的token鉴权是什么样的过程呢?
关键点分析整个过程中最重要的是3点:
今天我们要做的就是第三点,如何实现针对需要鉴权的请求进行拦截 针对需要鉴权的请求进行拦截的实现过程整个拦截的过程中主要有这么两个点:
Server filters简述Server filters主要是一个什么作用呢,这我们这里,他主要是负责两个地方:
整个这一块的代码如下 public class AuthorizationFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
//获取客户端Header中提交的token
String token = requestContext.getHeaderString("Authorization");
if (StringUtil.isEmpty(token)) {
// TODO:拦截响应
}
//判断该用户是否已登陆
User user = TokenUtils.sign(token);
if (user == null) {
// TODO:拦截响应
}
}
}
那么大家可能注意到我加了todo的地方,因为这些都是需要把请求拦截下来的地方,那么我们怎么实现吧这个请求拦截下来呢 public class AuthorizationException extends RuntimeException {
private String response = ErrorCode.NOT_AUTHED.getMsg();
public String getResponse(){
return this.response;
}
}
然后在全局捕获这个异常并输出提示信息 @Provider
public class AuthExceptionMapper implements ExceptionMapper<AuthorizationException> {
@Override
public Response toResponse(AuthorizationException exception) {
return Response.ok(exception.getResponse()).build();
}
}
Dynamic binding在上面我们看到了如何对一个请求进行拦截,并进行鉴权验证,包括异常处理。 那么我们看一下什么是Dynamic binding? 让我们来看一下官方的解释
动态绑定就是一个以动态的方式分配资源方法的筛选器和拦截器。 那么我们怎么利用Dynamic binding来实现我们的区分拦截的功能呢 具体的需求描述我想实现这么样的一个功能,通过一个注解,我只需要把这个注解标注在类或者方法上就能拦截这个对应的类或者方法 那么我怎么实现这个动态的过滤绑定功能呢? @Provider public class AuthorizationFilterFeature implements DynamicFeature { @Override public void configure(ResourceInfo resourceInfo,FeatureContext context) { List<Annotation> authzSpecs = new ArrayList<>(); Annotation classAuthzSpec = resourceInfo.getResourceClass().getAnnotation(AuthAnnotation.class); Annotation methodAuthzSpec = resourceInfo.getResourceMethod().getAnnotation(AuthAnnotation.class); if (classAuthzSpec != null) authzSpecs.add(classAuthzSpec); if (methodAuthzSpec != null) authzSpecs.add(methodAuthzSpec); if (!authzSpecs.isEmpty()) { // 需要拦截的api context.register(AuthorizationFilter.class); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |