利用HttpSessionListener监听器实现用户数据存储


需求
web项目中,需要获取访问该网站用户的地区位置数据。
所以考虑直接用监听器的方式来实现,即用户第一次访问时,此时服务器会创建session,取得request中的ip信息,去调用封装到service中获取百度定位信息的业务方法,最后将取得的定位信息放置到session中,供session全局使用。
实现:
1、实现接口HttpSessionListener
@WebListener
public class WebHttpSessionListener implements HttpSessionListener{
@Override
public void sessionCreated(HttpSessionEvent se) {
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
}
}
当浏览器第一次访问应用时,会自动调用sessionCreated方法。我们可以在该方法中完成我们的主要逻辑。当session销毁时,会调sessionDestroyed方法。(由于我使用的是springboot,所以我这里使用注解方式注册监听器,添加@WebListener。)
2、根据需求,要获取定位信息必须要取到用户的ip信息,所以我们必须要取到request,我们知道,从session中我们是取不到request的,这里我们会实现另一个监听器:ServletRequestListener。用它,我们可以跟踪到request的生命周期。
@WebListener
public class WebHttpSessionListener implements HttpSessionListener,ServletRequestListener{
private HttpServletRequest request;
@Override
public void sessionCreated(HttpSessionEvent se) {
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
}
@Override
public void requestDestroyed(ServletRequestEvent sre) {
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
      request = (HttpServletRequest) sre.getServletRequest();
}
}
这里我们实现了HttpSessionListener,同时定义了一个HttpServletRequest 成员变量,它会在request初始化方法(requestInitialized)时进行赋值,以供我们使用。
3、去调用封装到service中获取百度定位信息的业务方法
获取百度定位信息的业务方法所在的业务类以被我们注册成spring管理的bean,所以我们想在监听器中调用需要首先获得spring的上下文WebApplicationContext。
如何取到它呢?
web容器初始化的时候会提供一个上下文,就是我们常见的ServletContext,同时还会定义一个ContextLoaderListener监听器来监听它的创建、销毁等,WebApplicationContext就是在这个监听器中被创建的,可以看下它监听ServletContext创建时的方法。
@Override
	public void contextInitialized(ServletContextEvent event) {
		initWebApplicationContext(event.getServletContext());
	}
有兴趣的可以继续跟踪下,WebApplicationContext最终被放在了ServletContext中,也就是说我们可以从ServletContext中取到我们所需要的WebApplicationContext。
@WebListener
public class WebHttpSessionListener implements ServletRequestListener,HttpSessionListener{
	private HttpServletRequest request;
	private MemberService memberService;
	@Override
	public void sessionCreated(HttpSessionEvent se) {
		WebApplicationContext application = (WebApplicationContext) se.getSession().getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
		memberService = (MemberService) application.getBean("memberService");
		se.getSession().setAttribute("memberAddress", memberService.getMemberAddress(request.getRemoteAddr()));
		System.out.println("一个session实例得到创建,并放入定位地址值");
	}
	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
		System.out.println("一个session实例正在销毁");
	}
	@Override
	public void requestDestroyed(ServletRequestEvent sre) {
	}
	@Override
	public void requestInitialized(ServletRequestEvent sre) {
		request = (HttpServletRequest) sre.getServletRequest();
	}
}
可以看到,我们成功取到想用的bean,并从其中取出我们所需要的定位数据放入到session属性中,供我们使用。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值