日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Servlet判断用户是否登陆过、异地登录和登出功能

發布時間:2023/12/18 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

/*** @description: 用戶類**/ 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;}@Overridepublic 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{@Overridepublic 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;/*** @description: 登錄servlet**/ @WebServlet("/login") //這個注解相當于xml里給LoginServlet添加路徑 public class LoginServlet extends HttpServlet {@Overridepublic 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");//進行dao查詢UserDao dao = new UserDaoImpl();User user = dao.loginUser(username,password);//創建上下文對象ServletContext sc = request.getServletContext();//創建sessionHttpSession session = request.getSession();//獲得session的idString sessionId = session.getId();//獲取存儲用戶的map<用戶名,sessionId>---map里的用戶名也可以換成用戶對象,只要保證key值唯一Map<String,String> map = (Map<String, String>) sc.getAttribute("loginMap");if (map == null){map = new HashMap<>();}if (user != null){//迭代map,并判斷是否登錄過for (String name : map.keySet()){System.out.println(111);//user一樣表示登錄過if (username.equals(name)){//sessionId值一樣的話,表示重復登錄if (sessionId.equals(map.get(name))){System.out.println("用戶重復");response.getWriter().println("<h1>用戶重復登錄</h1>");return;}else{ //sessionId值不一樣,表示異地登錄response.getWriter().println("<h1>禁止異地登錄</h1>");return;}}}//如果user沒有一樣的,就沒有登錄過將當前用戶添加到mapmap.put(username,sessionId);sc.setAttribute("loginMap",map);//將當前用戶添加到sessionsession.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;/*** @description: 用戶登出**/ @WebServlet("/loginOut") public class LoginOutServlet extends HttpServlet {@Overridepublic 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;/*** @program: ServletDom* @description: 登錄的session的監聽器* @author: 高天樂* @create: 2020-07-23 00:33**/ @WebListener public class LoginListener implements HttpSessionListener {@Overridepublic void sessionCreated(HttpSessionEvent httpSessionEvent) {}@Overridepublic void sessionDestroyed(HttpSessionEvent httpSessionEvent) {System.out.println("銷毀session");//創建上下文對象ServletContext sc = httpSessionEvent.getSession().getServletContext();//創建session對象HttpSession session = httpSessionEvent.getSession();//獲取mapMap<String,String> map = (Map<String, String>) sc.getAttribute("loginMap");//獲取去用戶賬號String username = (String) session.getAttribute("username");//去掉當前用戶map.remove(username);//重新綁定mapsc.setAttribute("loginMap",map);} }

總結

以上是生活随笔為你收集整理的Servlet判断用户是否登陆过、异地登录和登出功能的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。