會話技術( Cookie ,Session)

来源:http://www.cnblogs.com/rongsnow/archive/2016/01/30/5172246.html
-Advertisement-
Play Games

會話技術: 會話:瀏覽器訪問伺服器端,發送多次請求,接受多次響應。直到有一方斷開連接。會話結束。 解決問題:可以使用會話技術,在一次會話的多次請求之間共用數據。 分類: 客戶端會話技術 Cookie 伺服器端會話技術 Session 客戶端會話技術:Cookie 小餅干的意思 伺服器端不需要管理,方


 會話技術:
    會話:瀏覽器訪問伺服器端,發送多次請求,接受多次響應。直到有一方斷開連接。會話結束。
    
    解決問題:可以使用會話技術,在一次會話的多次請求之間共用數據。
        
    分類:
        客戶端會話技術    Cookie
        伺服器端會話技術    Session

 

  客戶端會話技術:Cookie 小餅干的意思

        伺服器端不需要管理,方便。但是不安全。
        
        原理:
            1.客戶端第一次請求伺服器端,伺服器作出響應時,會發送set-cookie頭,攜帶需要共用的數據
            2.當客戶端接受到這個響應,會將數據存儲在客戶端
            3.當客戶端再次請求伺服器端時,會通過cookie請求頭攜帶著存儲的數據。
            4.伺服器接受帶請求,會獲取客戶端攜帶的數據。
        
        Java代碼實現:
            1.發送cookie
                //1.創建Cookie對象。
                Cookie c = new Cookie("name","zhangsan");
                //2.通過response發送cookie
                response.addCookie(c);
                
            2.接收cookie
                //1.獲取所有cookie數組
                Cookie[] cs = request.getCookies();
                //2.遍曆數組
                if(cs != null){
                    for (Cookie c : cs) {
                        //獲取cookie的名稱
                        String name = c.getName();
                        //判斷名稱,得到目標cookie
                        if("name".equals(name)){
                            //獲取值
                            String value = c.getValue();
                            System.out.println(name+":"+value);
                        }
                    }
                }
        
        Cookie的細節:
            1.預設情況下,cookie保存在客戶端瀏覽器記憶體中。
              需要將數據持久化存儲在客戶端的硬碟上。
              設置cookie的存活時間。setMaxAge(int s);
            
            2.Cookie是不支持中文數據的。如果要想存儲中文數據。需要轉碼。
                URL編碼
        
        功能:記住用戶名和密碼


        伺服器端會話技術:Session  主菜的意思
        
        伺服器端需要管理數據,麻煩,但是安全。
        
        原理:
            1.客戶端訪問伺服器端,在伺服器端的一個對象(Session)中存儲了數據
            2.伺服器給客戶端作出響應時,會自動將session對象的id通過響應頭 set-cookie:jsessionid=xxx 發送到客戶端
            3.客戶端接受到響應,將頭對應的值存儲到客戶端
            4.客戶端再次請求時,會攜帶著請求頭 cookie:jsessionid=xxx.
            5.伺服器接受到請求,通過jsessionid的值,找到對應的session對象。就可以獲取對象中存儲的數據了。
            
            Session技術依賴於cookie。
        
        獲取session
            HttpSession session = request.getSession();
        
        域對象:
            setAttribute():
            getAttribute():
            removeAttribute():
        
        session細節:
            1.客戶端關閉了,兩次session一樣嗎?
                不一樣。因為客戶端瀏覽器記憶體釋放了,jsessionid沒了。
              伺服器關閉了,兩次session一樣嗎?
                不一樣。因為伺服器記憶體釋放了,session對象沒了。
                    session的鈍化:
                        當伺服器正常關閉時,會將session對象寫入到伺服器的硬碟上。
                    session的活化:
                        當伺服器正常啟動時,會將session文件還原為session對象
        
            2.session對象的銷毀
                1.session超時
                    <session-config>
                        <session-timeout>30</session-timeout>
                    </session-config>
                
                2.invalidate():session銷毀
                
                3.伺服器關閉。
                
            3.session依賴於cookie,如果客戶端禁用了cookie,那麼session該咋辦?
                URL重寫。

        
            4.getSession方法的重載:
                boolean:
                    true:預設值
                        通過id查找session,如果沒找到,新創建一個
                    false:
                        通過id查找session,如果沒找到,返回null
                        第一次創建一個新的對象

 

  代碼演示:

 1 package cookie;
 2 
 3 import java.io.IOException;
 4 import java.sql.PreparedStatement;
 5 import java.sql.SQLException;
 6 
 7 import javax.servlet.ServletException;
 8 import javax.servlet.http.HttpServlet;
 9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11 import javax.servlet.http.HttpSession;
12 
13 public class LoginServlet extends HttpServlet {
14 
15     private static final long serialVersionUID = -4372317815130787297L;
16 
17     public void doGet(HttpServletRequest request, HttpServletResponse response)
18             throws ServletException, IOException {
19         try {
20             //1.獲取驗證碼
21             String checkCode = request.getParameter("checkCode");
22             //2.獲取生成的驗證碼
23             HttpSession session = request.getSession();
24             String checkCode_pro = (String) session.getAttribute("checkCode_pro");
25             
26             //1.設置編碼
27             request.setCharacterEncoding("utf-8");
28             //2.獲取用戶名和密碼
29             String username = request.getParameter("username");
30             String password = request.getParameter("password");
31             //3.操作資料庫,獲取資料庫連接
32             //4.定義sql
33             //5.獲取pstmt對象
34             PreparedStatement pstmt = JDBCUtils.getConnection().prepareStatement("select * from user where username = ? and userpassword = ?");
35             //6.設置參數
36             pstmt.setString(1, username);
37             pstmt.setString(2, password);
38             //7.執行sql
39             //8.驗證,判斷
40             //判斷驗證碼是否正確
41             if(checkCode_pro.equalsIgnoreCase(checkCode)){
42                     //正確
43                     //註冊 或 登錄
44                     session.setAttribute("regist_msg", "驗證碼正確");
45                     if(pstmt.executeQuery().next()){
46                     //登陸成功
47                     request.setAttribute("username", username);
48                     request.getRequestDispatcher("/success.jsp").forward(request, response);
49                     }else{
50                         //登陸失敗
51                         request.setAttribute("msg", "用戶名或密碼錯誤!");
52                         request.getRequestDispatcher("/login.jsp").forward(request, response);    
53                     }
54             }else{
55                 //錯誤
56                 session.setAttribute("regist_msg", "驗證碼錯誤");
57                 response.sendRedirect("/colloquy/login.jsp");
58                 //將session中存儲的驗證碼清空
59                 session.removeAttribute("checkCode_pro");    
60             }    
61         } catch (SQLException e) {
62             e.printStackTrace();
63         }
64     }
65 
66     public void doPost(HttpServletRequest request, HttpServletResponse response)
67             throws ServletException, IOException {
68         this.doGet(request, response);
69     }
70 }

 

 

 1 package cookie;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.ServletException;
 6 import javax.servlet.http.Cookie;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10 
11 public class RemServlet extends HttpServlet {
12 
13     private static final long serialVersionUID = -3477344209817695234L;
14 
15     public void doGet(HttpServletRequest request, HttpServletResponse response)
16             throws ServletException, IOException {
17         //1.獲取用戶名和密碼,覆選框
18         String username = request.getParameter("username");
19         String password = request.getParameter("password");
20         //2.判斷用戶名和密碼是否正確
21         if("zhangsan".equals(username) && "123".equals(password)){
22             //登陸成功
23             if(request.getParameter("rem") != null){
24                 //記住密碼
25                 //1.創建cookie
26                 Cookie c_username = new Cookie("username", username);
27                 Cookie c_password = new Cookie("password", password);
28                 //2.設置存活時間
29                 c_username.setMaxAge(60 * 60 * 24 * 7);
30                 c_password.setMaxAge(60 * 60 * 24 * 7);
31                 //3.發送cookie
32                 response.addCookie(c_username);
33                 response.addCookie(c_password);
34             }
35             request.setAttribute("username", username);
36             request.getRequestDispatcher("/success.jsp").forward(request, response);
37         }else{
38             //登陸失敗
39             request.setAttribute("msg", "用戶名或密碼錯誤!");
40             request.getRequestDispatcher("/login.jsp").forward(request, response);
41         }
42     }
43 
44     public void doPost(HttpServletRequest request, HttpServletResponse response)
45             throws ServletException, IOException {
46         this.doGet(request, response);
47     }
48 }

 

 

 1 package cookie;
 2 
 3 import java.awt.Color;
 4 import java.awt.Graphics;
 5 import java.awt.image.BufferedImage;
 6 import java.io.IOException;
 7 import java.util.Random;
 8 
 9 import javax.imageio.ImageIO;
10 import javax.servlet.ServletException;
11 import javax.servlet.http.HttpServlet;
12 import javax.servlet.http.HttpServletRequest;
13 import javax.servlet.http.HttpServletResponse;
14 
15 /**
16  * 生成驗證碼
17  * @author rongsnow
18  *
19  */
20 public class CheckCodeServlet extends HttpServlet {
21 
22     private static final long serialVersionUID = 8583894656985684165L;
23 
24     public void doGet(HttpServletRequest request, HttpServletResponse response)
25             throws ServletException, IOException {
26         
27         int width = 100;
28         int height = 50;
29         //1.創建圖片
30         BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
31         //2.裝飾圖片
32         //2.1設置背景色
33         //2.1.1  獲取畫筆對象
34         Graphics g = image.getGraphics();
35         //2.2.2 設置畫筆的顏色
36         g.setColor(Color.pink);
37         //2.2.3 填充背景色
38         g.fillRect(0, 0, width, height);
39         
40         //2.2 畫邊框
41         g.setColor(Color.GREEN);
42         g.drawRect(0, 0, width - 1, height - 1);
43         
44         //2.3 寫入驗證碼
45         g.setColor(Color.RED);
46         
47         String msg = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
48         Random ran = new Random();
49         StringBuilder sb = new StringBuilder();
50         for (int i = 1; i <= 4; i++) {
51             int index = ran.nextInt(msg.length());//隨機生成角標
52             String s = String.valueOf(msg.charAt(index));
53             sb.append(s);
54             
55             g.drawString(s, width/5 * i, height/2);
56         }
57         String checkCode_pro = sb.toString();
58         //將生成的驗證碼 存入session
59         request.getSession().setAttribute("checkCode_pro", checkCode_pro);
60         
61         //2.4畫干擾線
62         g.setColor(Color.BLUE);
63         
64         for (int i = 0; i < 5; i++) {
65             //動態生成坐標點
66             int x1 = ran.nextInt(width);
67             int x2 = ran.nextInt(width);
68             int y1 = ran.nextInt(height);
69             int y2 = ran.nextInt(height);
70             g.drawLine(x1, y1, x2, y2);
71         }
72         
73         //3.將圖片數據 寫入到 response輸出流中
74         ImageIO.write(image, "jpg", response.getOutputStream());
75     }
76 
77     public void doPost(HttpServletRequest request, HttpServletResponse response)
78             throws ServletException, IOException {
79 
80         this.doGet(request, response);
81     }
82 }

 

 

 1 package cookie;
 2 
 3 import java.io.FileNotFoundException;
 4 import java.io.FileReader;
 5 import java.io.IOException;
 6 import java.sql.Connection;
 7 import java.sql.DriverManager;
 8 import java.sql.ResultSet;
 9 import java.sql.SQLException;
10 import java.sql.Statement;
11 import java.util.Properties;
12 
13 /**
14  * JDBC 工具類
15  * @author rongsnow
16  *
17  */
18 public class JDBCUtils {
19     private static String url = null;
20     private static String user = null;
21     private static String password = null;
22     private static String driverClass = null;
23     
24     static{
25         /*
26          * 載入配置文件,為每一個值賦值
27          */
28         try {
29             //1.創建properties對象
30             Properties pro = new Properties();
31             //獲取配置文件的真實路徑
32             //2.關聯資源文件
33             pro.load(new FileReader(JDBCUtils.class.getClassLoader().getResource("jdbc.properties").getPath()));
34             //3.獲取數據
35             url = pro.getProperty("url");
36             user = pro.getProperty("user");
37             password = pro.getProperty("password");
38             driverClass = pro.getProperty("driverClass");
39             //4.註冊驅動
40             Class.forName(driverClass);
41             
42         } catch (FileNotFoundException e) {
43             e.printStackTrace();
44         } catch (IOException e) {
45             e.printStackTrace();
46         } catch (ClassNotFoundException e) {
47             e.printStackTrace();
48         }
49     }
50     
51     /**
52      * 獲取資料庫連接
53      * @throws SQLException 
54      */
55     public static Connection getConnection() throws SQLException{
56         
57         return DriverManager.getConnection(url, user, password);
58     }
59     
60     /**
61      * 釋放資源
62      * @throws SQLException 
63      */
64     public static void close(Connection conn,Statement stmt,ResultSet rs) throws SQLException{
65         if(rs != null){//預防空指針異常
66             rs.close();
67         }
68         if(stmt != null){//預防空指針異常
69             stmt.close();
70         }
71         if(conn != null){//預防空指針異常
72             conn.close();
73         }
74     }
75     public static void close(Connection conn,Statement stmt) throws SQLException{
76         if(stmt != null){//預防空指針異常
77             stmt.close();
78         }
79         if(conn != null){//預防空指針異常
80             conn.close();
81         }
82     }
83     public static void close(Connection conn) throws SQLException{
84         if(conn != null){//預防空指針異常
85             conn.close();
86         }
87     }
88 }

 

 

  web.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app version="2.5" 
 3     xmlns="http://java.sun.com/xml/ns/javaee" 
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 5     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 6     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 7   <display-name></display-name>    
 8   
 9     <servlet>
10         <description>This is the description of my J2EE component</description>
11         <display-name>This is the display name of my J2EE component</display-name>
12         <servlet-name>LoginServlet</servlet-name>
13         <servlet-class>cookie.LoginServlet</servlet-class>
14     </servlet>
15     <servlet>
16         <description>This is the description of my J2EE component</description>
17         <display-name>This is the display name of my J2EE component</display-name>
18         <servlet-name>RemServlet</servlet-name>
19         <servlet-class>cookie.RemServlet</servlet-class>
20     </servlet>
21     <servlet>
22         <description>This is the description of my J2EE component</description>
23         <display-name>This is the display name of my J2EE component</display-name>
24           <servlet-name>checkcode</servlet-name>
25           <servlet-class>cookie.CheckCodeServlet</servlet-class>
26       </servlet>
27 
28 
29     <servlet-mapping>
30         <servlet-name>LoginServlet</servlet-name>
31         <url-pattern>/loginServlet</url-pattern>
32     </servlet-mapping>
33     <servlet-mapping>
34         <servlet-name>RemServlet</servlet-name>
35         <url-pattern>/remServlet</url-pattern>
36     </servlet-mapping>
37     <servlet-mapping>
38           <servlet-name>checkcode</servlet-name>
39           <url-pattern>/checkCodeServlet</url-pattern>
40       </servlet-mapping>
41       
42       
43   <welcome-file-list>
44       <welcome-file>index.jsp</welcome-file>
45   </welcome-file-list>
46 </web-app>

 

  jdbc.properties配置文件內容

driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql:///mydb
user=root
password=123

login.jsp
 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 
 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 4 <html>
 5     <head>
 6         <title>My JSP 'login.jsp' starting page</title>
 7         <script type="text/javascript">
 8             function changeImg(){
 9                 document.getElementById("img").src = "/colloquy/checkCodeServlet?time="+new Date().getTime();
10             }
11             function changeImg2(obj){
12                 obj.src 	   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今年做的一個上位機工控WPF項目,做個小小的總結把,以後隨時來找 請不要帶血亂噴,我只是菜鳥.___by 鮑隊 類似於這樣子的;大致的意思是:一個代碼變數,通過改變變數的值,綁定這個變數的這個圓顏色也在變化 就是一種心跳效果 在網上數據觸發的感覺不多,廢了不少時間,這裡做個總結 1:通知 class
  • 許可權系統的組成通常包括RBAC模型、許可權驗證、許可權管理以及界面訪問控制。現有的一些許可權系統分析通常存在以下問題: (1)沒有許可權的設計思路 認為所有系統都可以使用一套基於Table設計的許可權系統。事實上設計許可權系統的重點是判斷角色的穩定性和找出最小授權需求。角色的穩定性決定了系統是通過角色判斷許可權還
  • 公司準備開發一套工作流引擎,以前沒有什麼OA開發經驗,也是第一次設計工作流引擎,我把我的一些思路分享一下,希望得到些幫助或者能幫助到一些人。 產品的定位: 1、能夠做到前後端分離 2、可以做到項目的分離使用,通過介面來實現 3、支持複雜流程邏輯 例如: 填寫加班表單-》多人審核=》退回=》填寫證明人
  • 作業: 使用正則表達式和遞歸實現計算器功能。 實現: 1、實現帶括弧的計算 2、實現指數、加減乘除求餘等功能 一、實例說明: 本實例自己寫了個版本,但依舊存在一點bug,例:-2-2等計算問題,故最後在武SIR的代碼基礎上加了指數、求餘等功能。 該計算器思路: 1、遞歸尋找表達式中只含有 數字和運算
  • Python是跨平臺的語言,也即是說同樣的源代碼在不同的操作系統不需要修改就可以同樣實現 因此Python的作者就倒騰了OS模塊這麼一個玩意兒出來,有了OS模塊,我們不需要關心什麼操作系統下使用什麼模塊,OS模塊會幫你選擇正確的模塊並調用 os模塊中關於文件/目錄常用的函數使用方法os.path模塊
  • 轉載:http://blog.csdn.net/afgasdg/article/details/12757433
  • 1.主要學習這程式的編寫思路 a.讀取解釋網站 b.找到相關頁 c.找到圖片鏈接的元素 d.保存圖片到文件夾 ..... 將每一個步驟都分解出來,然後用函數去實現,代碼易讀性高. ##代碼儘快運行時會報錯,還須修改 import urllib.request import os def url_op
  • 線程問題我會分成三篇文章來給大家做個詳細的講解 一、線程的概念 1.線程是進程的組成部分,一個進程可以擁有多個線程,一個線程必須有一個父線程; 2.線程擁有自己的堆棧、自己的程式計數器和自己的局部變數,但不再擁有系統資源,它與父線程中的其他線程共用該進程所擁有的全部資源 3.線程是獨立運行的,它並不
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...