遇见问题:
在监听器中注入类出错
原本通过注入 框架会帮我实例化的类 结果是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>
```