用户登录日志功能

版权声明:============================================================ https://blog.csdn.net/csdn_yfqs/article/details/78722515

## 网站开发 用监听器写 用户登录日志功能 我用的是 ssm框架

 

遇见问题:
在监听器中注入类出错
原本通过注入 框架会帮我实例化的类    结果是null
看了下面的文档解决了
https://www.cnblogs.com/fengli9998/p/6542829.html

新建一个类继承这三个接口:HttpSessionListener 、ServletRequestListener、HttpSessionAttributeListener
```
public class UserLoginListener implements HttpSessionListener,ServletRequestListener,HttpSessionAttributeListener{
    //直接注入空指针
    /*@Autowired
    private UserLogService userLogService;*/
    private String ipAddress;
    private String userAgent;
    UserLogService userLogService ;
    /*private String type;//1-登出  0-登入
    private String userName;*/

    //这里保存的是最后登录  用户 的信息
    //HttpSessionListener
    public void sessionCreated(HttpSessionEvent se) {
        if (userLogService==null) {userLogService=WebApplicationContextUtils.getWebApplicationContext(se.getSession().getServletContext()).getBean(UserLogService.class);
        }
        //登录时操作
        //可以得到session对象
        /*UserDTO userDTO = (UserDTO)se.getSession().getAttribute("userDTO");
        userName = userDTO.getUser().getUserName();
        System.out.println("用户登录"+userDTO.getUser().getUserName());*/
        //创建session  时触发  此时  还没有往session中放值   所以 上面的代码  会出现空值
        /*type = "0";*/
    }

    public void sessionDestroyed(HttpSessionEvent se) {
        //登出时操作
        //可以得到session对象
        //销毁对象前      触发这个  就不会出现空指针错误   可以用来 记录用户什么时候登出
        //问题  如果对象 是直接关闭浏览器   而不是点击退出  只能等到session自动销毁  触发这个事件    
        UserDTO userDTO = (UserDTO)se.getSession().getAttribute("userDTO");
        System.out.println("用户退出"+userDTO.getUser().getUserName());
        System.out.println(ipAddress+"/"+userAgent);
        String type = "1";
        //在这里  向登录日志表中添加数据  
        UserLog userLog = new UserLog();
        userLog.setRemoteAddr(ipAddress);
        userLog.setUserAgent(userAgent);
        userLog.setCreateBy(userDTO.getUser().getUserName());
        userLog.setCreateTime(new Date());
        userLog.setType(type);
        userLogService.addLoginLogger(userLog);
    }

    //HttpSessionAttributeListener
    public void attributeAdded(HttpSessionBindingEvent se) {
        //往session中放值时 触发     这时session中有值  所以可以取到  不会空指针错误
        //这里 获取 登录用户的信息  用户名  登录时间   
         UserDTO userDTO = (UserDTO)se.getSession().getAttribute("userDTO");
        /*String userName = userDTO.getUser().getUserName();*/
        System.out.println("用户登录"+userDTO.getUser().getUserName());
        System.out.println(ipAddress+"/"+userAgent);
        String type = "0";
        //在这里  向登录日志表中添加数据  
        UserLog userLog = new UserLog();
        userLog.setRemoteAddr(ipAddress);
        userLog.setUserAgent(userAgent);
        userLog.setCreateBy(userDTO.getUser().getUserName());
        userLog.setCreateTime(new Date());
        userLog.setType(type);
        /*UserLogService userLogService = new UserLogServiceImpl();*///直接注入 出错
        userLogService.addLoginLogger(userLog);
    }

    public void attributeRemoved(HttpSessionBindingEvent se) {
        /*UserDTO userDTO = (UserDTO)se.getSession().getAttribute("userDTO");*/
        //用户退出后    这里的 里是空值  所以报错
        //移除session中的值  之后触发   所以 上面代码会空指针
        /*System.out.println("用户退出"+userName);
        type = "1";*/
    }
    
    public void attributeReplaced(HttpSessionBindingEvent se) {
        /*System.out.println("修改用户");*/
    }
    
    //ServletRequestListener
    public void requestDestroyed(ServletRequestEvent requestEvent) {
    }
    
    public void requestInitialized(ServletRequestEvent requestEvent) {
        //这里  获取用户的  ip地址  和  登录设备        
        HttpServletRequest request = (HttpServletRequest)requestEvent.getServletRequest();
        userAgent = request.getHeader("user-agent");
        ipAddress = request.getRemoteAddr();
        /*System.out.println(ipAddress+"/"+userAgent);*/        
    }
}
```
写完这个之后  还要在web.xml 中添加配置
```
<!-- 配置session监听器 -->
     <listener>
          <listener-class>mywebsite.listener.UserLoginListener</listener-class>
      </listener>
```

 

 

展开阅读全文

没有更多推荐了,返回首页