You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lvyuou/AccessInterceptor.java

138 lines
5.1 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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();
}
}