对于日志和事件的记录在每个项目中都会用到,如果在每个manager层中触发时间记录的话,会比较难以扩展和维护,所以可配置的日

    志和事件记录在项目中会用到!

一、拦截器实现日志记录

(一)首先配置一个自定义操作日志注解接口类

package cn.yxj.tool;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/*** 自定义操作日志注解接口类* @author **/
//表示在什么级别保存该注解信息
@Retention(RetentionPolicy.RUNTIME)
//表示该注解用于什么地方
@Target(ElementType.METHOD)
public @interface OperateLog {//操作日志的内容String content();//模块名String  moduleName();//操作类型String operateType() default "";//操作编号String code() default "";
}

(二)配置自定义拦截器

package cn.yxj.tool;import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;import javassist.ClassClassPath;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.ServletActionContext;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import cn.yxj.base.BaseService;
import cn.yxj.entity.PsLogs;
import cn.yxj.entity.PsUser;import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class OperateLogIntercepter extends AbstractInterceptor{private static final Log log=LogFactory.getLog(OperateLogIntercepter.class);/*=(PsLogsService) new PsLogsServiceImpl();*/@Overridepublic String intercept(ActionInvocation invocation) throws Exception {//第一种方式 自定义Spring容器   tomcat容器启动就会启动在bean里面注入Object bean = SpringContextHelper.getBean("psLogsService");//注入日志的service对象//第二种方式手动new的时候,调用的时候才会用到/*ApplicationContext con=new ClassPathXmlApplicationContext("applicationContext.xml");//注入日志的service对象Object bean = con.getBean("psLogsService");*/System.out.println("日志拦截器已经开始启动");Class<? extends Object> actionClass=invocation.getAction().getClass();String methodName=invocation.getProxy().getMethod();//获取当前方法Method currentMethod=actionClass.getMethod(methodName);System.out.println("当前方法+++++++++++++=="+currentMethod);boolean flag = currentMethod.isAnnotationPresent(OperateLog.class);//判断是否有自定义的注解OperateLogif(flag){OperateLog ol=currentMethod.getAnnotation(OperateLog.class);System.out.println(ol.content());PsLogs logs=new PsLogs();PsUser user=(PsUser)ServletActionContext.getRequest().getSession().getAttribute("info");//记录登录的信息这时候它在jsp和action之中所以并没有登录if(user==null){//没有登录以后记录数据库信息jsp的usercode值String userCode = ServletActionContext.getRequest().getParameter("usercode");String userPassWord= ServletActionContext.getRequest().getParameter("userpassWord");//获取当前登录用户的取值就可以在用户列表进行查询一道之后在给与赋值SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");Date date = sdf.parse(sdf.format(new Date()));logs.setOperateInfo(ol.content());logs.setOperatedatetime(date);logs.setUserCode(userCode);((BaseService<PsLogs>) bean).save(logs);}else{//登录以后记录数据库信息SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date date = sdf.parse(sdf.format(new Date()));logs.setOperateInfo(ol.content());logs.setOperatedatetime(date);logs.setUserCode(user.getUsercode());logs.setUserName(user.getUsername());((BaseService<PsLogs>) bean).save(logs);}}return invocation.invoke();}public static Log getLog() {return log;}
}

    注意点:如果用的是第一种方法注入日志service对象的话必须自定义一个Spring容器

      //第一种方式 自定义Spring容器   tomcat容器启动就会启动在bean里面注入Object bean = SpringContextHelper.getBean("psLogsService");//注入日志的service对象如果用第一种代码如下:
package cn.yxj.tool;import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;public class SpringContextHelper implements ApplicationContextAware{private static ApplicationContext context = null;  public void setApplicationContext(ApplicationContext applicationContext)throws BeansException {context = applicationContext; }public static Object getBean(String name){  return context.getBean(name);  }
}

并且在application.xml里面注入spring容器
 <bean  id="springContextHelper" class="cn.yxj.tool.SpringContextHelper"></bean>


  //第二种方式手动new的时候,调用的时候才会用到 无须代码加入因为直接new
  ApplicationContext con=new ClassPathXmlApplicationContext("applicationContext.xml");//注入日志的service对象 Object bean = con.getBean("psLogsService");  (三)配置自定义拦截器在struts.xml中
         <!--拦截器  --><interceptors><!--声明拦截器  --><!--权限设置拦截器  --><!-- <interceptor name="checkPrivilege" class="cn.yxj.intercepter.CheckPrivilegeIntercepter"></interceptor> --><!--操作日志的拦截器  --><interceptor name="operateLogIntercepter" class="cn.yxj.tool.OperateLogIntercepter"></interceptor><!--配置一个拦截器栈  --><interceptor-stack name="mystack"><!-- <interceptor-ref name="checkPrivilege"></interceptor-ref> --><interceptor-ref name="operateLogIntercepter"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack></interceptors><!--默认使用这个拦截器栈  --><default-interceptor-ref name="mystack"></default-interceptor-ref>

(四)在Action里面调用自定义注解
@OperateLog(moduleName="用户权限(功能表)",operateType="查询",content="浏览所有权限信息")

二、通过aop实现日志记录(一)定义自定义的注解类
package cn.yxj.tool;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 自定义操作日志注解接口类* @author Dream**/
//表示在什么级别保存该注解信息
@Retention(RetentionPolicy.RUNTIME)
//表示该注解用于什么地方
@Target(ElementType.METHOD)
public @interface OperateLog {//操作日志的内容String content();//模块名String  moduleName();//操作类型String operateType() default "";//操作编号String code() default "";
}

(二)定义方法的前置增强
package cn.yxj.advicer;import java.lang.reflect.Method;
import java.util.Date;import org.apache.struts2.ServletActionContext;
import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import cn.yxj.Util.OperateLog;
import cn.yxj.beans.PsLogs;
import cn.yxj.beans.PsUser;
import cn.yxj.service.PsLogsService;public class LogBeforeAdvice implements MethodBeforeAdvice{public void before(Method method, Object[] args, Object target)throws Throwable {System.out.println("日志记录开启");OperateLog annotation=method.getAnnotation(OperateLog.class);if(annotation!=null){ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");PsLogsService service = (PsLogsService)context.getBean("psLogsService");//获取session中用户的信息PsUser user=(PsUser)ServletActionContext.getRequest().getSession().getAttribute("loginuser");PsLogs logs=new PsLogs();logs.setOperatedatetime(new Date());logs.setOperateInfo(annotation.content());if(user==null){String userCode = ServletActionContext.getRequest().getParameter("userCode");String userPassWord= ServletActionContext.getRequest().getParameter("userPassWord");logs.setUserCode(userCode);}else{logs.setUserCode(user.getUserCode());logs.setUserName(user.getUserName());}service.save(logs);}}}

(三)在applicationContext.xml文件中配置
<!--aop log cfg 自动代理 --><bean name="logBefore" class="cn.hmy.advicer.LogBeforeAdvice"></bean><aop:config proxy-target-class="true"><aop:pointcut expression="execution(* *..action.*.*(..))" id="pointcut"/><aop:advisor advice-ref="logBefore" pointcut-ref="pointcut"/></aop:config>

三、使用过滤器实现日志记录(一)配置自定义过滤器
package cn.bdqn.filter;import java.io.IOException;
import java.util.Date;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import cn.bdqn.entity.PSUser;
import cn.bdqn.entity.Permission;
import cn.bdqn.entity.Role;
import cn.bdqn.entity.UserLog;
import cn.bdqn.service.IRoleService;
import cn.bdqn.service.IUserLogService;public class PermissionFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {HttpServletRequest req=(HttpServletRequest)request;String url=req.getRequestURI();if (url.endsWith(".js")) {chain.doFilter(request, response);} else if (url.endsWith(".css")) {chain.doFilter(request, response);} else if (url.endsWith(".html")) {chain.doFilter(request, response);} else if (url.endsWith(".txt")) {chain.doFilter(request, response);} else if (url.endsWith(".gif")) {chain.doFilter(request, response);} else if (url.endsWith(".jpg") || url.endsWith(".jpeg")) {chain.doFilter(request, response);} else if (url.endsWith(".png")) {chain.doFilter(request, response);}int pos=url.indexOf("?");if (pos>-1) {url=url.substring(0,pos); }int actionindex=url.indexOf(".action");if(actionindex>-1){url=url.substring(0,actionindex);}int of = url.indexOf("/", 2);url=url.substring(of+1);System.out.println("url地址"+url);PSUser user=(PSUser)req.getSession().getAttribute("user");if(url.equals("login")){chain.doFilter(request, response);}else if(user!=null){for (Role role : user.getRole()) {for (Permission permission : role.getPermission()) {if(permission.getUrl().equals(url)){UserLog log=new UserLog();log.setOptionDate(new Date());log.setOptionInfo(permission.getName());log.setUserCode(user.getUserCode());log.setUserid(user.getId());log.setUserName(user.getUserName());//获取spring的上下文容器ApplicationContext contex=new ClassPathXmlApplicationContext("applicationContext.xml");//获取spring容器中定义的IRoleService对象实例用于查询角色信息IUserLogService userLogService = contex.getBean(IUserLogService.class,"userLogService");userLogService.save(log);chain.doFilter(request, response);}}}}else{HttpServletResponse resp=(HttpServletResponse) response;//resp.sendRedirect(req.getScheme()+"://"+req.getServerName()+":"+req.getServerPort()+req.getContextPath()+"/login");resp.setCharacterEncoding("utf-8");resp.getWriter().write("<script type='text/javascript'>alert('您没有该权限')</script>");}}public void init(FilterConfig arg0) throws ServletException {}}

(二)在web.xml中配置过滤器  
1
2
3
4
5
6
7
8
9
<!-- 过滤器 -->
    <filter>
        <filter-name>OpenSession</filter-name>
        <filter-class>filter.PermissionFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>OpenSession</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

  

展示效果:    

转载于:https://www.cnblogs.com/SUNSHINEC/p/9559316.html

三种方式实现日志记录相关推荐

  1. flume三种方式收集日志的案例

    exec 监测某个单一的文件 # user_action_log_src 这个名字可以任意取 agent1.sources = user_action_log_src # memoryChannel ...

  2. discard connection丢失数据_python kafka 生产者发送数据的三种方式

    python kafka 生产者发送数据的三种方式 发送方式 同步发送 发送数据耗时最长 有发送数据的状态,不会丢失数据,数据可靠性高 以同步的方式发送消息时,一条一条的发送,对每条消息返回的结果判断 ...

  3. Kafka生产者发送消息的三种方式

    Kafka是一种分布式的基于发布/订阅的消息系统,它的高吞吐量.灵活的offset是其它消息系统所没有的. Kafka发送消息主要有三种方式: 1.发送并忘记 2.同步发送 3.异步发送+回调函数 下 ...

  4. MySQL(一):分别基于mysqldump、lvm2、xtrabackup三种方式实现备份恢复

    分别基于mysqldump.lvm2.xtrabackup三种方式实现MySQL备份恢复 一.利用mysqldump实施逻辑备份操作 1.在/etc/my.cnf中添加如下,开启二进制日志 innod ...

  5. MySQL删除表的三种方式

    文章目录 drop table truncate (table) delete from 三种方式的区别 用法总结 drop table drop 是直接删除表信息,速度最快,但是无法找回数据 例如删 ...

  6. Mysql清除表数据的三种方式

    Mysql 删除数据表的三种方式详解 用法: 1.当你不再需要该表时, 用 drop; 2.当你仍要保留该表,但要删除所有记录时, 用 truncate; 3.当你要删除部分记录或者有可能会后悔的话, ...

  7. mysql数据库删除数据的三种方式:

    mysql数据库删除数据的三种方式: delete from table where 直接删除表中的某一行数据,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作.所以delete相 ...

  8. response设置编码的三种方式以及比较

    https://blog.csdn.net/u010653908/article/details/53994021 response设置编码的三种方式以及比较 2017年01月03日 14:12:46 ...

  9. mysql 删除数据表中数据_Mysql-删除数据表-三种方式详解

    Mysql 删除数据表的三种方式详解 用法: 1.当你不再需要该表时, 用 drop; 2.当你仍要保留该表,但要删除所有记录时, 用 truncate; 3.当你要删除部分记录或者有可能会后悔的话, ...

最新文章

  1. VINS紧耦合优化公式及代码解析
  2. c语言switch计算利润,求助。。关于用switch编写简易计算器
  3. 常用 TCP 端口作用及其操作建议
  4. 在串口通信开发中实现自动查找串口端口的方法
  5. Unity 8 和 Snap 将会是 Ubuntu 的未来
  6. leetcode5:最长回文子串
  7. 高性能mysql 小查询_高性能MySQL06-查询优化(慢查询)
  8. 蓝桥杯2020年第十一届C++省赛第四题-蛇形填数
  9. sublime test3 安装及配置
  10. SAR图像聚焦质量评价插件
  11. 高效报表工具选型与推荐
  12. 产品助理入门攻略(一枚入行3年的PM内心独白)
  13. linux添加jetdirect协议,Linux系统中如何打印
  14. 暨南大学计算机专业考研录取目录,21考研必备 暨南大学2020计算机类研究生招生情况汇总...
  15. 正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。...
  16. 奋斗吧,程序员——第三十章 多情自古伤离别,更哪堪冷落清秋节
  17. 生成drl文件_drools原生drl规则文件的使用
  18. 【每日新闻】2019年大数据10大发展趋势出炉!
  19. 下雨天为何会让人安心
  20. char* 和 char[]的区别

热门文章

  1. SEO配置信息操作文档
  2. Office365-----Skype for business
  3. crontab 用法
  4. 设置VS2010中使用IntelliTrace来进行调试
  5. 十大经典排序算法动画与解析
  6. A Multi-task Deep Network for Person Re-identification
  7. 【数据挖掘笔记五】数据立方体技术
  8. 【正一专栏】爱是一种信仰
  9. 未处理异常和C++异常——Windows核心编程学习手札之二十五
  10. Tensorflow编程遇到的问题汇总【持续更新】