1. 程式人生 > >利用HttpSessionListener監聽器實現使用者資料儲存

利用HttpSessionListener監聽器實現使用者資料儲存

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屬性中,供我們使用。