用戶的登錄和注銷是最常見的Web應用案例,當一個應用的客戶登錄了以后,其他所有的會話都得知道這個用戶已經登錄還很有可能得提取用戶的昵稱予以顯示等等,所以,只有把登錄成功的用戶的信息放入到Session中才能夠辦到使所有的Servlet都能訪問到用戶的登錄狀態,
第一是登錄的界面,是HTML的一個表單,非常的簡單
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>登陸界面</title> </head> <body> <form action="/Web/servlet/LoginServlet" method="post"> 帳號:<input type="text" name="username"><br> 密碼:<input type="password" name="password"><br> <input type="submit" value="登錄"> </form> </body> </html>
第二是處理登錄信息的LoginServlet
package com.bird.login; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet { /** * @category 使用Session處理用戶登陸 * @author Bird */ private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String username = request.getParameter("username"); String password = request.getParameter("password"); List<User> list = Db.getAll(); for(User u: list){ if(u.getUsername().equals(username) && u.getPassword().equals(password)){ request.getSession().setAttribute("user", u);//登錄成功,將用戶數據放入到Session中 response.sendRedirect("/Web/index.jsp"); return;//進行重定向,並且下面的代碼不再執行 } } out.write("您的應戶名或密碼錯誤"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } } class Db{ public static List<User> list = new ArrayList<User>(); static{ list.add(new User("aaa","123")); list.add(new User("bbb","123")); list.add(new User("ccc","123")); } public static List<User> getAll(){ return list; } }
這里有個小疑問,如果用戶是在數據庫中中,是把用戶全部讀出來再遍歷快?還是直接在JDBC是查詢來的快
第三,用戶的信息封裝在User對象中
package com.bird.login; /** * @category 封裝用戶的數據的對象 * @author Bird * */ 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; } }
第四是處理用戶注銷的Servlet
package com.bird.login; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class LoginOutServlet extends HttpServlet { /** * @category 退出登錄的Servlet,注銷 * @author Bird */ private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(false);//防止創建Session if(session == null){ response.sendRedirect("/Web/index.jsp"); return; } session.removeAttribute("user"); response.sendRedirect("/Web/index.jsp"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
第五是最終的顯示界面
%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'index.jsp' starting page</title> </head> <body> 歡迎您,${user.username} <br> <a href="/Web/servlet/LoginOutServlet">退出登錄</a> </body> </html>
