一、首先说明Web.xml 里面的Session-Config 属性
当session超时时,会调用httpSessionListener中的sessionDestroy()方法。
具体设置方法有三种:
(1)在主页面或者公共页面中加入:session.setMaxInactiveInterval(900);可以通过对应的getMaxInactiveInterval()获取。参数900单位是秒,即在没有活动15分钟后,session将失效。另外,通过调用Session的invalidate()方法可以使Session显示失效。
这里要注意这个session设置的时间是根据服务器来计算的,而不是客户端。所以如果是在调试程序,应该是修改服务器端时间来测试,而不是客户端。
(2)也是比较通用的设置session失效时间的方法,就是在项目的web.xml中添加Xml代码
session-config :如果某个会话在一定时间内未被访问,服务器可以抛弃它以节省内存。
可通过使用HttpSession的setMaxInactiveInterval方法明确设置单个会话对象的超时值,
或者可利用session-config元素制定缺省超时值。
<!-- session-config包含一个子元素session-timeout.定义web站台中的session参数. -->
<session-config>
<!-- 定义这个web站台所有session的有效期限.单位为分钟. 例子中为600分钟 -->
<session-timeout>600</session-timeout>
</session-config>
二、基于Session操作的一些应用
2.1 基于servlet API 的Session 操作
在一般系统中,也可能需要在session失效后做一些操作,
(1)控制用户数,当session失效后,系统的用户数减少一个等,控制用户数在一定范围内,确保系统的性能。
(2)控制一个用户多次登录,当session有效时,如果相同用户登录,就提示已经登录了,当session失效后,就可以不用提示,直接登录了。
那么如何在session失效后,进行一系列的操作呢?
这里就需要用到监听器了,即当session因为各种原因失效后,监听器就可以监听到,然后执行监听器中定义好的程序就可以了。
监听器类为:HttpSessionListener类,有sessionCreated和sessionDestroyed两个方法
自己可以继承这个类,然后分别实现。
sessionCreated指在session创建时执行的方法
sessionDestroyed指在session失效时执行的方法
package com.yuan.Session;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class SessionListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent se) {
// session创建时执行
SimpleDateFormat simpleFormat = new SimpleDateFormat("mm-ss-ms");
String nowtimes = simpleFormat.format(new Date());
//User u = (User)ActionContext.getContext().getSession().get("user");//structs的方法
//String username = (String)se.getSession().getAttribute("username");//用于获取元素,对象
System.out.println("执行。。 当前时间:"+nowtimes+");
HttpSession ses= se.getSession();
String id=ses.getId()+"_"+ses.getCreationTime();
}
public void sessionDestroyed(HttpSessionEvent arg0) {
// session失效时执行
SimpleDateFormat simpleFormat = new SimpleDateFormat("mm-ss-ms");
String nowtimes = simpleFormat.format(new Date());
System.out.println("session失效时间: "+nowtimes);
}
}
package com.yuan.Session;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class SessionListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent se) {
// session创建时执行
SimpleDateFormat simpleFormat = new SimpleDateFormat("mm-ss-ms");
String nowtimes = simpleFormat.format(new Date());
//User u = (User)ActionContext.getContext().getSession().get("user");//structs的方法
//String username = (String)se.getSession().getAttribute("username");//用于获取元素,对象
System.out.println("执行。。 当前时间:"+nowtimes+");
HttpSession ses= se.getSession();
String id=ses.getId()+"_"+ses.getCreationTime();
}
public void sessionDestroyed(HttpSessionEvent arg0) {
// session失效时执行
SimpleDateFormat simpleFormat = new SimpleDateFormat("mm-ss-ms");
String nowtimes = simpleFormat.format(new Date());
System.out.println("session失效时间: "+nowtimes);
}
}
这样的代码在传统的Servlet程序中是很常见的:因为使用了 Servlet API,从而对 Servlet API产生依赖。这样如果我们要测试 action,我们就必须针对 HttpServletRequest、HttpServletResponse 和 HttpSession类提供 mock 或者 stub 实现。当然现在已经有很多开源的 Servlet 测试框架帮助我们减轻这个痛苦,包括 Spring 就自带了对了这些类的 stub 实现,但那还是太冗繁琐碎了。那有没有比较好的办法来让我们的 controller 更 POJO,让我们的 action 脱离 Servlet API 依赖,更有益于测试和复用呢?我们来看看在 Spring2.5 中访问 Session 属性的几种解决方案,并将在本博的后续文章继续探究解决方案选择背后的深层含义。
备注:感觉测试会有问题,比较麻烦。
参考博文:可以查看该博文读取详细内容
2.2 spring 通过 申明来使用
Spring对annotationed的 action 的参数提供自动绑定支持的参数类型包括 Servlet API 里面的 Request/Response/HttpSession(包含Request、Response在Servlet API 中声明的具体子类)。于是开发人员可以通过在 action 参数中声明 Request 对象或者 HttpSession 对象,来让容器注入相应的对象。
action 的代码如下:
Java代码
@RequestMapping
public void hello(HttpSession session){
User user = (User)session.getAttribute("currentUser");
//...
}
@RequestMapping
public void hello(HttpSession session){
User user = (User)session.getAttribute("currentUser");
//...
}