1. 程式人生 > >JavaWeb---Servlet監聽器實現單一登陸

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);

}