生活随笔
收集整理的這篇文章主要介紹了
Servlet判断用户是否登陆过、异地登录和登出功能
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Servlet判斷用戶是否登陸過和異地登錄功能 利用ServletContext+session+監聽器(Listener)實現 做login界面時當用戶進行登錄會有用戶再次登錄的情況,如果一個賬戶兩個人同時登錄會有許多不必要的麻煩,針對以上情況做出了一下代碼的修改 首先是兩個簡單的界面 login.html
< ! DOCTYPE html
>
< html lang
= "en" >
< head> < meta charset
= "UTF-8" > < title> 登錄界面
< / title
>
< / head
>
< body>
< ! -- action
= "login" 傳到servlet進行操作
-- >
< form action
= "login" method
= "post" > 用戶
: < input type
= "text" name
= "username" > < br
/ > 密碼
: < input type
= "password" name
= "password" > < br
/ > < input type
= "submit" value
= "登錄" >
< / form
>
< / body
>
< / html
>
hello.html
< ! DOCTYPE html
>
< html lang
= "en" >
< head> < meta charset
= "UTF-8" > < title> 登錄成功界面
< / title
>
< / head
>
< body>
< h1> 歡迎您的到來
, 尊敬的VIP用戶
< / h1
>
< input type
= "button" value
= "退出" onclick
= "location='loginOut'" >
< ! -- onclick
= "location='loginOut'" 表示點擊就會傳到servlet進行操作
-- >
< / body
>
< / html
>
然后是用戶類,get和set數據,我這里只是簡單的創建了一個 User
public class User { private String username
; private String password
; public User ( ) { } public User ( String username
, String password
) { this . username
= username
; this . password
= password
; } public String
getUsername ( ) { return username
; } public void setUsername ( String username
) { this . username
= username
; } public String
getPassword ( ) { return password
; } public void setPassword ( String password
) { this . password
= password
; } @Override public String
toString ( ) { return "User{" + "username='" + username
+ '\'' + ", password='" + password
+ '\'' + '}' ; }
}
接下來是UserDao的操作 UserDao 在這里只寫了一個查詢用戶名和密碼是否正確的接口
public interface UserDao { User
loginUser ( String username
, String password
) ;
}
UserDaoImpl 實現UserDao里的接口 模擬了一下數據庫進行查找數據的操作,可根據自己的數據庫重寫
public class UserDaoImpl implements UserDao { @Override public User
loginUser ( String username
, String password
) { boolean flag
= "111" . equals ( username
) && "111" . equals ( password
) ; if ( flag
) { return new User ( username
, password
) ; } return null
; }
}
LoginServlet 進行登錄時的servlet判斷
import javax
. servlet
. ServletContext
;
import javax
. servlet
. ServletException
;
import javax
. servlet
. annotation
. WebServlet
;
import javax
. servlet
. http
. HttpServlet
;
import javax
. servlet
. http
. HttpServletRequest
;
import javax
. servlet
. http
. HttpServletResponse
;
import javax
. servlet
. http
. HttpSession
;
import java
. io
. IOException
;
import java
. util
. HashMap
;
import java
. util
. Map
;
@WebServlet ( "/login" )
public class LoginServlet extends HttpServlet { @Override public void service ( HttpServletRequest request
, HttpServletResponse response
) throws ServletException
, IOException
{ request
. setCharacterEncoding ( "utf-8" ) ; response
. setContentType ( "text/html;charset=utf-8" ) ; String username
= request
. getParameter ( "username" ) ; String password
= request
. getParameter ( "password" ) ; UserDao dao
= new UserDaoImpl ( ) ; User user
= dao
. loginUser ( username
, password
) ; ServletContext sc
= request
. getServletContext ( ) ; HttpSession session
= request
. getSession ( ) ; String sessionId
= session
. getId ( ) ; Map
< String, String> map
= ( Map
< String, String> ) sc
. getAttribute ( "loginMap" ) ; if ( map
== null
) { map
= new HashMap < > ( ) ; } if ( user
!= null
) { for ( String name
: map
. keySet ( ) ) { System
. out
. println ( 111 ) ; if ( username
. equals ( name
) ) { if ( sessionId
. equals ( map
. get ( name
) ) ) { System
. out
. println ( "用戶重復" ) ; response
. getWriter ( ) . println ( "<h1>用戶重復登錄</h1>" ) ; return ; } else { response
. getWriter ( ) . println ( "<h1>禁止異地登錄</h1>" ) ; return ; } } } map
. put ( username
, sessionId
) ; sc
. setAttribute ( "loginMap" , map
) ; session
. setAttribute ( "username" , username
) ; response
. sendRedirect ( "index.html" ) ; } else { response
. getWriter ( ) . println ( "<h1>用戶名或密碼錯誤</h1>" ) ; } }
}
LoginOutServlet 用戶登出時,把當前sessionId值給手動消除,然后重定向到登錄頁面
import javax
. servlet
. ServletException
;
import javax
. servlet
. annotation
. WebServlet
;
import javax
. servlet
. http
. HttpServlet
;
import javax
. servlet
. http
. HttpServletRequest
;
import javax
. servlet
. http
. HttpServletResponse
;
import java
. io
. IOException
;
@WebServlet ( "/loginOut" )
public class LoginOutServlet extends HttpServlet { @Override public void service ( HttpServletRequest request
, HttpServletResponse response
) throws ServletException
, IOException
{ request
. getSession ( ) . invalidate ( ) ; response
. sendRedirect ( "hello.html" ) ; }
}
LoginListener 當用戶登出,手動銷毀了sessionId,然后監聽器監聽到sessionId的銷毀,進行如下操作,重新添加map
import javax
. servlet
. ServletContext
;
import javax
. servlet
. annotation
. WebListener
;
import javax
. servlet
. http
. HttpSession
;
import javax
. servlet
. http
. HttpSessionEvent
;
import javax
. servlet
. http
. HttpSessionListener
;
import java
. util
. Map
;
@WebListener
public class LoginListener implements HttpSessionListener { @Override public void sessionCreated ( HttpSessionEvent httpSessionEvent
) { } @Override public void sessionDestroyed ( HttpSessionEvent httpSessionEvent
) { System
. out
. println ( "銷毀session" ) ; ServletContext sc
= httpSessionEvent
. getSession ( ) . getServletContext ( ) ; HttpSession session
= httpSessionEvent
. getSession ( ) ; Map
< String, String> map
= ( Map
< String, String> ) sc
. getAttribute ( "loginMap" ) ; String username
= ( String
) session
. getAttribute ( "username" ) ; map
. remove ( username
) ; sc
. setAttribute ( "loginMap" , map
) ; }
}
總結
以上是生活随笔 為你收集整理的Servlet判断用户是否登陆过、异地登录和登出功能 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。