Web项目中经常会用token来进行用户的访问验证,那么在获得token之后,如果有很多地方需要根据token获得对应的用户信息,你会怎么获取?
本文给大家提供N种方式,对照一下,看看你的项目中所使用的方式属于哪个Level,是不是要赶快升级一下?
关于token生成、认证部分的操作本文不会涉及,也就是默认token是经过合法性校验的,本文将重点放在之后进行的业务相关处理,即基于token获取用户信息的方式(部分方式需要基于SpringBoot)。
Level1:手动获取
通常token会放在header当中,最低级的获取方式就是直接从header中获取token,然后通过token转换获得userId,示例代码如下:
@GetMapping("/level1")
public Integer level1(HttpServletRequest request) {
String token = request.getHeader("token");
log.info("level1 获得的token为:{}", token);
Integer userId = TokenUtil.getUserIdByToken(token);
log.info("userId={}", userId);
return userId;
}
这种方式最简单直观,还可以进一步封装,比如提供一个BaseController,封装公共的部分,本质是一样的,但又引入了继承关系。因此,通常适用于有少数地方使用的场景。如果有大量的地方使用,这样写比较麻烦,不推荐使用,也没什么技术含量。
Level2:过滤器token转userId
在上一种方案中,既然每一次调用都需要进行token和userId的转换,那就通过过滤器将这一转换过程统一处理。在过滤器中获得token,然后转换成userId,再把userId写回到header当中,使用时直接从header中拿userId即可。
先定义过滤器,示例代码如下:
@Slf4j
@Component
public class ArgumentFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
String token = httpRequest.getHeader("token");
Integer userId = TokenUtil.getUserIdByToken(token);
log.info("filter获取用户Id={}", userId);
HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper(httpRequest) {
@Override
public String getHeader(String name) {
if ("userId".equals(name)) {
return userId + "";
}
return super.getHeader(name);