@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 17:27:09 浏览: 12
这是一个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异常。
相关问题
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
这是一个Java Web开发中的拦截器方法,用于在请求到达controller之前进行拦截处理。其中,HttpServletRequest代表HTTP请求,HttpServletResponse代表HTTP响应,Object handler代表请求的处理器。该方法返回一个boolean值,表示请求是否继续向下执行。如果返回true,请求继续向下执行;如果返回false,请求被拦截。
public class UserAccessInterceptor implements HandlerInterceptor { @Override 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 (StringUtils.isEmpty(token)) { // mute for OPTIONS if (request.getMethod().equalsIgnoreCase(HttpMethod.OPTIONS.name())) { return true; } // need log return false; } } UserContext userContext = Authentication.verify(token); if (userContext == null) { log.error(""); return false; } UserContextHolder.set(userContext); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { HandlerInterceptor.super.afterCompletion(request, response, handler, ex); } }解释一下这个类中方法用处
这个类是一个拦截器(Interceptor),用于在用户访问请求被处理前进行一些预处理操作。它实现了HandlerInterceptor接口,并重写了其中的三个方法。
1. preHandle方法:
这个方法在请求被处理之前被调用。它接收HttpServletRequest、HttpServletResponse和Object类型的参数。preHandle方法返回一个boolean值,表示是否继续执行后续的处理流程。
在这个方法中,首先从请求头中获取token,然后判断token是否为空。如果为空,还会进一步判断请求方法是否为OPTIONS,如果是则返回true,表示允许跨域请求的预检请求通过;否则,返回false,表示需要进行记录日志等操作。
如果token不为空,会调用Authentication.verify(token)方法进行验证。如果验证通过,将用户信息存入UserContextHolder中,并返回true;否则,记录错误日志,并返回false。
2. postHandle方法:
这个方法在请求被处理之后、视图渲染之前调用。它接收HttpServletRequest、HttpServletResponse、Object和ModelAndView类型的参数。postHandle方法没有返回值。
在这个方法中,可以对响应进行一些处理操作,比如设置响应头、添加响应结果等。
3. afterCompletion方法:
这个方法在整个请求处理完成后调用,包括视图渲染完毕。它接收HttpServletRequest、HttpServletResponse、Object和Exception类型的参数。afterCompletion方法没有返回值。
在这个方法中,可以进行一些清理操作,比如释放资源、记录请求处理时间等。
总结:UserAccessInterceptor类中的preHandle方法用于在请求被处理前进行预处理,postHandle和afterCompletion方法用于在请求处理完成后进行后续操作。这个类可以用于实现用户访问权限验证、日志记录等功能。