| package com.genersoft.iot.vmp.conf; | 
|   | 
| import com.genersoft.iot.vmp.common.ApiSaveConstant; | 
| import com.genersoft.iot.vmp.conf.security.SecurityUtils; | 
| import com.genersoft.iot.vmp.service.ILogService; | 
| import com.genersoft.iot.vmp.storager.dao.dto.LogDto; | 
| import com.genersoft.iot.vmp.utils.DateUtil; | 
| import org.apache.commons.lang3.StringUtils; | 
| import org.slf4j.Logger; | 
| import org.slf4j.LoggerFactory; | 
| import org.springframework.beans.factory.annotation.Autowired; | 
| import org.springframework.http.HttpStatus; | 
| import org.springframework.web.filter.OncePerRequestFilter; | 
|   | 
| import javax.servlet.*; | 
| import javax.servlet.annotation.WebFilter; | 
| import javax.servlet.http.HttpServletRequest; | 
| import javax.servlet.http.HttpServletResponse; | 
| import java.io.IOException; | 
|   | 
| /** | 
|  * @author lin | 
|  */ | 
| @WebFilter(filterName = "ApiAccessFilter", urlPatterns = "/api/*", asyncSupported=true) | 
| public class ApiAccessFilter extends OncePerRequestFilter { | 
|   | 
|     private final static Logger logger = LoggerFactory.getLogger(ApiAccessFilter.class); | 
|   | 
|   | 
|     @Autowired | 
|     private UserSetting userSetting; | 
|   | 
|     @Autowired | 
|     private ILogService logService; | 
|   | 
|   | 
|     @Override | 
|     protected void doFilterInternal(HttpServletRequest servletRequest, HttpServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException { | 
|         String username = null; | 
|         if (SecurityUtils.getUserInfo() == null) { | 
|             username = servletRequest.getParameter("username"); | 
|         }else { | 
|             username = SecurityUtils.getUserInfo().getUsername(); | 
|         } | 
|         long start = System.currentTimeMillis(); // 请求进入时间 | 
|         String uriName = ApiSaveConstant.getVal(servletRequest.getRequestURI()); | 
|   | 
|         filterChain.doFilter(servletRequest, servletResponse); | 
|   | 
|         if (uriName != null && userSetting.getLogInDatebase()) { | 
|   | 
|             LogDto logDto = new LogDto(); | 
|             logDto.setName(uriName); | 
|             logDto.setUsername(username); | 
|             logDto.setAddress(servletRequest.getRemoteAddr()); | 
|             logDto.setResult(HttpStatus.valueOf(servletResponse.getStatus()).toString()); | 
|             logDto.setTiming(System.currentTimeMillis() - start); | 
|             logDto.setType(servletRequest.getMethod()); | 
|             logDto.setUri(servletRequest.getRequestURI()); | 
|             logDto.setCreateTime(DateUtil.getNow()); | 
|             logService.add(logDto); | 
| //            logger.warn("[Api Access]  [{}] [{}] [{}] [{}] [{}] {}ms", | 
| //                    uriName, servletRequest.getMethod(), servletRequest.getRequestURI(), servletRequest.getRemoteAddr(), HttpStatus.valueOf(servletResponse.getStatus()), | 
| //                    System.currentTimeMillis() - start); | 
|   | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 获取IP地址 | 
|      * | 
|      * @param request 请求 | 
|      * @return request发起客户端的IP地址 | 
|      */ | 
|     private String getIP(HttpServletRequest request) { | 
|         if (request == null) { | 
|             return "0.0.0.0"; | 
|         } | 
|   | 
|         String Xip = request.getHeader("X-Real-IP"); | 
|         String XFor = request.getHeader("X-Forwarded-For"); | 
|   | 
|         String UNKNOWN_IP = "unknown"; | 
|         if (StringUtils.isNotEmpty(XFor) && !UNKNOWN_IP.equalsIgnoreCase(XFor)) { | 
|             //多次反向代理后会有多个ip值,第一个ip才是真实ip | 
|             int index = XFor.indexOf(","); | 
|             if (index != -1) { | 
|                 return XFor.substring(0, index); | 
|             } else { | 
|                 return XFor; | 
|             } | 
|         } | 
|   | 
|         XFor = Xip; | 
|         if (StringUtils.isNotEmpty(XFor) && !UNKNOWN_IP.equalsIgnoreCase(XFor)) { | 
|             return XFor; | 
|         } | 
|   | 
|         if (StringUtils.isBlank(XFor) || UNKNOWN_IP.equalsIgnoreCase(XFor)) { | 
|             XFor = request.getHeader("Proxy-Client-IP"); | 
|         } | 
|         if (StringUtils.isBlank(XFor) || UNKNOWN_IP.equalsIgnoreCase(XFor)) { | 
|             XFor = request.getHeader("WL-Proxy-Client-IP"); | 
|         } | 
|         if (StringUtils.isBlank(XFor) || UNKNOWN_IP.equalsIgnoreCase(XFor)) { | 
|             XFor = request.getHeader("HTTP_CLIENT_IP"); | 
|         } | 
|         if (StringUtils.isBlank(XFor) || UNKNOWN_IP.equalsIgnoreCase(XFor)) { | 
|             XFor = request.getHeader("HTTP_X_FORWARDED_FOR"); | 
|         } | 
|         if (StringUtils.isBlank(XFor) || UNKNOWN_IP.equalsIgnoreCase(XFor)) { | 
|             XFor = request.getRemoteAddr(); | 
|         } | 
|         return XFor; | 
|     } | 
| } |