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
配置spring_mongo.xml配置文件
<?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 { } }

 以上配置完成 对项目后台的操作就能记录了 -----这只是简单的实现, 实际项目中要根据具体的业务需求来做完善 。

 欢迎大咖们提出意见和建议 点醒我这梦中人 ---谢谢---谢谢---

转载于:https://www.cnblogs.com/shl8202/p/7985958.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值