您的位置:首页 > 理论基础 > 计算机网络

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

2017-07-12 18:06 323 查看
需求

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属性中,供我们使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐