Session监听类HttpSessionListener介绍及在listener里取得request
Session监听类HttpSessionListener介绍及在listener里取得request
servlet-api.jar中提供了监听类HttpSessionListener,主要方法有两个,sessionCreated、sessionDestroyed,根据方法名就能明白是监听session的创建和销毁.
首先不可避免的要在sessionCreated方法中想要取得request对象(进而取得用户ip,浏览器等属性),但是HttpSessionEvent显然直接取不到request对象。
研究了下,发现spring(主要是context jar包)提供了监听类:RequestContextListener,可直接配在web.xml中,通过这个监听器,可以直接拿到request上下文。示例如下:
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
System.out.println(request.getHeader("user-agent"));
--------------------------------
另外,在sessionCreated虽然能取得request对象,但千万不能写request.getSession(true)类似的方法,这样会引起死循环,理由是sessionCreated监听session被创建时,此时的session还没有完全被建立,因为用request.getSession(true)并不能拿到我们想要的那个session实例(大家都知道request.getSession(true) 表示获取session对象,若session不存在则会再创建)。
于是就会悲剧的陷入:监听方法中用request取得session,没拿到,创建session,监听方法又生效,生效后继续取得session,没拿到,创建session... 这样的循环中。
综上,session实例应从HttpSessionEvent拿。
Session监听类HttpSessionListener介绍及在listener里取得request的更多相关文章
- [Java聊天室server]实战之二 监听类
前言 学习不论什么一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列尽管涉及的是socket相关的知识,但学习之前,更 ...
- Session监听事件的处理
设置Session监听 在web.xml文件中: <listener> <listener-class>cjq.login.listener.UpdateLogOutTime ...
- Android手势监听类GestureDetector的使用
在使用自定义视图的时候,对触屏事件的处理是比不可少的,有能力的可以自己写代码处理,这样更加的灵活.如果不想这么麻烦,Android提供了一个手势监听类GestureDetector,可以供我们使用.G ...
- Ogre 监听类与渲染流程
Ogre中有许多监听类,我们可以简单理解成C#中的事件,这些类作用都不小,说大点可能改变流程,说小点修改参数等,下面列举一些常用的监听类. FrameListener:由Ogre中的Root负责维护, ...
- jsp&servlet——session监听
session监听,需要实现HttpSessionAttributeListener接口 attributeAdded:监听添加session attributeRemoved:监听删除session ...
- 基于Java+Selenium的WebUI自动化测试框架(四)-----设置监听类
基于上一篇的内容,这里我们开始写监听类Listener.我这里写监听类的思路是,继承TestListenerAdapter这个类,然后对其中的方法进行重写.网上也有很多资料,建议先学习一下,然后写出来 ...
- java web session监听销毁跳转
1.了解如何使用HttpSessionListener监听session的销毁. 2.了解如何使用HttpSessionBindingListener监听session的销毁. 一. 使用HttpSe ...
- java中的四种监听类用法
在此列举四种方法: 自身类实现ActionListener接口,作为事件监听器 通过匿名类处理 通过内部类处理 通过外部类处理 下面依次介绍: 第一种:自身类实现ActionListener接口,作为 ...
- kafka监听类
package com.datad.dream.service; import com.alibaba.fastjson.JSON; import com.datad.dream.dao.KafkaI ...
随机推荐
- 高德地图的权限Activity代码
/** * */package com.amap.location.demo; import java.lang.reflect.Method;import java.util.ArrayList;i ...
- java多线程面试题_线程并发面试题
1.什么是线程?线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成一个 ...
- Sublime Text添加gcc编译器
{ "shell_cmd" : "gcc $file_name -o ${file_base_name}", "working_dir" : ...
- spring在注解标注的方法上加切面
之前以为只能在方法签名上加切面,今天发现注解上也能加切面 1.自定义一个注解(任意注解都可以,不一定是自定义的) @Target({ElementType.METHOD}) @Retention(Re ...
- Python爬虫实战——反爬策略之模拟登录【CSDN】
在<Python爬虫实战-- Request对象之header伪装策略>中,我们就已经讲到:=="在header当中,我们经常会添加两个参数--cookie 和 User-Age ...
- flex: 1在ios10.2系统手机端的换行布局失败问题
使用flex:1要追加flex-basis: auto;可以简写flex: 1 1 auto; 表格不可以用flex布局
- 深入理解Magento – 第三章 – 布局,块和模板
深入理解Magento 作者:Alan Storm 翻译:Hailong Zhang 第三章 – 布局,块和模板 我们接着研究Magento.根据我们第二章讲的Magento MVC的架构,我们接下来 ...
- js设计模式——3.观察者模式
js设计模式——观察者模式 /*js设计模式——.观察者模式*/ // 主题,保存状态,状态变化之后触发所有观察者对象 class Subject { constructor() { this.sta ...
- flutter 调用摄像头和照片
设置一个按钮调用 打开showCupertinoModalPopup FloatingActionButton(onPressed: (){ _showDialog(context); }, chil ...
- 【Java多线程系列随笔一】浅析 Java Thread.join()
一.在研究join的用法之前,先明确两件事情. 1.join方法定义在Thread类中,则调用者必须是一个线程, 例如: Thread t = new CustomThread(); //这里一般是自 ...