35、事件监听器

学习目标:

1、了解Servlet的监听器类的作用

2、能在项目中灵活的使用监听器

3、了解session会话的原理

学习过程:

一、监听器

什么是事件监听器,是指支持ServletContext、HttpSession及ServletRequest中状态改变的事件通知,在2.3规范后出现。实现了一个或多个servlet事件监听器接口的类型。

监听器类的规定,必须在部署描述符中配置实现类,最常用ServletContextListener和HttpSessionListener

1、ServletContextListener

ServletContextListener的作用一般是为整个WEB应用提供一些服务和支持。可以在服务器启动时做一些初始化的设置,或者服务器销毁是做一些回收操作等。

(1)ServletContextListener代码实现:

扫描二维码关注公众号,回复: 4350869 查看本文章

//应用程序监听程序
public class ApplicationListner implements ServletContextListener {

	public void contextInitialized(ServletContextEvent sce) {
		System.out.println("应用程序启动了。");
	}

	public void contextDestroyed(ServletContextEvent sce) {
		System.out.println("应用程序关闭了了。");
	}

}

在web.xml的配置:

	<listener>
	   <listener-class>com.lisnster.ApplicationListner</listener-class>
	</listener>

2、HttpSessionListener

可以监听新建或者销毁session时候自动触发

//每一个新的session访问就会自动调用
public class SessionListener implements HttpSessionListener {

	public void sessionCreated(HttpSessionEvent arg0) {
		System.out.println("一个新的session建立了。");
		
	}

	public void sessionDestroyed(HttpSessionEvent arg0) {
		System.out.println("一个session销毁了。");
		
	}

}

在web.xml的配置:

	<listener>
	 <listener-class>com.lisnster.SessionListener</listener-class>
	</listener>

二、session实现机制

我们前面讲过http协议是一种无状态的协议,是一次连接,服务器本身并不能区分出当前是哪一个浏览器在访问它,以为一次连接后就断开这个连接了,那么我们的的Session保存的数据又是如何实现的呢。服务器是如何区分当前是哪一个会话呢?各种网页编程语言如:asp.net php java都实现了自己的一套session管理机制的:

1、服务器需要一个很好的办法来区分不同的浏览器的会话,就是每一个新的用户访问服务器时都会为其分配一个唯一的sessionid。所有每一个会话都会分配一个唯一标识。

2、因为服务器需要知道这个客户端是哪一个,服务器需要在客户端与服务器间不停的传递sessionid的,会话状态的维护就是要靠增加这个来做到的吧,这个操作不需要我们用户或者程序员操作的,有浏览器和服务器之间自动完成。当然我们明白这个机制后,也可以自己写一个http的连接,然后保存这个sessionid,这样我们就可以保存和服务器的会话了。

3、这个sessionid既保持在服务器,也保存在客户端,第一次访问是有服务器生成,并发回给浏览器,浏览器以后每次访问服务都会发给服务器。举个例子来说吧,比如你第一天上班,公司会给你办一张门禁卡,以后你天天上班都要带着这张门禁卡打卡,公司就知道是你来上班了。

在客户端一般sessionid是保存在cookie中的,如果cookie禁用了,那么会一get的方式在url中发送给服务器。当用户关闭浏览器是,服务器事实上是不知道的,sessionid会在默认会在用户不访问30分钟后才会把这个session销毁。大家也可以登录tomcat的服务器界面看看当前有几个sessionid在保存着。

这里我们以apache-tomcat-7.0.85为例子,不同tomcat的用户的配置有些不一样,所以大家要注意了,先添加一个管理用户,打开tomcat的目录下的conf目录下的tomcat-users.xml,打开这个文件,发现内容很多,其实都是注释,在这里添加一个用户就可以了。

 <user username="admin" password="admin" roles="manager-gui,manager-script,manager-jmx,manager-status"/>

打开tomcat的管理界面http://localhost:8080/。点击Tomcat Manager。

出现登录界面,输入你刚才添加的用户名和密码就可以了。

这时候你可以看到所有的项目,你可以看到当前有几个session,点击这个数字就可以看到sessionid了。

这个就是随机生成的保存在服务器的ssessionid

打开浏览器在cookie中也可以看到这个sessionid,每一次用于提交都会带上这个sessionid,这样服务端就知道是那一个会话了。

sessionid是保存在客户端,所以session id 应该是可以被监听到,然后伪造攻击的。看一下cookie保存的sessionid的名字:JSESSIONID。和服务器保存的Session Id是一样的,

当你关闭浏览器,事实上服务器是不知道的,只有当这个sessionId超过了指定的时间没有再次访问服务器,服务器才会把这个sessionId给删除,默认是30分钟,当然也是可以修改的,比如修改成为60分钟,打开web.xml,添加代码如下:

 <session-config>
  <session-timeout>60</session-timeout>
 </session-config>

猜你喜欢

转载自blog.csdn.net/liubao616311/article/details/84072097