在实际项目中,我们经常会向前端颁发一个token证书,前端每次都会通过请求参数或请求头将token传递给后端进行验证提出请求。后端获取到token并通过验证后,会将token转化为实际需要的参数,比如userId。在SrpingBoot项目中,由于请求参数中没有userId参数,我们无法通过method参数获取到userId,所以需要通过HttpServletWrapper将token转换为userId参数。1.继承HttpServletWrapper类,重写getParameterValues方法。注意:这里没有使用真实的token,而是使用map来模拟token的存储。token123和456为有效token,分别对应userId=1和userId=2/**Token请求包装类,将token字段转换成userId字段@authoryan@dateOctober17,2019*/publicclassTokenHttpServletWrapperextendsHttpServletRequestWrapper{privateLoggerlogger=LoggerFactory.getLogger(getClass());privateMaptokenMap;//模拟tokenpublicTokenHttpServletWrapper(HttpServletRequestrequest){super(request);tokenMap=newHashMap<>(){{put("123",1);放("456",2);}};}@OverridepublicString[]getParameterValues(Stringname){//如果请求参数不是userId,则跳过if(!"userId".equals(name)){returnsuper.getParameterValues(name);}//检查token并转换为对应的userIdStringtoken=super.getParameter("token");如果(令牌==null){返回null;}logger.debug("token:"+token);IntegeruserId=tokenMap.get(token);记录器。debug("用户名:"+用户名);返回用户身份证==空?null:newString[]{String.valueOf(userId)};}}2、定义一个过滤器,判断是否有token参数或者token参数是否有效。AbstractFilter是自定义过滤器的抽象类,主要用于添加排除路径功能,其他使用与过滤器一致"Stringtoken=Paramerequest)("to!"123".equals(token)&&!"456".equals(token)){CodeResultcodeResult=newCodeResult(CodeEnum.UNAUTHORIZED,null);response.setContentType("text/json;charset=utf-8");response.getWriter().write(BeanUtil.beanToJson(codeResult));返回;}chain.doFilter(newTokenHttpServletWrapper(request),response);}}复制代码3,配置过滤器@ConfigurationpublicclassTokenFilterConfig{@BeanpublicFilterRegistrationBeansecurityFilter(){FilterRegistrationBeanregistration=newFilterRegistrationBean();筛选filter=newTokenFilter();注册.setFilter(过滤器);registration.addUrlPatterns("/*");registration.setName("tokenFilter");registration.setOrder(Ordered.HIGHEST_PRECEDENCE);返回注册;}}4。在Controller方法中使用userId作为形参5.请求访问该接口。当没有token参数或token参数无效时,返回未授权信息。当token参数有效时,获取对应的userId。更多前端技术问题,欢迎关注写java培训专栏!