JavaWeb---Servlet監聽器實現單一登陸
1. 監聽器實現單一登入
對session有過一點了解的人員應該都知道,在java中session的預設的銷燬時間是大於或等於30分鐘,如果你對session的生命週期不做任何配置的話,按照上面的設想,那麼只要使用者登陸上之後,這時該使用者的狀態設定為1,在大於30分鐘的時間內如果該使用者沒有向伺服器端發起任何請求的話,那麼這個session就會被銷燬掉,注意了,這時session生命週期結束以後自動銷燬的,並不是使用者點退出按鈕來銷燬的,那這樣就不能觸發使用者退出事件,那這個使用者的狀態你就沒法改變了,也就是說,如果按照上面的設想,你想想,如果遇到這樣的情況,那這個使用者的狀態就一直都是1了,那這個使用者以後再想登陸就再也登陸不上了。很明顯,這樣是不對的。
使用Servlet監聽器實現監聽使用者會話狀態,從而自動去改變使用者的登入狀態
a.對登陸進行判斷
<%
request.setCharacterEncoding("utf-8");
out.print("登陸處理頁面:");
//1.取到表單提交過來的資料
Stringname = request.getParameter("name");
Stringpwd = request.getParameter("pwd");
//2.載入jdbc驅動
Class.forName("com.mysql.jdbc.Driver");
//3.使用驅動管理類建立連結物件
Stringurl = "jdbc:mysql://127.0.0.1:3306/news?user=root&password=root"
Connectionconn = DriverManager.getConnection(url);
//4.通過連線物件建立執行物件
Statementstm = conn.createStatement();
//5.通過命令執行物件執行sql指令碼
Stringsql = "select * from users where uname ='" + name
+"' and upwd = '" + pwd + "'";
//6.執行查詢語句得到結果集
ResultSetrs = stm.executeQuery(sql);
//加判斷從session中和登陸的資料做對比
ServletContextcontext = getServletContext();
Map<String,String> us = (Map<String,String>)context.getAttribute("users");
//Boolean 狀態找到使用者則設定為ture
boolean falg = false;
if(us!=null){
//遍歷Map集合中的Key值
for(String k:us.keySet()){
//判斷us中這個Map是否儲存了登陸使用者
if(us.get(k).equals(name)){
//存在該使用者
falg=true;
%>
<script type="text/javascript">
alert("使用者" + name + "已經登陸,不能重複登陸!");
//在當前頁面跳轉
open("admin.jsp", "_self");
<%break;
}
}
}
//7.判斷狀態和結果集中是否有資料
if(!falg&&rs.next()) {
//將id:name 做鍵值對映儲存到Session
String Id= rs.getString(1);
us.put(Id,name);
//---------_________________________--
context.setAttribute("NAME", name);
if(name.equals("admin")){
response.sendRedirect("admin.jsp");
}%>
<script type="text/javascript">
alert(name + "登陸成功!");
//在當前頁面跳轉
open("admin.jsp", "_self");
</script>
<%
}else{
%>
<script type="text/javascript">
alert("登陸失敗!");
open("index.jsp", "_self");
</script>
<%
}
//8.關閉資源
rs.close();
stm.close();
conn.close();
//9.跳轉到首頁getRequestDispatcher 相當於forword跳轉動作
//request.getRequestDispatcher("../index.jsp");
%>
b.手動登出
<%
//取出name資料
ServletContext context = getServletContext();
String name = (String) context.getAttribute("NAME");
//再取出map資料
Map<String,String> us =(Map<String,String>)context.getAttribute(name);
if(us!=null){
//遍歷Map集合中的Key值
for(String k:us.keySet()){
//判斷us中這個Map是否儲存了登陸使用者
if(us.get(k).equals(name)){
//存在該使用者則去掉該使用者
us.remove(k);
}
}
}
//把移除後的資料設定進入session中
context.setAttribute("users",us);
context.removeAttribute("NAME");
response.sendRedirect("index.jsp");
%>
c.會話自動登出 將執行的方法
/**
* 會話登出將執行的方法
*/
@Override
publicvoidsessionDestroyed(HttpSessionEvent sev) {
System.out.println("會話登出");
// 得到session物件
HttpSessionsession = sev.getSession();
// 從session物件中得到context物件
ServletContextcontext = session.getServletContext();
// 取出name資料
Stringname = (String) context.getAttribute("NAME");
// 再取出map資料
Map<String,String> us = (Map<String, String>) context
.getAttribute(name);
if (us != null) {
// 遍歷Map集合中的Key值
for (String k :us.keySet()) {
// 判斷us中這個Map是否儲存了登陸使用者
if(us.get(k).equals(name)) {
// 存在該使用者則去掉該使用者
us.remove(k);
break;
}
}
// 把移除後的資料設定進入session中
context.setAttribute("users",us);
}