前言
我們在登錄網頁的時候有時候會見到有幾個字叫十天內免登陸復選框,比如126郵箱的登錄頁面

實現:
這里我們就要使用Cookie技術,Cookie技術是Web開發中必備的技術之一。
先開看下我的項目結構,下面直接貼代碼,代碼里面有詳細的注釋。
登錄頁面index.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <!--login指向的是配置文件--> <form action="/你的項目名/login" method="post"> 賬號 <input type="text" name="username"><br> 密碼 <input type="password" name="password"><br> <input type="checkbox" name="tenDayLogin" value="ok">十天內免登陸<br> 登錄 <input type="submit" value="登錄"> </form> </body> </html>
配置文件web.xml
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>項目名</display-name> <welcome-file-list> <!-- 將驗證cookie的Servlet作為登錄頁面。驗證成功就不需要再跳轉到登錄頁面了 --> <welcome-file>islogin</welcome-file> </welcome-file-list> <servlet> <servlet-name>login</servlet-name> <servlet-class>com.zhixi.zhang.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>login</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping> <servlet> <servlet-name>islogin</servlet-name> <servlet-class>com.zhixi.zhang.CheckLoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>islogin</servlet-name> <url-pattern>/islogin</url-pattern> </servlet-mapping> </web-app>
SQL文件,用於存儲用戶的賬號跟密碼
drop table if exists t_user; create table t_user( id int(10) primary key auto_increment, username varchar(32) not null unique, password varchar(32) not null, realname varchar(128) ); insert into t_user(username,password,realname) values('zhangzhixi','zhixi158','root'); insert into t_user(username,password,realname) values('zhangsan','123','普通用戶'); select * from t_user;

驗證Cookie類
package com.zhixi.zhang; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CheckLoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); //從request中獲取所有的cookie Cookie[] cookies = request.getCookies(); String username = null; String password = null;; if(cookies != null) { //遍歷cookie for(Cookie cookie : cookies) { if("username".equals(cookie.getName())) {//看cookie的name是不是與cookie的名字匹配 username = cookie.getValue(); }else if("password".equals(cookie.getName())){ password = cookie.getValue(); } } } if(username != null && password != null) {// //連接JDBC數據庫驗證用戶名跟密碼 Connection conn =null; PreparedStatement ps = null; ResultSet rs = null; boolean login = false;//判斷是否登錄成功 String realName = null;//用戶 try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/donglijiedian","root","zhixi158"); String sql = "select * from t_user where username=? and password=?"; ps = conn.prepareStatement(sql); ps.setString(1, username); ps.setString(2, password); rs = ps.executeQuery(); if(rs.next()) { login = true; realName = rs.getString("realname"); } }catch(Exception e) { e.printStackTrace(); }finally { if(rs != null) { try { rs.close(); } catch (SQLException e) { // TODO 自動生成的 catch 塊 e.printStackTrace(); } } if(ps != null) { try { ps.close(); } catch (SQLException e) { // TODO 自動生成的 catch 塊 e.printStackTrace(); } } if(conn != null) { try { conn.close(); } catch (SQLException e) { // TODO 自動生成的 catch 塊 e.printStackTrace(); } } } //跳轉頁面 if(login) {//登錄成功 out.print("歡迎"+ realName +"登錄成功!"); }else {//登錄失敗 out.print("登錄失敗,請檢查用戶名或者密碼!"); } }else {//cookie驗證失敗,跳轉到登錄頁面 response.sendRedirect(request.getContextPath()+"/index.html"); } } }
登錄類
package com.zhixi.zhang; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** 思路: 獲取用戶名和密碼 JDBC連接數據庫驗證用戶名和密碼 登錄成功跳轉到成功頁面 登錄成功后查看用戶是否勾選了十天內免登陸 檢查cookie,驗證十天內有沒有更改過密碼,然后直接跳轉到成功頁面 登錄失敗跳轉到失敗頁面 */ //1、解決亂碼 request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); //2、獲取用戶輸入的用戶名和密碼 PrintWriter out = response.getWriter(); String username = request.getParameter("username"); String password = request.getParameter("password"); Connection conn =null; PreparedStatement ps = null; ResultSet rs = null; boolean login = false;//判斷是否登錄成功 String realName = null;//用戶 try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/donglijiedian","root","zhixi158"); String sql = "select * from t_user where username=? and password=?"; ps = conn.prepareStatement(sql); ps.setString(1, username); ps.setString(2, password); rs = ps.executeQuery(); if(rs.next()) { login = true; realName = rs.getString("realname"); } }catch(Exception e) { e.printStackTrace(); }finally { if(rs != null) { try { rs.close(); } catch (SQLException e) { // TODO 自動生成的 catch 塊 e.printStackTrace(); } } if(ps != null) { try { ps.close(); } catch (SQLException e) { // TODO 自動生成的 catch 塊 e.printStackTrace(); } } if(conn != null) { try { conn.close(); } catch (SQLException e) { // TODO 自動生成的 catch 塊 e.printStackTrace(); } } } //跳轉頁面 if(login) {//登錄成功 out.print("歡迎"+ realName +"登錄成功!"); //通過name獲取value String parameter = request.getParameter("tenDayLogin"); if("ok".equals(parameter)) {//說明用戶選擇了十天內免登陸 //創建Cookie對象 Cookie cookie1 = new Cookie("username",username); Cookie cookie2 = new Cookie("password",password); //設置有效時間 cookie1.setMaxAge(60 * 60 * 24 * 10); cookie2.setMaxAge(60 * 60 * 24 * 10); //設置關聯路徑,默認根路徑就行 cookie1.setPath(request.getContextPath()); cookie2.setPath(request.getContextPath()); //發送Cookie給瀏覽器 response.addCookie(cookie1); response.addCookie(cookie2); } }else {//登錄失敗 out.print("登錄失敗,請檢查用戶名或者密碼!"); } } }
測試
未勾選十天免登陸


勾選十天內免登陸
1、先使用賬號密碼登錄並勾選十天內免登陸登錄登錄


2、關閉瀏覽器再進行訪問地址

這次是我直接重新開啟服務器跳轉的頁面,因為設置了Cookie的實效時長,在硬盤中實際上是已經存儲了我的賬號跟密碼了。所以直接就進入到了成功登錄的頁面了!
