@Override protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) { System.out.println("isAccessAllowed 方法被调用"); //这里先全部拒绝 return false; } /** * 返回结果为true表明登录通过 */ @Override protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception { System.out.println("onAccessDenied 方法被调用"); // 所以以后发起请求的时候就需要在Header中放一个Authorization,值就是对应的Token String token = ((HttpServletRequest) servletRequest).getHeader("Authorization"); System.out.println(token); if (StringUtils.isEmpty(token)) { System.out.println("没有携带token;非法访问"); //onLoginFail(servletResponse, "非法访问"); return true; } if (JwtUtils.verify(token)) { // 这里是token验证通过 // 获取tokenid String tokenId = JwtUtils.getTokenId(token); // 通过ApplicationContext来获取 ServletContext context = servletRequest.getServletContext(); ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context); RedisUtil redisUtil = ctx.getBean(RedisUtil.class); // 这里在redis判断token是否过期 if (redisUtil.hasKey(tokenId)) { System.out.println("请求成功,通过"); return true; } else { // 过期重新登录 System.out.println("过期重新登录"); onLoginFail(servletResponse, "过期重新登录"); return false; } } else { // 非法token System.out.println("非法token"); onLoginFail(servletResponse, "非法token"); return true; } // 执行方法中没有抛出异常就表示登录成功 }
时间: 2024-02-15 20:30:29 浏览: 61
Spring MVC打印@RequestBody、@Response日志的方法
5星 · 资源好评率100%
这段代码是自定义的JWT认证拦截器中的代码,用于判断JWT令牌是否有效。在isAccessAllowed()方法中,我们先将所有请求全部拒绝,这样在onAccessDenied()方法中就可以对请求进行认证了。在onAccessDenied()方法中,首先获取请求头中的Authorization字段,该字段的值应该是JWT令牌。如果请求头中没有Authorization字段,就认为请求非法,并返回true。如果请求头中有Authorization字段,就调用JwtUtils.verify()方法对JWT令牌进行验证。如果JWT令牌验证通过,就从令牌中获取tokenid,并通过RedisUtil来判断该令牌是否有效。如果JWT令牌已经过期,则返回false,并调用onLoginFail()方法来返回错误信息。如果JWT令牌验证通过且未过期,则返回true,表示请求通过认证。需要注意的是,这里的onLoginFail()方法是自定义的方法,用于返回错误信息给客户端。
阅读全文