解释 if(!request.getMethod().equals("OPTIONS")){ // 检查是否存在Token String authorizationHeader = request.getHeader("Authorization"); System.out.println("header= "+authorizationHeader); if (authorizationHeader == null || !authorizationHeader.startsWith("Bearer ")) { System.out.println("token不存在"); response.sendError(HttpStatus.UNAUTHORIZED.value(), "无访问权限:缺少Token"); return false; }
时间: 2024-03-19 10:40:34 浏览: 233
这段代码是一个后端接口的拦截器,用于检查请求头中是否携带了有效的 Token,确保请求的安全性。如果请求方法不是 OPTIONS(OPTIONS 是一种用于获取目标资源所支持的通信选项的方法),则会从请求头中获取 Authorization 属性,判断其是否以 "Bearer " 开头。如果不存在或不以 "Bearer " 开头,则说明请求未携带有效的 Token,会返回一个 401 的错误响应,表示无访问权限。
相关问题
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // String token = TokenHelper.getFromReq(request); String token = request.getHeader(Authentication.TOKEN_NAME); if (StringUtils.isEmpty(token)) { // mute for OPTIONS if (!request.getMethod().equalsIgnoreCase(HttpMethod.OPTIONS.name())) { // need log return true; } return false; } UserContext userContext = Authentication.verify(token); if (userContext == null) { log.error(""); return false; } UserContextHolder.set(userContext); return true; } 这段代码干什么的
这段代码是一个拦截器(Interceptor)中的方法,用于在请求处理之前进行预处理。具体功能如下:
1. 获取请求中的 token 值。在这段代码中,使用 `request.getHeader(Authentication.TOKEN_NAME)` 方法从请求头中获取 token。
2. 检查 token 是否为空,如果为空,则判断请求方法是否为 OPTIONS。如果是 OPTIONS 请求,则直接返回 false,表示允许跨域请求的预检请求通过;如果不是 OPTIONS 请求,则需要记录日志,并返回 true。
3. 如果 token 不为空,则调用 `Authentication.verify(token)` 方法进行验证。如果验证成功,返回一个包含用户上下文信息的 `UserContext` 对象;如果验证失败,则记录错误日志,并返回 false。
4. 如果验证成功,将用户上下文信息存储到 `UserContextHolder` 中,以便后续代码可以获取到用户上下文信息。
5. 最后,返回 true 表示请求预处理通过,可以继续处理该请求。
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception { String method = request.getMethod(); String requestURI = request.getRequestURI(); if (o instanceof ResourceHttpRequestHandler || o instanceof ParameterizableViewController) { return true; } String accessName = "无"; HandlerMethod handlerMethod = (HandlerMethod) o; ApiOperation methodAnnotation = handlerMethod.getMethodAnnotation(ApiOperation.class); if (Validator.valid(methodAnnotation)) { accessName = methodAnnotation.value(); log.warn("########## requestURI: {} , method: {} , HandlerMethod: {} , IP: {} ##########", requestURI, method, accessName, IPUtil.getIPAddress(request)); } else { log.error("########## requestURI: {} , HandlerMethod: {} , IP: {} ##########", requestURI, method, IPUtil.getIPAddress(request)); } for (String url : passUrl) { if (UrlUtils.isLike(requestURI, url)) { return !method.equals("OPTIONS"); } } boolean hasPerm = false; if (!method.equals("OPTIONS")) { try { String token = request.getHeader("token"); System.out.println("token -------->>>>>> " + token); if (!Validator.valid(token)) { throw new BusinessException(CommonErrorCode.TOKEN_REMIND, "token不能为空"); } token = (String) permRedisManager.get(token); if (!Validator.valid(token)) { throw new BusinessException(CommonErrorCode.TOKEN_REMIND, "请重新登录"); } Map<String, Claim> result = JWTBuilder.parseJWT(token); if (Validator.valid(result.get(AuthUtil.SYS_EMPLOYEE_NAME))) { // hasPerm = true; DepositBox depositBox = setAttribute(request, result, AuthUtil.SYS_EMPLOYEE_NAME, token); //操作记录 String finalAccessName = accessName; } else if ((Validator.valid(result.get(AuthUtil.MEMBER_NAME)))) { if (requestURI.startsWith("/bg")) { throw new BusinessException(CommonErrorCode.NO_SESSION); } hasPerm = true; setAttribute(request, result, AuthUtil.MEMBER_NAME, token); } } catch (BusinessException e) { throw e; } catch (Exception e) { if (e instanceof NullPointerException) { throw new BusinessException(CommonErrorCode.TOKEN_REMIND, "token无效"); } else if (e instanceof JWTDecodeException) { throw new BusinessException(CommonErrorCode.TOKEN_REMIND, "token信息不完整"); } else { throw new BusinessException(e.toString()); } } } if (!method.equals("OPTIONS") && !hasPerm) { throw new BusinessException(CommonErrorCode.NO_SESSION); } return !method.equals("OPTIONS"); }解释代码
这段代码是一个Java Spring框架中拦截器(Interceptor)的实现,用于拦截所有的请求,并对请求进行处理。当请求到达时,会先判断该请求是否是静态资源请求或者是视图控制器请求,如果是,则直接放行。如果不是,则获取该请求的ApiOperation注解,用于记录该请求的访问名称。接着,会判断该请求是否在白名单中,如果是,则检查请求是否为OPTIONS方法,如果是,则放行。如果不是,则会进行权限校验,根据请求头中的token获取用户信息,并进行JWT解析和验证。如果验证通过,则将用户信息存储到request中,并返回true,表示该请求通过拦截器的校验,可以进行后续的处理。如果请求不在白名单中,且权限校验未通过,则会抛出BusinessException异常,表示该请求被拦截,无法通过。
阅读全文