Java實(shí)現(xiàn)用戶不可重復(fù)登錄功能
總述
前些天,無(wú)意之間想到這個(gè)問(wèn)題,感覺(jué)挺實(shí)用,有必要整理一下。隨手寫(xiě)了一個(gè)簡(jiǎn)單的mode,感覺(jué)并不算難。思路理順其實(shí)挺簡(jiǎn)單的。
為實(shí)現(xiàn)用戶不可同時(shí)登陸,只要想想現(xiàn)實(shí)中新浪,百度等,只要一處登陸就將另一處的給“擠”下去,就可以知道實(shí)現(xiàn)結(jié)果為何。然后再逆推之,即可形成較為清晰的思路。我們一起來(lái)探討一下。
首先,我們得明白用戶登錄使用什么登陸的,即用戶在線的原理。這只是將用戶的對(duì)象存放在了session中而已,然后再frame中進(jìn)行調(diào)用,其他特定頁(yè)面也進(jìn)行直接引用就行。那么實(shí)現(xiàn)“擠下來(lái)”的功能就是讓新生成的session有效,讓原來(lái)存放用戶的session失效就行。到此,大體思路已經(jīng)有了。那怎么實(shí)現(xiàn)呢?
想要知道怎么實(shí)現(xiàn),就必須要明白session存放用戶對(duì)象的過(guò)程了。在用戶登錄之后,我們可以得到用戶的對(duì)象user,而存放到session中需要執(zhí)行session.setAttribute(key,value); 我們將用戶的userId或是其他的唯一標(biāo)識(shí)存為key,將用戶對(duì)象存為值。這樣就能隨時(shí)隨地調(diào)用唯一用戶了。user存放的問(wèn)題解決了,那相同 登錄 時(shí)session廢除的問(wèn)題呢?
這個(gè)其實(shí)也不難,我們可以更具session的特性一樣,用map進(jìn)行存貯,將用戶的標(biāo)識(shí)存為key,而將其所對(duì)應(yīng)的session存為value,那么當(dāng)重復(fù)用戶登錄時(shí),只需要取出對(duì)應(yīng)的session,將其invalidate就行了。
至此,實(shí)現(xiàn)思路已經(jīng)明了,聒噪了這么久,大家都急不可耐地想看代碼了吧?以下是代碼:
前置準(zhǔn)備,jsp界面
界面很簡(jiǎn)單,只是一個(gè)簡(jiǎn)單的登錄界面
<form action ="<%=request.getContextPath()%>/UserWXPServlet" method = "post"> 用戶名<input type = "text" name = "username"/><br/> 密碼<input type = "text" name = "password"/><br/> <input type = "submit" value ="提交"/> </form>
成功后跳轉(zhuǎn)頁(yè)面
歡迎:${sessionScope.user.username}登陸!<br/>
我這沒(méi)有寫(xiě)失敗頁(yè)面,大家可以自己寫(xiě),失敗頁(yè)面也沒(méi)什么好說(shuō)的了
entity和登錄的實(shí)現(xiàn)
user的javabean
private String username;
private String password;
public User() {
}
public User(String user, String password) {
super();
this.username = user;
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;
}
登錄user的service實(shí)現(xiàn)方法,這里就不寫(xiě)dao和接口了,一切以簡(jiǎn)單為
public boolean dologin(User user){
Properties pro = new Properties();
InputStream is = UserWXPServlet.class.getClassLoader().getResourceAsStream("user_wxp.properties");
String password = null;
System.out.println(is+"--------->"+pro);
if(user==null){
return false;
}
try {
pro.load(is);
password = pro.getProperty(user.getUsername());
if(user.getPassword()!=null&&user.getPassword().equals(password)){
System.out.println("登陸成功");
return true;
}
} catch (IOException e) {
e.printStackTrace();
}finally{
if(is!=null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return false;
}
登錄成功返回true,失敗則返回false。
Servlet和相應(yīng)的邏輯工具類
接下來(lái)的代碼就到了真正操作用戶的代碼了
本人在這里定義了兩個(gè)類,一個(gè)工具類,一個(gè)核心servlet處理類
在工具類中加入了一些公共的元素,如以下代碼:
/**
* 每一個(gè)用戶存放一個(gè)session。便于各種操作?。?!
*/
public static Map<String, HttpSession> mapSession = new HashMap<String,HttpSession>();
用戶退出的代碼(必須飛廢除session或是remove相應(yīng)的用戶對(duì)象):
[java] view plain copy
public static void userLogout(String username){
if(mapSession.get(username)!=null){
//得到需要退出的用戶的session
HttpSession session = mapSession.get(username);
//在map<username,session>中移除該用戶,記住想要退出該用戶,必須將該session廢除或是remove掉user
mapSession.remove(username);
//得到session的所屬性合集
Enumeration e = session.getAttributeNames();
//刪除所有屬性
while(e.hasMoreElements()){
String sessionName = (String) e.nextElement();
session.removeAttribute(sessionName);
}
//廢除該session
session.invalidate();
}
}
Servlet的代碼如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
User user = new User(username, password);
UserService userService = new UserService();
HttpSession session = request.getSession();
if(userService.dologin(user)){
//登錄成功之后將用戶插入到session中
session.setAttribute("user", user);
if(cheackSession(username)){
//如果該session在此之前已經(jīng)存在,則將該用戶進(jìn)行退出操作
DbUtil.userLogout(username);
}
//將新的session存放到map<username,session>中
DbUtil.mapSession.put(username, session);
//操作成功,跳轉(zhuǎn),此處最好為重定向,讓別人知道登錄成功了
request.getRequestDispatcher("login").forward(request, response);
return ;
}
//此處跳轉(zhuǎn)到失敗頁(yè)面,如果讀者有興趣,可以自行添加
}
其中cheackSession(username) 的代碼如下:
/**
* 檢查是否已經(jīng)含有此session
* @param username
* @return true:已經(jīng)存在,該刪! false:未存在
*/
private boolean cheackSession(String username){
HttpSession session = DbUtil.mapSession.get(username);
if(session!=null){
return true;
}
return false;
}
最后附上Servlet的xml配置
<servlet> <description> 用于測(cè)試 ,用戶不可重復(fù)登錄 </description> <display-name>UserWXPServlet</display-name> <servlet-name>UserWXPServlet</servlet-name> <servlet-class>com.fingard.rabbit.wxp_test.Servlet.UserWXPServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UserWXPServlet</servlet-name> <url-pattern>/UserWXPServlet</url-pattern> </servlet-mapping>
以上所述是小編給大家介紹的Java實(shí)現(xiàn)用戶不可重復(fù)登錄功能,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Java CRM系統(tǒng)用戶登錄功能實(shí)現(xiàn)代碼實(shí)例
- Java+mysql用戶注冊(cè)登錄功能
- JavaWeb使用Cookie模擬實(shí)現(xiàn)自動(dòng)登錄功能(不需用戶名和密碼)
- JavaWeb實(shí)現(xiàn)用戶登錄注冊(cè)功能實(shí)例代碼(基于Servlet+JSP+JavaBean模式)
- Java struts2 validate用戶登錄校驗(yàn)功能實(shí)現(xiàn)
- JavaWeb實(shí)戰(zhàn)之用Servlet+JDBC實(shí)現(xiàn)用戶登錄與注冊(cè)
- Java實(shí)現(xiàn)多用戶注冊(cè)登錄的幸運(yùn)抽獎(jiǎng)
- Java 實(shí)現(xiàn)模擬用戶登錄的示例代碼
- Java實(shí)戰(zhàn)之實(shí)現(xiàn)用戶登錄
相關(guān)文章
配置gateway+nacos動(dòng)態(tài)路由管理流程
這篇文章主要介紹了配置gateway+nacos動(dòng)態(tài)路由管理流程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Java動(dòng)態(tài)代理靜態(tài)代理實(shí)例分析
這篇文章主要介紹了Java動(dòng)態(tài)代理靜態(tài)代理實(shí)例分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
Java Adapter 適配器模式(類適配器,對(duì)象適配器)優(yōu)缺點(diǎn)對(duì)比
這篇文章主要介紹了Java 適配器模式(類適配器,對(duì)象適配器)優(yōu)缺點(diǎn)對(duì)比的相關(guān)資料,java 適配器在基礎(chǔ)知識(shí)中還是比較重要的,這里就說(shuō)下如何使用,需要的朋友可以參考下2016-12-12
Synchronized?和?ReentrantLock?的實(shí)現(xiàn)原理及區(qū)別
這篇文章主要介紹了Synchronized?和?ReentrantLock?的實(shí)現(xiàn)原理及區(qū)別,文章為榮啊主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
SpringBoot中MyBatis-Plus 查詢時(shí)排除某些字段的操作方法
這篇文章主要介紹了SpringBoot中MyBatis-Plus 查詢時(shí)排除某些字段的操作方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08
postman中POST請(qǐng)求時(shí)參數(shù)包含參數(shù)list設(shè)置方式
這篇文章主要介紹了postman中POST請(qǐng)求時(shí)參數(shù)包含參數(shù)list設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05
Springboot 使用內(nèi)置tomcat禁止不安全HTTP的方法
這篇文章主要介紹了Springboot 使用內(nèi)置tomcat禁止不安全HTTP的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07

