监听 使用的几个问题?盼解答....谢哦
在网上找到个监听的例子,在使用过程(想实现限制重复登陆)却中遇到几个问题:
package aaa;
import java.util.Date;
import java.util.Vector;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class OnLineUser implements HttpSessionBindingListener {
public OnLineUser(){
}
private Vector users = new Vector();
public int getCount(){
users.trimToSize();
return users.capacity();
}
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;
}
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;
}
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()+"已经存在");
}
public void valueUnbound(HttpSessionBindingEvent e) { //session失效时会激活valueUnbound事件
users.trimToSize();
String userName=e.getName();
deleteUser(userName);
System.out.print(userName+"\t 退出系统\t"+(new Date()));
System.out.println(" 在线用户数为:"+getCount());
}
}
---------------------------------------
在web.xml中配置如下:
<listener>
<listener-class>aaa.OnLineUser</listener-class>
</listener>
问题1:该类是否是一个servlet,是否需要在web.xml中定义如下:
<servlet>
<servlet-name>OnLineUser</servlet-name>
<servlet-class>aaa.OnLineUser</servlet-class>
</servlet>
<!-- Mapping -->
<servlet-mapping>
<servlet-name>OnLineUser</servlet-name>
<url-pattern>/OnLineUser</url-pattern>
</servlet-mapping>
----------------------------------------------------------
假设有3个jsp,a.jsp为登陆,b.jsp为验证用户成功后的页面,c.jsp为b.jsp的下一级页面,我在b.JSP中使用如下:
<jsp:useBean id="onlineuser" class="aaa.OnLineUser" scope="application"/>
问题2:是否还需要这么定义?
继续:
<%
if(onlineuser.existUser(userID)){
response.sendRedirect("errorpage.jsp");
}else{
session.setAttribute(userID,onlineuser);
}
%>
这样能实现限制重复登陆,但是...
问题3:这样定义后,从a.jsp进入b.jsp的过程没有问题,也限制了别的用户登陆,但是问题来了,当我从c.jsp返回到b.jsp时就会提示我该用户正在使用中???
遇到这个问题,我该怎么解决?怎么才能使返回没有问题?
为了解决这个问题,我想在a.jsp对应的servlet中使用这个监听程序(为了避免c.jsp返回出现的问题),但是使用却没有反应?我是这么使用的:
OnLineUser onlineuser = new OnLineUser();
*
*
if(onlineuser.existUser(userID)){
message = "此用户已存在";
doError(req,res,message);
}else{
session.setAttribute(userID,onlineuser);
*
*}
这又是为啥啊?
谢谢了啊....了解这方面知识的朋友帮忙解答下啊.....
问题点数:100、回复次数:8Top
1 楼lndlzcy(落日弓)回复于 2004-12-04 11:52:09 得分 0
晕晕...谁都不知?99999啊…………Top
2 楼okitgo(IT浪涛儿)回复于 2004-12-04 14:15:59 得分 40
你要得到每个登陆用户的session的ID号, 用这个ID也加在判断中,如果一个用户的userName相同并且session的ID号也相同,我们不能把他看成是重复登陆!!
Top
3 楼okitgo(IT浪涛儿)回复于 2004-12-04 14:19:48 得分 0
我写过一个很简单的限制重复登陆程序.
用到了application 和session对象再加这个用户的UserName,也句话就搞定了事.
Top
4 楼lndlzcy(落日弓)回复于 2004-12-04 16:55:09 得分 0
恩,先谢谢你的回复啊...
按您的意思,我在判断时加了session的判断:
if(session.isNew() && onlineuser.existUser(userID))
但是没啥用....
对了,
HttpSessionBindingEvent e.getName
我看了J2EE API,这么解释的:
Returns the name with which the attribute is bound to or unbound from the session
这是返回哪个属性的名字?没理解....Top
5 楼lndlzcy(落日弓)回复于 2004-12-04 18:12:18 得分 0
唉,刷新了N+1遍了,还没更新...Top
6 楼power_zh(专门在技术区灌水赚分)回复于 2004-12-04 22:56:05 得分 30
upTop
7 楼lndlzcy(落日弓)回复于 2004-12-05 10:55:00 得分 0
弄好了
private Vector users = new Vector();
改为:
private static Vector users = new Vector();
郁闷........Top
8 楼jFresH_MaN(十一月的萧邦-夜曲)回复于 2004-12-05 11:04:45 得分 30
呵呵,学习Top




