session session在30分钟失效后执行一个事务该怎么做? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 session.setMaxInactiveInterval(1800)//30分钟 session.setMaxInactiveInterval(1800)//30分钟 session监听器HttpSessionListener 或者HttpSessionBindingListener 能具体一点吗 ? 因为session监听器不会用,怎样实现啊? package Servlet;import javax.servlet.http.HttpSessionAttributeListener;import javax.servlet.http.HttpSessionBindingEvent;import javax.servlet.http.*;import java.util.*;public class SessionListener implements HttpSessionListener{ private static HashMap hUserName = new HashMap();//保存sessionID和username的映射 /**以下是实现HttpSessionListener中的方法**/ public void sessionCreated(HttpSessionEvent se){ } public void sessionDestroyed(HttpSessionEvent se){ hUserName.remove( se.getSession().getId() ); } /* * isAlreadyEnter-用于判断用户是否已经登录以及相应的处理方法 * @param sUserName String-登录的用户名称 * @return boolean-该用户是否已经登录过的标志 */ public static boolean isAlreadyEnter(HttpSession session,String sUserName){ boolean flag = false; if(hUserName.containsValue(sUserName)){//如果该用户已经登录过,则使上次登录的用户掉线(依据使用户名是否在hUserName中) flag = true; int i=0; //遍历原来的hUserName,删除原用户名对应的sessionID(即删除原来的sessionID和username) Iterator iter = hUserName.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry)iter.next(); Object key = entry.getKey(); Object val = entry.getValue(); i++; if( ( (String)val ).equals(sUserName) ){ hUserName.remove(key); } } session.setAttribute("ii", i); hUserName.put( session.getId(),sUserName );//添加现在的sessionID和username System.out.println("hUserName = " + hUserName); } else{//如果该用户没登录过,直接添加现在的sessionID和username flag = false; hUserName.put( session.getId(),sUserName ); System.out.println("hUserName = " + hUserName); } return flag; } 不过另外的一种不能用HIBERNATE去操作数据库,只能用JDBCpackage com.jzaccp.oa.grbg.sessionlistener;import javax.servlet.http.*; import javax.servlet.*; import java.util.*; public class onLineUser implements HttpSessionBindingListener { public onLineUser(){ } private Vector users=new Vector(); /** * 获取在线人数 * @return */ public int getCount(){ users.trimToSize(); return users.capacity(); } /** * 判断用户是否存在 * @param userName * @return */ public boolean existUser(String userName){ users.trimToSize(); boolean existUser=false; for (int i=0;i<users.capacity();i++ ) { if (userName.equals((String)users.get(i))) { existUser=true; break; } } return existUser; }/** * 删除用户 * @param userName * @return */ public boolean deleteUser(String userName) { users.trimToSize(); if(existUser(userName)){ int currUserIndex=-1; for(int i=0;i<users.capacity();i++){ if(userName.equals((String)users.get(i))){ currUserIndex=i; break; } } if (currUserIndex!=-1){ users.remove(currUserIndex); users.trimToSize(); return true; } } return false; } /** * 得到用户的列表 */ public Vector getOnLineUser() { return users; } /** * 植入session时调用的方法 * */ public void valueBound(HttpSessionBindingEvent e) { users.trimToSize(); if(!existUser(e.getName())){ users.add(e.getName()); System.out.print(e.getName()+"\t 登入到系统\t"+(new Date())); System.out.println(" 在线用户数为:"+getCount()); }else System.out.println(e.getName()+"已经存在"); } /** * * session过期或被关闭或退出调用的方法 */ public void valueUnbound(HttpSessionBindingEvent e) { users.trimToSize(); String userName=e.getName(); deleteUser(userName); System.out.print(userName+"\t 退出系统\t"+(new Date())); System.out.println(" 在线用户数为:"+getCount()); } } 也就是说在执行事务的时候,执行了一部分,但是还没有执行完,Session失效了是吧。。失效就让重新登陆呗。执行的东西又不是没有保存,呵呵,一次谈判不成功可以再来过的嘛 用sesion监听(HttpSessionListener)在监听session销毁是的方法中执行你要进行的操作就可以了。 tomcat中使用jpa的问题 spring下junit对持久代码的测试 JAVA + VC开发?? itext导出PDF 页码问题 ???? jdom中如何获取特定属性名称的元素节点? struts不用打包成war能不能发布? 希望大家一起来讨论一下CMP2.0的一些特性和局限性(PROCEDURE,MAX,SUM等),参与者有分 CORBA的问题,请大虾指教 为什么用EJB存取中文时都变成问号了?要怎么解决?高分!!!! 怎样调用EJB的问题 請高手們指點。感激不盡,在線等 关于类层之间的问题
HttpSessionListener 或者HttpSessionBindingListener
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.*;
import java.util.*;public class SessionListener implements HttpSessionListener
{
private static HashMap hUserName = new HashMap();//保存sessionID和username的映射
/**以下是实现HttpSessionListener中的方法**/
public void sessionCreated(HttpSessionEvent se){
}
public void sessionDestroyed(HttpSessionEvent se){
hUserName.remove( se.getSession().getId() );
}
/*
* isAlreadyEnter-用于判断用户是否已经登录以及相应的处理方法
* @param sUserName String-登录的用户名称
* @return boolean-该用户是否已经登录过的标志
*/
public static boolean isAlreadyEnter(HttpSession session,String sUserName){
boolean flag = false;
if(hUserName.containsValue(sUserName)){//如果该用户已经登录过,则使上次登录的用户掉线(依据使用户名是否在hUserName中)
flag = true;
int i=0;
//遍历原来的hUserName,删除原用户名对应的sessionID(即删除原来的sessionID和username)
Iterator iter = hUserName.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry)iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
i++;
if( ( (String)val ).equals(sUserName) ){
hUserName.remove(key);
}
}
session.setAttribute("ii", i);
hUserName.put( session.getId(),sUserName );//添加现在的sessionID和username
System.out.println("hUserName = " + hUserName);
}
else{//如果该用户没登录过,直接添加现在的sessionID和username
flag = false;
hUserName.put( session.getId(),sUserName );
System.out.println("hUserName = " + hUserName);
}
return flag;
}
import javax.servlet.*;
import java.util.*; public class onLineUser implements HttpSessionBindingListener {
public onLineUser(){
} private Vector users=new Vector();
/**
* 获取在线人数
* @return
*/
public int getCount(){
users.trimToSize();
return users.capacity();
}
/**
* 判断用户是否存在
* @param userName
* @return
*/
public boolean existUser(String userName){
users.trimToSize();
boolean existUser=false;
for (int i=0;i<users.capacity();i++ )
{
if (userName.equals((String)users.get(i)))
{
existUser=true;
break;
}
}
return existUser;
}
/**
* 删除用户
* @param userName
* @return
*/
public boolean deleteUser(String userName) {
users.trimToSize();
if(existUser(userName)){
int currUserIndex=-1;
for(int i=0;i<users.capacity();i++){
if(userName.equals((String)users.get(i))){
currUserIndex=i;
break;
}
}
if (currUserIndex!=-1){
users.remove(currUserIndex);
users.trimToSize();
return true;
}
}
return false;
}
/**
* 得到用户的列表
*/
public Vector getOnLineUser()
{
return users;
}
/**
* 植入session时调用的方法
*
*/
public void valueBound(HttpSessionBindingEvent e) {
users.trimToSize();
if(!existUser(e.getName())){
users.add(e.getName());
System.out.print(e.getName()+"\t 登入到系统\t"+(new Date()));
System.out.println(" 在线用户数为:"+getCount());
}else
System.out.println(e.getName()+"已经存在");
}
/**
*
* session过期或被关闭或退出调用的方法
*/
public void valueUnbound(HttpSessionBindingEvent e) {
users.trimToSize();
String userName=e.getName();
deleteUser(userName);
System.out.print(userName+"\t 退出系统\t"+(new Date()));
System.out.println(" 在线用户数为:"+getCount());
} }