利用HttpSessionListener监听器实现用户数据存储
2017-07-12 18:06
323 查看
需求:
web项目中,需要获取访问该网站用户的地区位置数据。
所以考虑直接用监听器的方式来实现,即用户第一次访问时,此时服务器会创建session,取得request中的ip信息,去调用封装到service中获取百度定位信息的业务方法,最后将取得的定位信息放置到session中,供session全局使用。
实现:
1、实现接口HttpSessionListener
当浏览器第一次访问应用时,会自动调用sessionCreated方法。我们可以在该方法中完成我们的主要逻辑。当session销毁时,会调sessionDestroyed方法。(由于我使用的是springboot,所以我这里使用注解方式注册监听器,添加@WebListener。)
2、根据需求,要获取定位信息必须要取到用户的ip信息,所以我们必须要取到request,我们知道,从session中我们是取不到request的,这里我们会实现另一个监听器:ServletRequestListener。用它,我们可以跟踪到request的生命周期。
这里我们实现了HttpSessionListener,同时定义了一个HttpServletRequest 成员变量,它会在request初始化方法(requestInitialized)时进行赋值,以供我们使用。
3、去调用封装到service中获取百度定位信息的业务方法
获取百度定位信息的业务方法所在的业务类以被我们注册成spring管理的bean,所以我们想在监听器中调用需要首先获得spring的上下文WebApplicationContext。
如何取到它呢?
web容器初始化的时候会提供一个上下文,就是我们常见的ServletContext,同时还会定义一个ContextLoaderListener监听器来监听它的创建、销毁等,WebApplicationContext就是在这个监听器中被创建的,可以看下它监听ServletContext创建时的方法。
有兴趣的可以继续跟踪下,WebApplicationContext最终被放在了ServletContext中,也就是说我们可以从ServletContext中取到我们所需要的WebApplicationContext。
可以看到,我们成功取到想用的bean,并从其中取出我们所需要的定位数据放入到session属性中,供我们使用。
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属性中,供我们使用。
相关文章推荐
- 利用rsync实现金笛邮件的用户数据的增量备份
- 利用AJAX实现简单的用户登录程序(处理服务端返回的文本数据)
- 利用FileOutputStream存储数据,实现代码中对象有存、取
- HTML5本地储存追加利用html5的本地存储功能实现登录用户信息保存
- 利用存储过程实现数据分页
- 安卓飞机大战(七) 存储用户数据并实现增删改查
- 消除javaScript Cookies的安全隐患,实现用户相关数据本地存储
- 线程共享的环境包括:进程代码段、进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)、进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID。 进程拥有这
- 利用89C52RC的DATAFLASH实现掉电存储数据
- ASE15.0中利用代理表实现统计用户表存储空间大小的功能
- 利用ShareObject实现Flash数据存储
- Android 数据存储 利用SQLiteDatabase实现简单的学生管理
- 利用bat批处理调用Exp、Imp自动实现Oracle数据库用户数据同步
- Mysql创建用户表并利用存储过程添加100万条随机用户数据
- .若A,B两个实体是一对多的包含关系。利用存储过程,实现数据访问层层的一个实例。
- 利用html5的本地存储功能实现登录用户信息保存
- 利用SharedPreference实现数据存储
- mysql利用存储过程实现对数据库数据的迁移
- 数据存储,实现用户登录界面及记住密码的实现。
- 利用HTML5新特性localstorage把用户数据暂时存储在客户端,用于之后上传