token拦截器android_OkHttp3拦截器使用(统一添加header、统一处理Token过期等)

本文介绍了如何利用OkHttp的拦截器机制来处理HTTP请求中的签名和token管理问题。通过添加拦截器,实现了统一添加签名、处理token过期后的无感刷新以及刷新后重发原始请求的功能。主要涉及应用拦截器的使用,以及如何在拦截器中检查和更新token。
摘要由CSDN通过智能技术生成

为了保证Http请求的安全性,最近开发的项目采用了OAuth2.0认证机制,在Http请求头中加入了参数签名和accessToken进行验证。这样就带来几个问题:

n多请求,如何做到统一签名?

accessToken过期后,如何Hold当前请求,进行token的无感刷新?

accessToken刷新后,如何直接进行原始请求的重发?

其实,使用OkHttp的Interceptors(拦截器)便可以优雅的解决这些问题

OkHttp的拦截器机制分为应用拦截器和网络拦截器两种,今天我们使用的是应用拦截器。关于两种拦截器的区别,网上已有很多文章。

1.添加拦截器

在我们生成OkHttpClient时调用addInterceptor即可:

OkHttpClient.Builder()

//连接超时设置

.connectTimeout(30, TimeUnit.SECONDS)

//写入超时设置,

.writeTimeout(30, TimeUnit.SECONDS)

//读取超时设置

.readTimeout(30, TimeUnit.SECONDS)

//添加签名拦截器

.addInterceptor(SignInterceptor())

//添加Token处理拦截器

.addInterceptor(TokenInterceptor())

//添加日志打印拦截器

.addInterceptor(LogInterceptor())

.buil

拦截器和过滤器都可以用来统一处理token的验证和解析,下面分别介绍一下具体实现方法: 使用拦截器: 1. 创建一个拦截器类,实现HandlerInterceptor接口; 2. 在preHandle方法中,获取请求头中的token,并进行解析和验证; 3. 如果token验证失败,则返回错误信息; 4. 如果token验证成功,则将用户信息存放到请求对象中,方便后续处理; 5. 在配置类中,将拦截器类加入到拦截器链中。 示例代码: ``` public class TokenInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader("token"); if (StringUtils.isBlank(token)) { throw new RuntimeException("token不能为空"); } // 解析token,并验证签名 Claims claims = JwtUtils.parseJwt(token); if (claims == null) { throw new RuntimeException("token无效"); } // 将用户信息存放到请求对象中 request.setAttribute("userId", claims.getSubject()); return true; } } ``` 使用过滤器: 1. 创建一个过滤器类,实现Filter接口; 2. 在doFilter方法中,获取请求头中的token,并进行解析和验证; 3. 如果token验证失败,则返回错误信息; 4. 如果token验证成功,则将用户信息存放到请求对象中,方便后续处理; 5. 在web.xml中,配置过滤器类和过滤路径。 示例代码: ``` public class TokenFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; String token = req.getHeader("token"); if (StringUtils.isBlank(token)) { throw new RuntimeException("token不能为空"); } // 解析token,并验证签名 Claims claims = JwtUtils.parseJwt(token); if (claims == null) { throw new RuntimeException("token无效"); } // 将用户信息存放到请求对象中 req.setAttribute("userId", claims.getSubject()); chain.doFilter(request, response); } } ``` 配置过滤器: ``` <filter> <filter-name>TokenFilter</filter-name> <filter-class>com.example.TokenFilter</filter-class> </filter> <filter-mapping> <filter-name>TokenFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值