会话以及日志拦截器的具体实现

   下面简要写一个session拦截器的具体代码实现:

   1、java代码实现

会话拦截器代码:

public class SessionInterceptor extends AbstractInterceptor{
 Logger log = Logger.getLogger(SessionFilter.class);
 @Override
 public String intercept(ActionInvocation invoc) throws Exception {
  ActionSupport action = (ActionSupport) invoc.getAction();
  
  String ns = invoc.getProxy().getNamespace();
  String actionName = invoc.getProxy().getActionName();
  String methodName = invoc.getProxy().getMethod();
  
  if(log.isInfoEnabled()){
   log.info("执行" + ns + actionName + "的" + methodName + "方法");
  }
  if(action instanceof SysUserAction){
   if("login".equalsIgnoreCase(methodName)){
    return invoc.invoke();
   }
  }
  
  Object obj = invoc.getInvocationContext().getSession().get("user");
  if(obj == null){
   log.error("用户无效或者Session过期,将返回登录页面");
   action.addActionError("用户无效或者Session过期");
   return ActionSupport.INPUT;
  }else{
   return invoc.invoke();
  }
 }

}

 

   日志拦截器的部分代码:

public String intercept(ActionInvocation invoc) throws Exception {
  if (!flag) {
   return invoc.invoke();
  }

  ActionSupport action = (ActionSupport) invoc.getAction();
  String ns = invoc.getProxy().getNamespace();
  String actionName = action.getClass().getName();
  String methodName = invoc.getProxy().getMethod();

  long before = System.currentTimeMillis();
  log.info("拦截[" + ns + actionName + "]的方法[" + methodName + "]");

  try {
   SystemLog sysLog = null;
   String ret = null;
   // 系统登录
   if ("login".equalsIgnoreCase(methodName)) {
    ret = invoc.invoke();

    SysUserAction ba = (SysUserAction) invoc.getAction();
    SysUser user = (SysUser) ba.getSession().getAttribute("user");
    if (user == null) {
     user = new SysUser();
     user.setUserName(ba.getLoginname());
     sysLog = writeLog(user, LOGIN, 0);
    } else {
     sysLog = writeLog(user, LOGIN, 1);
    }
   }
   // 系统退出
   else if ("logout".equalsIgnoreCase(methodName)) {
    SysUserAction ba = (SysUserAction) invoc.getAction();
    SysUser user = (SysUser) ba.getSession().getAttribute("user");

    ret = invoc.invoke();
    if(ba.getSession().getAttribute("user") != null){
     sysLog = writeLog(user, LOGOUT, 0);
    }else{
     sysLog = writeLog(user, LOGOUT, 1);
    }
   }

   sysLog.setWorkInfo(sysLog.getWorkInfo()
     + (sysLog.getWorkState() == 1 ? "成功" : "失败"));

   systemLogService.saveLog(sysLog);

   long after = System.currentTimeMillis();
   log.info("记录日志成功,共耗时为(ms):" + (after - before));
   return ret;
  } catch (Exception e) {
   log.error("记录日志出现异常,异常如下:" + e.getMessage());
   e.printStackTrace();
   return BaseAction.ERROR;
  }
 }

  

   2、strut2拦截器的配置

     在strut.xml文件中加入如下配置

     <interceptors>
   <!-- 判断Session有效性的拦截器 -->
   <interceptor name="sessionInterceptor"
    class="cn.com.core.SessionInterceptor "/>

  <!-- 记录日志的拦截器 -->
   <interceptor name="logInterceptor"
    class="cn.com.xinli.ccp.core.LogInterceptor">
   

   <interceptor-stack name="myStack">
    <interceptor-ref name="defaultStack"/>
     <interceptor-ref name="sessionInterceptor"/>
   </interceptor-stack>

 

    <interceptor-stack name="myLogStack">
    <interceptor-ref name="defaultStack"/>
    <interceptor-ref name="logInterceptor"/>
   </interceptor-stack>

  </interceptors>

 

 <!--默认session拦截器对任何action均有效-->

  <default-interceptor-ref name="myStack" />

 

  而记录日志的拦截器,我们可以配置让其生效的相应的action对象。所以如下面代码:表示仅仅用户在登录登出的时候才进行日志过滤记录。

  <action name="login" class="sysUserAction" method="login">
   <interceptor-ref name="myLogStack"></interceptor-ref>
   <result>main/manager_index.jsp</result>
  </action>
  <action name="logout" class="sysUserAction" method="logout">
   <interceptor-ref name="myLogStack"></interceptor-ref>
   <result type="redirect">index.jsp</result>
  </action>

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值