关于前端:如何优雅地将Token参数转换成userId

3次阅读

共计 2180 个字符,预计需要花费 6 分钟才能阅读完成。

在理论我的项目中,咱们往往会发放一个 token 凭证给前端,前端在每次申请的时候通过申请参数或者申请头将 token 传给后端进行验证。后端在取得 token,验证通过之后会将 token 转成理论须要的参数,比方 userId。

在 SrpingBoot 我的项目中,因为在申请参数中并没有 userId 这个参数,所以咱们无奈通过办法形参获取到 userId,因而咱们须要通过 HttpServletWrapper 来将 token 转换成 userId 参数。

1、继承 HttpServletWrapper 类,并重写 getParameterValues 办法
注:此处并没有应用真正的 token,而是用一个 map 模仿 token 存储,token 为 123 和 456 为无效 token,别离对应着 userId = 1 和 userId = 2

/**

  • Token 申请包装类,将 token 字段转换成 userId 字段
  • @author yan
  • @date 2019 年 10 月 17 日
    */
    public class TokenHttpServletWrapper extends HttpServletRequestWrapper{
    private Logger logger = LoggerFactory.getLogger(getClass());

    private Map<String,Integer> tokenMap; // 模仿 token

    public TokenHttpServletWrapper(HttpServletRequest request) {

     super(request);
     tokenMap = new HashMap<>() {
         {put("123", 1);
             put("456", 2);
         }
     };

    }

@Override
public String[] getParameterValues(String name) {

   // 如果申请参数不是 userId, 则跳过
   if(!"userId".equals(name)) {return super.getParameterValues(name);
   }
   // 测验 token,转换成相应的 userId
   String token = super.getParameter("token");
   if(token == null) {return null;}
   logger.debug("token:" + token);
   Integer userId = tokenMap.get(token);
   logger.debug("userId:" + userId);
   return userId == null ? null : new String[] {String.valueOf(userId)};

}
}

2、定义过滤器,判断是否有 token 参数或者 token 参数是否无效
AbstractFilter 是自定义过滤器抽象类,次要用于增加排除门路性能,其余用法与过滤器统一

public class TokenFilter extends AbstractFilter{

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
        throws IOException, ServletException {String token = request.getParameter("token");
    if(!"123".equals(token) && !"456".equals(token)) {CodeResult codeResult = new CodeResult(CodeEnum.UNAUTHORIZED, null);
        response.setContentType("text/json;charset=utf-8");
        response.getWriter().write(BeanUtil.beanToJson(codeResult));
        return;
    }
    chain.doFilter(new TokenHttpServletWrapper(request), response);
}

}
复制代码
3、配置过滤器
@Configuration
public class TokenFilterConfig {

@Bean
public FilterRegistrationBean<Filter> securityFilter() {FilterRegistrationBean registration = new FilterRegistrationBean();
    Filter filter = new TokenFilter();
    registration.setFilter(filter);
    registration.addUrlPatterns("/*");
    registration.setName("tokenFilter");
    registration.setOrder(Ordered.HIGHEST_PRECEDENCE);
    return registration;
}

}

4、在 Controller 办法中应用 userId 作为形参

5、申请拜访该接口
当没有 token 参数时或者 token 参数有效时,返回未受权信息

当 token 参数无效时,获取到相应的 userId

理解更多前端面技术问题欢送关注小编 java 培训专栏!

正文完
 0