1、建立一个监听器,实现HttpSessionAttributeListener接口,监听每一个Attribute的增加、编辑、删除事件。监听器中还要建立一个map,将所有的session放入这个map中。
2、在用户登录时将用户名、物理地址、Session id存到Session中去(可以建立一个用户登录地址数据传输对象,我建立了一个UserSessionAdd类,里面包含username,macAdd,sessionId三个属性,用户登录时将这个数据对象初始化,并存入到session中)。
3、每个新会话开启时,在监听器中对Session包含的属性进行判断,如果新增的属性与map中已有session的用户登录地址数据相同,则表示新会话与我们要做的两个限制相冲突。将与之冲突的会话提取出来,销毁掉!
这么说,还是不够清楚,下面看代码:
Web.xml文件:
Xml代码
用户登录地址数据传输对象:.
Java代码
public class UserSessionAdd {
private String add;
private String sessid;
private String username
public String getUsername(){
return username
}
Public void setUsername(String username){
https://www.wendangku.net/doc/1a18826409.html,ername=username;
}
public String getIp() {
return add;
}
public void setAdd(String add) {
this.add = add;
}
public String getSessid() {
return sessid;
}
public void setSessid(String sessid) {
this.sessid = sessid;
}
}
用户登录的代码:
Java代码
......
String userHost = request.getRemoteHost();
String sessionId = request.getSession().getId();
UserSessionAdd usa = new UserSessionAdd();
usa.setUsername(username);
usa.setSessid(sessionId);
usa.setAdd(userHost);
request.getSession().setAttribute(“usa”,usa);
......
监听器代码:
Java代码
public class MyListener implements HttpSessionAttributeListener{
Map
public void attributeAdded(HttpSessionBindingEvent event) {
String name = event.getName();
if(name.equals("usa")){
UserSessionAdd usa = (UserSessionAdd)event.getValue();
if(map.get(usa.getAdd())!=null){
HttpSession sess = map.get(usa.getAdd());
UserSessionAdd usa1 = (UserSessionAdd)sess.getAttribute("usa");
sess.removeAttribute("usa");
sess.invalidate();
}
map.put(usa.getAdd(), event.getSession());
}
}
public void attributeRemoved(HttpSessionBindingEvent event) {
String name = event.getName();
if(name.eq
uals("usa")){
UserSessionAdd usa = (UserSessionAdd)event.getValue();
map.remove(usa.getAdd());
}
}
public void attributeReplaced(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
......
}
}