如何使用拦截器或者过滤器来统一处理token的验证和解析
时间: 2024-05-12 11:19:45 浏览: 130
拦截器和过滤器都可以用来统一处理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>
```
阅读全文