一个小型的WEB项目,在SERVICE层用AOP做日志,所以需要获取到用户登录的信息,这个信息该存储在什么地方?(Session?在SERVICE层该怎么取?)

解决方案 »

  1.   

    struts2可以去到session的!spring中的话 貌似不知道!等待高人解答
      

  2.   

    取出用户信息,往SERVICE层中传参数
      

  3.   

    package com.frame.util.advice;import java.util.Date;import javax.servlet.http.HttpServletRequest;import org.aopalliance.intercept.MethodInterceptor;
    import org.aopalliance.intercept.MethodInvocation;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;import com.frame.session.SessionObject;
    import com.frame.session.SessionUtils;
    import com.heli.system.log.model.ASysOperateLog;
    import com.heli.system.log.service.OperateLogService;/**
     * @describtion: 系统操作日志增强
     *
     * @author : lhqheli (email: [email protected])
     * @date : 2013-3-28 下午11:30:00
     */
    public class LogAdvice implements MethodInterceptor{
    @Autowired
    private OperateLogService operateLogService;

    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
    ASysOperateLog operateLog = new ASysOperateLog();
    try {
    HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
    SessionObject sessionObj = SessionUtils.getSessionInfo(request);
    if(sessionObj != null){
    operateLog.setOperateUser(sessionObj.getLoginName());
    operateLog.setOperateOrg(sessionObj.getOrgId());
    }
    operateLog.setOperateIp(request.getRemoteAddr());
    operateLog.setRequestUri(request.getRequestURI());
    operateLog.setOperateTime(new Date());
    operateLog.setDescription("调用了:"+invocation.getThis().getClass().getName()
    +"." + invocation.getMethod().getName()+"()");
    String argsToString = "";
    for(Object arg : invocation.getArguments()){
    if(arg != null){
    argsToString += (arg.toString() +" || ");
    }
    }
    operateLog.setMethodArgs(argsToString);
    //调用执行方法
    Object obj =invocation.proceed();
    operateLog.setReturnValue(obj == null?"":obj.toString());
    return obj;
    } catch (Exception e) {
    e.printStackTrace();
    operateLog.setExceptionMsg(e.getMessage());
    throw e;
    }finally{
    //记录日志信息
    operateLogService.saveOperateLog(operateLog);
    }
    }

    }
    HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();只需要在web.xml中配置下面的代码就可以用上面获取request
    <!-- 配置后,可直接在springMVC中获取request对象 ,示例见系统操作日志advice方法获取request-->
    <listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>
      

  4.   

    4楼朋友的方法确实可以,其实我想问的是这么取合适吗?就是在SERVICE层去操作SESSION,这样实现SessionAware接口也可以吗?
      

  5.   

    在service层用request.getParameterByName("");
    这样就可以。注意request是HttpServlet
      

  6.   

    1、存在session中 
    2、当作service的一个参数  从action中传过去
      

  7.   

    传参数比较麻烦,提供一个set跟get登陆信息的静态方法好一些
      

  8.   

    穿参数我感觉也不好,"提供一个set跟get登陆信息的静态方法好一些"这个什么意思,能说的详细些么