maven项目中使用拦截器实现操作日志保存到mogodb数据库 -----测试代码
在pom.xml文件中加入
<!--mongodb --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>1.3.0.RELEASE</version> </dependency> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>2.11.1</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.6.0</version> </dependency>
在jdbc.properties的配置文件中添加MongoDB的是数据库链接信息及其他的一些配置
## mongo.dbname=database mongo.host=127.0.0.1 mongo.port=27017 mongo.connectionsPerHost=8 mongo.threadsAllowedToBlockForConnectionMultiplier=4 mongo.connectTimeout=1500 mongo.maxWaitTime=1500 mongo.autoConnectRetry=true mongo.socketKeepAlive=true mongo.socketTimeout=1500 mongo.slaveOk=true
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mongo="http://www.springframework.org/schema/data/mongo" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo-1.7.xsd http://www.springframework.org/schema/data/repository http://www.springframework.org/schema/data/repository/spring-repository-1.7.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd" > <!-- 引入属性文件 --> <context:property-placeholder location="classpath:jdbc.properties" /> <mongo:db-factory id="mongoDbFactory" dbname="${mongo.dbname}" mongo-ref="mongoClient" /> <mongo:mongo host="${mongo.host}" port="${mongo.port}"> <mongo:options connections-per-host="${mongo.connectionsPerHost}" threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}" connect-timeout="${mongo.connectTimeout}" max-wait-time="${mongo.maxWaitTime}" auto-connect-retry="${mongo.autoConnectRetry}" socket-keep-alive="${mongo.socketKeepAlive}" socket-timeout="${mongo.socketTimeout}" slave-ok="${mongo.slaveOk}" write-number="1" write-timeout="0" write-fsync="true"/> </mongo:mongo> <!--dbname="database" 数据库的集合名 可以在这写死 ,也可以在 数据库链接的配置文件中进行配置 --> <mongo:db-factory dbname="database" mongo-ref="mongo" /> <bean id="MongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" /> </bean> </beans>
因为我在web.xml中配置的是mybatis的监听
<!-- Spring和mybatis的配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mybatis.xml</param-value>
</context-param>
所以要将spring_mongo.xml 引入到spring_mybatis.xml中
<import resource="classpath:spring-mongo.xml"/>
新建logBean实体类package com.jk.login.model; import java.io.Serializable; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; @Document(collection="operationlogs") public class Operationlogs implements Serializable { /** * */ private static final long serialVersionUID = 17905552356189433L; @Id private String operlogid;//主键 private String operloginId;//操作者 private String operlognsolr;//操作者的角色 private String opertime;//操作时间 private String opercontroller;//全类名 private String operMethod;//方法名 private Integer tomcatport;//方法所在的行 private String operParams;//参数 private String operURI;//方法的请求路径 private String haoshi;//耗时 private String computerIp;//访问使用的设备ip private String computerName;//访问使用的设备编号 public String getOperlogid() { return operlogid; } public void setOperlogid(String operlogid) { this.operlogid = operlogid; } public String getOperloginId() { return operloginId; } public void setOperloginId(String operloginId) { this.operloginId = operloginId; } public String getOperlognsolr() { return operlognsolr; } public void setOperlognsolr(String operlognsolr) { this.operlognsolr = operlognsolr; } public String getOpertime() { return opertime; } public void setOpertime(String opertime) { this.opertime = opertime; } public String getOpercontroller() { return opercontroller; } public void setOpercontroller(String opercontroller) { this.opercontroller = opercontroller; } public String getOperMethod() { return operMethod; } public void setOperMethod(String operMethod) { this.operMethod = operMethod; } public String getOperParams() { return operParams; } public void setOperParams(String operParams) { this.operParams = operParams; } public String getOperURI() { return operURI; } public void setOperURI(String operURI) { this.operURI = operURI; } public String getComputerIp() { return computerIp; } public void setComputerIp(String computerIp) { this.computerIp = computerIp; } public String getComputerName() { return computerName; } public void setComputerName(String computerName) { this.computerName = computerName; } public Integer getTomcatport() { return tomcatport; } public void setTomcatport(Integer tomcatport) { this.tomcatport = tomcatport; } public String getHaoshi() { return haoshi; } public void setHaoshi(String haoshi) { this.haoshi = haoshi; } }
新建拦截器类
package com.jk.interceptors; import java.net.InetAddress; import java.net.UnknownHostException; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; import java.util.Map; import java.util.Map.Entry; import java.util.UUID; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import com.jk.login.model.Operationlogs; import com.jk.login.model.userlogin; public class MyInterceptor implements HandlerInterceptor { @Autowired private MongoTemplate mongoTemplate; Operationlogs oper=new Operationlogs(); /*@Id private String operlogid;//主键 private String operloginId;//操作者 private String operlognsolr;//操作者的角色 private String opertime;//操作时间 private String opercontroller;//全类名 private String operMethod;//方法名 private Integer tomcatport;//方法所在的行 private String operParams;//参数 private String operURI;//方法的请求路径 private String haoshi;//耗时 private String computerIp;//访问使用的设备ip private String computerName;//访问使用的设备编号 */ /* * 可以考虑作权限,日志,事务等等 * 该方法在目标方法调用之前被调用; * 若返回TURE,则继续调用后续的拦截器和目标方法 * 若返回FALSE,则不会调用后续的拦截器和目标方法 * * 预处理回调方法,实现处理器的预处理(如检查登陆),第三个参数为响应的处理器,自定义Controller * 返回值:true表示继续流程(如调用下一个拦截器或处理器);false表示流程中断(如登录检查失败), * 不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应; */ // before the actual handler will be executed-- 在实际的处理程序被执行之前 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { long startTime = System.currentTimeMillis(); request.setAttribute("startTime", startTime); if (handler instanceof HandlerMethod) { StringBuilder sb = new StringBuilder(1000); //打印到控制台 HandlerMethod h = (HandlerMethod) handler; sb.append("Controller: ").append(h.getBean().getClass().getName()).append("\n"); sb.append("Method : ").append(h.getMethod().getName()).append("\n"); sb.append("Params : ").append(getParamString(request.getParameterMap())).append("\n"); sb.append("URI : ").append(request.getRequestURI()).append("\n"); oper.setOperlogid(UUID.randomUUID().toString()); oper.setTomcatport(request.getServerPort()); oper.setOpercontroller(h.getBean().getClass().getName()); oper.setOperMethod(h.getMethod().getName()); oper.setOperParams(getParamString(request.getParameterMap())); oper.setOperURI(request.getRequestURI()); SimpleDateFormat sim=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); oper.setOpertime(sim.format(new Date())); //获取访问者IP String computerIp = request.getRemoteAddr(); String computerName = ""; if(!computerIp.equals("0:0:0:0:0:0:0:1")){ try { //获取访问者计算机名称 computerName = InetAddress.getByName(computerIp).getHostName(); } catch (UnknownHostException e) { e.printStackTrace(); } }else{ try { //获取计算机对象 InetAddress addr = InetAddress.getLocalHost(); computerName = addr.toString(); //获取本机的ip地址 computerIp = addr.getHostAddress(); } catch (UnknownHostException e) { e.printStackTrace(); } } oper.setComputerIp(computerIp); oper.setComputerName(computerName);//访问者计算机名称 System.out.println("执行前"+sb.toString()); } return true; } /** * 该方法在目标方法调用之后,渲染视图之前被调用; * 可以对请求域中的属性或视图做出修改 * * 后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView * (模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。 */ // after the handler is executed--在执行处理程序之后 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { userlogin usr= (userlogin) request.getSession().getAttribute("userMsg"); long startTime = (Long) request.getAttribute("startTime"); long endTime = System.currentTimeMillis(); long executeTime = endTime - startTime; if(handler instanceof HandlerMethod){ oper.setOperloginId(usr.getcLoginid()); oper.setOperlognsolr(usr.getcName()); oper.setHaoshi(executeTime+"ms"); mongoTemplate.save(oper); StringBuilder sb = new StringBuilder(1000); sb.append("CostTime : ").append(executeTime).append("ms").append("\n"); sb.append("-------------------------------------------------------------------------------"); System.out.println("执行后"+sb.toString()); } } //获取方法中的参数 private String getParamString(Map<String, String[]> map) { StringBuilder sb = new StringBuilder(); for(Entry<String,String[]> e:map.entrySet()){ sb.append(e.getKey()).append("="); String[] value = e.getValue(); if(value != null && value.length == 1){ sb.append(value[0]).append("\t"); }else{ sb.append(Arrays.toString(value)).append("\t"); } } return sb.toString(); } /** * 在渲染视图之后被调用; * 可以用来释放资源 * * 整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间, * 还可以进行一些资源清理, * 类似于try-catch-finally中的finally,但仅调用处理器执行链中 */ public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { } }
以上配置完成 对项目后台的操作就能记录了 -----这只是简单的实现, 实际项目中要根据具体的业务需求来做完善 。
欢迎大咖们提出意见和建议 点醒我这梦中人 ---谢谢---谢谢---