1.SessionListener.java如下:import javax.servlet.http.*;
import java.util.*;
public class SessionListener implements HttpSessionListener{
private static java.util.Hashtable hUserName = new Hashtable();
public void sessionCreated(HttpSessionEvent se){
System.out.println( "客户端已连接服务器 --会话号为: " + se);
} public void sessionDestroyed(HttpSessionEvent se){
hUserName.remove(se.getSession());
System.out.println( "用户会话已失效session -- " + se);
} public synchronized static boolean isLogined(HttpSession session,String user_id1,String user_name){//(踢掉先登陆者再抢)是否该帐户已经在使用Action调用
boolean flag = false;
if(hUserName.containsKey(user_id1)){
flag = true;
HttpSession vsession = (HttpSession)hUserName.get(user_id1);
try {
vsession.invalidate();//踢掉先登陆者
System.out.println("用户 - " + user_name + " || 已存在 - " +session);
System.out.println("用户 - " + user_name + " || 被挤掉了");
}
catch (Exception ex){}
}
else{
flag = false;
}
hUserName.remove(user_id1);
if(flag==false){//如果没有登陆则在哈西表中记录
hUserName.put(user_id1,session);
System.out.println("用户已经登陆: - " + user_name + " || 会话号为: - " +session);
}
return flag;
} public synchronized static boolean deleteUserName(HttpSession session,String user_id1)
{
Date date=new Date();
HttpSession vsession = (HttpSession)hUserName.get(user_id1);
System.out.println("用户已登出: - " + user_id1 + " || 会话号为: - " +session+date);
hUserName.remove(user_id1); //删除用户Action调用
vsession.invalidate();//
return true;
}
public synchronized static void Isconnent(HttpSession session,String user_id1,String user_name)
{
Date date=new Date();
System.out.println("用户已登出: - " + user_name + " || session - " +session+"|| 当前时间为"+date);
hUserName.remove(user_id1); //删除用户Action调用
}
public synchronized static boolean isOnline(HttpSession session,String user_id1){//登陆后使用判断是否已经登陆Action调用
boolean flag = false;
// System.out.println("======isOnline=======");
HttpSession vsession =null;
try{
vsession = (HttpSession) hUserName.get(user_id1);
}catch(Exception e){
flag = true;
System.out.println(user_id1+"验证登陆异常"); flag = false;
}
if(vsession != null){
if (session.getId().equals(vsession.getId())) {
flag = true;
System.out.println(user_id1+"通过验证");
} else {
flag = false;
}
}
return flag; }
}2.
Action中修改如下:
public String adminLogin() throws Exception { listUser = adm.findByAdmin(getUsername(), getPassword());
Iterator<UserInfo> iter = listUser.iterator();
HttpSession session = ServletActionContext.getRequest().getSession();
String username = "";
String userid = "";
if (listUser.size() != 0) {
Map session1 = ActionContext.getContext().getSession();
session1.put("user", getUsername());
/**
* 上面两句不加,获取不到session
*
* */
while (iter.hasNext()) {
UserInfo userInfo = iter.next();
session.setAttribute("username", userInfo.getUsername()
.toString().trim());
session.setAttribute("userid", userInfo.getUserid().toString()
.trim());
username = userInfo.getUsername().toString().trim();
userid = userInfo.getUserid();
}
boolean flag = SessionListener.isLogined(session, userid, username);
if (flag == true) {
return "isloged";
}
return "adminLogin";
} else {
addFieldError("username", "用户名或密码不正确或不存在");
return INPUT;
}
}3.web.xml文件:
<listener>
<listener-class>com.yaxing.utils.SessionListener</listener-class>
</listener>
第一次登录,一切正常
后台打印信息:
客户端已连接服务器 --会话号为: javax.servlet.http.HttpSessionEvent[source=org.apache.catalina.session.StandardSessionFacade@1827d1]
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Hibernate: select userinfo0_.userid as userid9_, userinfo0_.username as username9_, userinfo0_.password as password9_ from Student.dbo.UserInfo userinfo0_ where userinfo0_.username='admin' and userinfo0_.password='admin'
用户已经登陆: - admin || 会话号为: - org.apache.catalina.session.StandardSessionFacade@1827d1
登录成功!!
。当第二次登录再开一个窗口(360浏览器,IE7)的时候后台错误:
2011-8-21 18:40:33 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet default threw exception
java.lang.IllegalStateException
at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:407)
at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:771)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:506)
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:619)
Hibernate: select userinfo0_.userid as userid9_, userinfo0_.username as username9_, userinfo0_.password as password9_ from Student.dbo.UserInfo userinfo0_ where userinfo0_.username='admin' and userinfo0_.password='admin'
用户会话已失效session -- javax.servlet.http.HttpSessionEvent[source=org.apache.catalina.session.StandardSessionFacade@1827d1]
用户 - admin || 已存在 - org.apache.catalina.session.StandardSessionFacade@1827d1
用户 - admin || 被挤掉了
客户端已连接服务器 --会话号为: javax.servlet.http.HttpSessionEvent[source=org.apache.catalina.session.StandardSessionFacade@b11164]
前台显示:500错误HTTP Status 500 - --------------------------------------------------------------------------------type Exception reportmessage description The server encountered an internal error () that prevented it from fulfilling this request.exception java.lang.IllegalStateException
org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:407)
org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:771)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:506)
org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
note The full stack trace of the root cause is available in the Apache Tomcat/6.0.29 logs.
--------------------------------------------------------------------------------
import java.util.*;
public class SessionListener implements HttpSessionListener{
private static java.util.Hashtable hUserName = new Hashtable();
public void sessionCreated(HttpSessionEvent se){
System.out.println( "客户端已连接服务器 --会话号为: " + se);
} public void sessionDestroyed(HttpSessionEvent se){
hUserName.remove(se.getSession());
System.out.println( "用户会话已失效session -- " + se);
} public synchronized static boolean isLogined(HttpSession session,String user_id1,String user_name){//(踢掉先登陆者再抢)是否该帐户已经在使用Action调用
boolean flag = false;
if(hUserName.containsKey(user_id1)){
flag = true;
HttpSession vsession = (HttpSession)hUserName.get(user_id1);
try {
vsession.invalidate();//踢掉先登陆者
System.out.println("用户 - " + user_name + " || 已存在 - " +session);
System.out.println("用户 - " + user_name + " || 被挤掉了");
}
catch (Exception ex){}
}
else{
flag = false;
}
hUserName.remove(user_id1);
if(flag==false){//如果没有登陆则在哈西表中记录
hUserName.put(user_id1,session);
System.out.println("用户已经登陆: - " + user_name + " || 会话号为: - " +session);
}
return flag;
} public synchronized static boolean deleteUserName(HttpSession session,String user_id1)
{
Date date=new Date();
HttpSession vsession = (HttpSession)hUserName.get(user_id1);
System.out.println("用户已登出: - " + user_id1 + " || 会话号为: - " +session+date);
hUserName.remove(user_id1); //删除用户Action调用
vsession.invalidate();//
return true;
}
public synchronized static void Isconnent(HttpSession session,String user_id1,String user_name)
{
Date date=new Date();
System.out.println("用户已登出: - " + user_name + " || session - " +session+"|| 当前时间为"+date);
hUserName.remove(user_id1); //删除用户Action调用
}
public synchronized static boolean isOnline(HttpSession session,String user_id1){//登陆后使用判断是否已经登陆Action调用
boolean flag = false;
// System.out.println("======isOnline=======");
HttpSession vsession =null;
try{
vsession = (HttpSession) hUserName.get(user_id1);
}catch(Exception e){
flag = true;
System.out.println(user_id1+"验证登陆异常"); flag = false;
}
if(vsession != null){
if (session.getId().equals(vsession.getId())) {
flag = true;
System.out.println(user_id1+"通过验证");
} else {
flag = false;
}
}
return flag; }
}2.
Action中修改如下:
public String adminLogin() throws Exception { listUser = adm.findByAdmin(getUsername(), getPassword());
Iterator<UserInfo> iter = listUser.iterator();
HttpSession session = ServletActionContext.getRequest().getSession();
String username = "";
String userid = "";
if (listUser.size() != 0) {
Map session1 = ActionContext.getContext().getSession();
session1.put("user", getUsername());
/**
* 上面两句不加,获取不到session
*
* */
while (iter.hasNext()) {
UserInfo userInfo = iter.next();
session.setAttribute("username", userInfo.getUsername()
.toString().trim());
session.setAttribute("userid", userInfo.getUserid().toString()
.trim());
username = userInfo.getUsername().toString().trim();
userid = userInfo.getUserid();
}
boolean flag = SessionListener.isLogined(session, userid, username);
if (flag == true) {
return "isloged";
}
return "adminLogin";
} else {
addFieldError("username", "用户名或密码不正确或不存在");
return INPUT;
}
}3.web.xml文件:
<listener>
<listener-class>com.yaxing.utils.SessionListener</listener-class>
</listener>
第一次登录,一切正常
后台打印信息:
客户端已连接服务器 --会话号为: javax.servlet.http.HttpSessionEvent[source=org.apache.catalina.session.StandardSessionFacade@1827d1]
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Hibernate: select userinfo0_.userid as userid9_, userinfo0_.username as username9_, userinfo0_.password as password9_ from Student.dbo.UserInfo userinfo0_ where userinfo0_.username='admin' and userinfo0_.password='admin'
用户已经登陆: - admin || 会话号为: - org.apache.catalina.session.StandardSessionFacade@1827d1
登录成功!!
。当第二次登录再开一个窗口(360浏览器,IE7)的时候后台错误:
2011-8-21 18:40:33 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet default threw exception
java.lang.IllegalStateException
at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:407)
at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:771)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:506)
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:619)
Hibernate: select userinfo0_.userid as userid9_, userinfo0_.username as username9_, userinfo0_.password as password9_ from Student.dbo.UserInfo userinfo0_ where userinfo0_.username='admin' and userinfo0_.password='admin'
用户会话已失效session -- javax.servlet.http.HttpSessionEvent[source=org.apache.catalina.session.StandardSessionFacade@1827d1]
用户 - admin || 已存在 - org.apache.catalina.session.StandardSessionFacade@1827d1
用户 - admin || 被挤掉了
客户端已连接服务器 --会话号为: javax.servlet.http.HttpSessionEvent[source=org.apache.catalina.session.StandardSessionFacade@b11164]
前台显示:500错误HTTP Status 500 - --------------------------------------------------------------------------------type Exception reportmessage description The server encountered an internal error () that prevented it from fulfilling this request.exception java.lang.IllegalStateException
org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:407)
org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:771)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:506)
org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
note The full stack trace of the root cause is available in the Apache Tomcat/6.0.29 logs.
--------------------------------------------------------------------------------
没有使用Spring呢。另外,页面出错后,刷新下,竟然可以登录了。
但是那个检测重复登录的没有起作用呢。谢谢了。
if(hUserName == null) {
hUserName = new Hashtable();
} return hUserName;
}
boolean flag = false;
System.out.println(hUserName.containsKey(user_id1));
if(hUserName.containsKey(user_id1)){
flag = true;
HttpSession vsession = (HttpSession)hUserName.get(user_id1);
try {
vsession.invalidate();//踢掉先登陆者
System.out.println("用户 - " + user_name + " || 已存在 - " +session);
System.out.println("用户 - " + user_name + " || 被挤掉了");
}
catch (Exception ex){}
}
else{
flag = false;
}
到 if(hUserName.containsKey(user_id1)){这就报错了,java.lang.NullPointerException
com.yaxing.utils.SessionListener.isLogined(SessionListener.java:28)
com.yaxing.admin.action.LoginAction.adminLogin(LoginAction.java:114)
后台没有错误。谢谢。怎么回事呢~