在理论我的项目中,咱们往往会发放一个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{

@Overrideprotected 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 {

@Beanpublic 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培训专栏!