项目需求做日志记录,所有非运行期异常都要捕获,并且记录
而记录时候需要记录下当前操作用户的Ip地址
此时如果在M层需要怎么做
现在只想到两种方法,一种是将M层的异常抛到C层,又Action捕获
另一种是在调用dao的时候传一个request
但这两种方法貌似都不符合MVC结构的设计思想
所有想问,有没有什么方法可以在M层直接获取用户的IP地址呢

解决方案 »

  1.   

    M层如果不传入request是没得办法获得IP了。
    可以将日志单独做出一个类出来,在C层捕获M层的异常,将异常或者操作信息与用户IP当做参数传入日志方法里吧。
      

  2.   

    UPUP,难道真的没有别的办法了么
      

  3.   

    有人说scoket可以解决,但是在bs中存在sooket么?请高人指教一下
      

  4.   

    如果你不想将request传递到M层,其实也是可以解决的定义一个静态变量public static ThreadLocal<String> currentIP = new ThreadLocal<String>();在最上层,调用currentIP.set(ip);
    在M层调用currentIP.get()就可以了,ThreadLocal可以保证线程安全的
      

  5.   

    从C层获取到IP,当做参数传给需要记录日志的M层。
      

  6.   

    一是在C层取得ip,传给M层。
    另一个是用线程变量ThreadLocal,推荐使用。
      

  7.   

    直接传IP到M层不一样吗
    为什么非要传request
      

  8.   

    ThreadLocal 现在能 上场了
      

  9.   

    upup
     ThreadLocal 的生命周期有多久
    我试了楼上的方法,在登陆时候将IP地址放进ThreadLocal 变量中
    但是后期有时候可以找到其中的值,有时候找不到
    想不通,谁能给解释下么
      

  10.   

    通常定义的ThreadLocal是静态的,里面存储的内容会跟随这个线程,这个线程销毁了就消失,只要还在运行就肯定还在(除非你调用set或者clear这样方法删除了)
    你要搞明白,ThreadLocal顾名思义是线程的局部变量。也就是你之前set了值进去,如果你还在同一个线程中是可以get出来的,如果是另外一个线程get就不可以拿出来
      

  11.   

    至于你说有时候可以,那是因为Tomcat是使用线程池的,你刚好拿到了上次的那个线程,所以还能取出之前设置的值