package com.gk.study.interceptor; import com.google.gson.Gson; import com.gk.study.common.APIResponse; import com.gk.study.common.ResponeCode; import com.gk.study.entity.OpLog; import com.gk.study.entity.User; import com.gk.study.permission.Access; import com.gk.study.permission.AccessLevel; import com.gk.study.service.OpLogService; import com.gk.study.service.UserService; import com.gk.study.utils.IpUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.lang.reflect.Method; import java.text.SimpleDateFormat; import java.util.Date; /** * 该拦截器有两个用途:1.拦截request记录log 2.接口验权 */ @Component public class AccessInterceptor extends HandlerInterceptorAdapter { private Logger logger = LoggerFactory.getLogger(AccessInterceptor.class); private static OpLogService service; private static UserService userService; @Autowired public void setOpLogService( OpLogService service) { // 为解决先@Component 后@Autowired失效的方案 AccessInterceptor.service = service; } @Autowired public void setUserService( UserService userService) { // 为解决先@Component 后@Autowired失效的方案 AccessInterceptor.userService = userService; } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { request.setAttribute("_startTime", System.currentTimeMillis()); //**********************验权代码************************* if (!(handler instanceof HandlerMethod)) { return true; } HandlerMethod handlerMethod = (HandlerMethod) handler; Method method = handlerMethod.getMethod(); Access access = method.getAnnotation(Access.class); if (access == null) { // 如果注解为null, 说明不需要拦截, 直接放过 return true; } // 管理员 if(access.level().getCode() == AccessLevel.ADMIN.getCode()) { String token = request.getHeader("ADMINTOKEN"); logger.info("token==>" + token); User user = userService.getUserByToken(token); if(user != null && user.getRole().equals(String.valueOf(User.AdminUser))){ return true; }else { APIResponse apiResponse = new APIResponse(ResponeCode.FAIL, "无操作权限"); writeResponse(response, apiResponse); return false; } } // 用户 if(access.level().getCode() == AccessLevel.LOGIN.getCode()) { String token = request.getHeader("TOKEN"); logger.info("token==>" + token); User user = userService.getUserByToken(token); if(user != null && user.getRole().equals(String.valueOf(User.NormalUser))){ return true; }else { APIResponse apiResponse = new APIResponse(ResponeCode.FAIL, "未登录"); writeResponse(response, apiResponse); return false; } } return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { //**********************记录log代码************************* Long endTime = System.currentTimeMillis(); Long startTime = (Long) request.getAttribute("_startTime"); Long diff = (endTime - startTime); OpLog opLog = new OpLog(); opLog.setReIp(IpUtils.getIpAddr(request)); opLog.setReMethod(request.getMethod()); opLog.setReUrl(request.getRequestURI()); opLog.setReUa(request.getHeader(HttpHeaders.USER_AGENT)); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); opLog.setReTime(formatter.format(new Date())); opLog.setAccessTime(String.valueOf(diff)); service.createOpLog(opLog); } public void writeResponse(HttpServletResponse response, APIResponse apiResponse) throws IOException { response.setStatus(200); response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Cache-Control", "no-cache"); response.setCharacterEncoding("UTF-8"); response.setContentType("application/json"); Gson gson = new Gson(); String jsonStr = gson.toJson(apiResponse); response.getWriter().println(jsonStr); response.getWriter().flush(); } }