@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(CommonE rrorCode.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"); }解释代码
时间: 2024-04-20 14:27:09 浏览: 89
Struts2获取request的四种方式
这是一个Java代码,主要是一个拦截器的实现,用于对HTTP请求进行拦截、处理和过滤。
在preHandle方法中,首先获取HTTP请求的方法和URI,判断请求处理类是否为ResourceHttpRequestHandler或ParameterizableViewController,如果是则直接返回true,否则继续执行。然后获取请求处理方法上的ApiOperation注解,如果有则获取其value值(即该方法的访问名称),否则记录日志。
接下来判断请求URI是否在passUrl列表中,如果在则判断请求方法是否为OPTIONS,如果是则返回true,否则继续执行。passUrl列表用于存放不需要进行权限验证的请求URI。
然后判断请求是否携带有效的token,如果没有则抛出BusinessException异常,如果有则通过JWTBuilder解析token,并根据解析结果进行进一步处理。如果解析结果中包含SYS_EMPLOYEE_NAME,则表示该token为员工用户的token,否则为普通用户的token。如果为员工用户则进行相关操作记录,否则设置请求属性并返回true。
最后,如果请求方法不为OPTIONS且没有通过验证,则抛出BusinessException异常。
阅读全文