1. 程式人生 > >Web&&Servlet之會話管理入門

Web&&Servlet之會話管理入門

瀏覽器的請求和相應都存不了中文所以需要進行加密

    URLEncoder的加密類
        URLEncoder.encode(“”,"utf-8");
    URLDecoder的解密類
        URLDecoder.decode(str,“gdk”)

1會話管理

        1.1生活中的會話:
        1.2程式中的會話   
            一次會話:開啟瀏覽器-》訪問伺服器-》關閉瀏覽器
            場景一:
                開啟瀏覽器:-》訪問網站-》登陸頁面-》輸入使用者名稱和密碼(儲存會話的資訊)-》提交到後臺-》校驗成功
                》》返回使用者首頁(看到當前登陸的使用者名稱資訊.....)(取出會話資訊)-》關閉瀏覽器;
            -   
            用什麼技術去儲存這些會話資訊???
            場景二:
                開啟瀏覽器-》瀏覽購物網站-》點選“購買”(把商品資訊儲存下來)-》放入“購物車”-》關閉瀏覽器
                開啟瀏覽器-》瀏覽購物網站-》檢視”購物車“-》看到之前商品的資訊-》付款購買-》關閉瀏覽器
                    使用什麼技術儲存這些商品資訊?

            會話管理:瀏覽器與伺服器之間的會話過程中產生的會話資料!!!
        思考:
            可以使用域物件儲存會話資訊???
            context域
                登入:登入頁面(張三 context.setAttribute("name',"張三"))
                    -》訪問使用者主頁(context.getAttribute("name"));
                使用context域會覆蓋之前的資料
            request域:
                登入:登入頁面(張三 request.setAttribute("name',"張三"))
                    -》訪問使用者主頁(request.getAttribute("name"));
                使用了request域之後就必須使用轉發技術來跳轉頁面。

1.3會話管理的技術

            1.Cookie技術:會話資料儲存在瀏覽器端
            Session技術:會話技術是儲存在服務端

2.CooKie技術

2.1Cookie技術的使用

            Cookie物件
                1)建立cookie物件,用於儲存會話資料
                    new Cookie(name,value);
                2)修改Cookie物件
                    void setPath(uril);
                    void setMaxAge(int expiry);
                    void setValue(String newValue);
                3)把Cookie資料傳送給瀏覽器儲存
                    response.addCookie(cookie)
                4)瀏覽器帶著cookie訪問伺服器,伺服器接受cookie資訊
                    request.getCookies();

2.2Cookie技術原理

            //1)建立cookie物件,儲存會話資料,
            Cookie  c=new Cookie("name","jack");
            //2)把cookie傳送給瀏覽器,通過響應頭攜帶cookie資料給瀏覽器(set-cookie);
            瀏覽器獲取cookie資料,儲存在瀏覽器快取區
            response.setHeader("set-cookie","name=jack");
            /**
            *response.addCookie(c)//簡化版本。
            //3)瀏覽器在下次訪問的時候就把攜帶cookie資料,通過請求頭送給伺服器(cookie)
            //4)伺服器獲取瀏覽器傳送的cookie資料
            String name=request.getHeader("cookie");
            簡化版本
            Cookie[] cookies=request.getCookies();
            if(cookies!=null){
                for(Cookie cookie:cookies){
                    String name=cookie.getName();
                    String value=cookie.getValue();
                    }
                }

2.3Cookie細節

            1)cookie的資料型別一定是字串,如果要傳送中文,必須先對中文進行URL加密才可以傳送
            2)serPath(path);修改cookie所在的有效路徑,什麼是有效路徑?如果把該cookie設定到某個
            有效路徑下,然後當瀏覽器訪問這個有效路徑的時候,才會攜帶cookie資料給伺服器。
            /**
            *1)設定有效路徑;預設情況下把專案設定到當前專案的根目錄下
            *c.setPath("/day11");
            */
            3)setMaxAge(整數);設定cookie的有效時間
                正整數:表示超過了正整數的數值的時間,cookie就會丟失(cookie儲存咋瀏覽器的快取目錄)單位: 秒
                負整數:表示如果瀏覽器關閉了,cookie就會丟失!(cookie儲存瀏覽器記憶體)(預設情況下)
                0   :表示刪除同名的cookie
            4)cookie可以有多給,但是一般允許放300個cookie,每個站點最多放20個cookie,每個Cookie的大小限制為4KB

2.4案例:使用者上次訪問的時間

package dxq.Cookie;

import java.io.IOException;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;

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 CookieDeom1 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //製造當前字串
        response.setContentType("text/html;charset=utf-8");
        SimpleDateFormat siple = new SimpleDateFormat("yyyy年MM月dd日hh時mm分ss秒");
        String data = siple.format(new Date());
        //獲取cookie
        Cookie[] cookies = request.getCookies();
        String lastTime=null;
        if(cookies!=null){
            for(Cookie cookie: cookies){
                //存在cookie還要繼續尋找是否name為lastTime的cookie
                if(cookie.getName().equals("lastTime"));
                    //用lastTime儲存上次訪問的時間
                    lastTime=cookie.getValue();
                    //對日期字串進行解密
                    lastTime=URLDecoder.decode(lastTime,"utf-8");
                    response.getWriter().write("歡迎訪再次訪問本網站,上次訪問的時間為"+lastTime+"<br/>"+
                    "本次訪問的時間為"+data);
                    //更新cookie上次訪問的時間
                    //對中文格式進行加密
                    data = URLEncoder.encode(data,"utf-8");
                    //把時間存到cookie中
                    cookie.setValue(data);
                    //把cookie傳送給瀏覽器
                    response.addCookie(cookie);
                    break;


            }
        }
        //第一次訪問
        if(cookies==null||lastTime==null){
            response.getWriter().write("歡迎首次登陸本網站,當前時間為"+data);


        //對中文格式進行加密
        data = URLEncoder.encode(data,"utf-8");
        //把時間存到cookie中
        Cookie c=new Cookie("lastTime",data);
        //把cookie傳送給瀏覽器
        response.addCookie(c);

        }



    }

}
            2.5案例使用者瀏覽過的商品

3.Session技術

        3.1引入
        cookie特點:
            1)會話資料放在瀏覽器端    
            2)資料型別只能string,而且有大小限制
            3)相對資料存放不安全
        Session特點:
            1)會話資料放在伺服器端(伺服器記憶體),佔用伺服器資源。
            2)資料型別任意型別,沒有大小限制
            3)相對安全

3.2Session使用步驟

            HttpSession物件
                1)建立HttpSession物件,用於儲存會話資料
                    session=request.getSession():建立或獲取session物件
                2)修改session物件
                    void setMaxInactiveInterval(int interval)設定session物件的有效時間
                    void invalidate() 手動銷燬session物件
                3)儲存會話資料(作為域物件)
                    session.setAttribute(“name”,object);儲存資料
                    session.getAttribute(“name”);獲取資料
                    session。removeAttribute(“name”);刪除資料

3.3Session原理

            伺服器如何區分不同的瀏覽器會話
            前提:
                可以從session物件取出資料,必須是存放資料的session物件          

            1)瀏覽器1:視窗一(001)
                建立HttpSession物件
                HttpSession session=request.getSession();   給session物件分配了001
                儲存會話資料
                session.setAttribute(“name”,“Jack”);
            2)瀏覽器1 視窗二(001)
                得到session
                HttpSession session=request.getSession();   搜尋001的物件
                獲取會話框
                String name=(String) session。getAttribute('name"); 可以得到
            3)瀏覽器2 (沒有標記或不是001) 
                得到session
                HttpSession session=request.getSession();
                獲取會話框
                String name=(String) session。getAttribute('name");  不可以得到

            4)新開瀏覽器(沒有標記或不是001) 
                得到session
                HttpSession session=request.getSession();
                獲取會話框
                String name=(String) session。getAttribute('name");不可以得到

        1)伺服器創造了Session物件,伺服器會給這個session物件分配一個唯一的標記JSESSIONID
        2)把JSESSIONID作為Cookie傳送給瀏覽器
        3)瀏覽器得到JSESSIONID儲存下來,在下次訪問時攜帶這個JSESSIONID去訪問伺服器
        4)伺服器得到JSESSIONID,在伺服器記憶體中搜索是否存在指定JSESSIONID的session物件
        5)如果找不到,則返回這個session物件
        6)如果找不到,可能直接返回null,或者在建立新的session物件
            HttpSession session=request.getSession();
        結論,通過JSESSIONID在伺服器中查詢對應的session物件。

3.4Session的細節

        1)setMaxInactiveInterval(秒數)設定session物件的有效時間
            問題:session在什麼時候銷燬?
            注意:不是瀏覽器關閉,session對想就銷燬
            預設情況:等待30分鐘空閒時間,session物件才會銷燬

        設定全域性的session物件的過期時間
            <session-config>
                <session-timeout>1<session-timeout>單位是1分鐘
            </session-config>
    2)  可以讓JSESSIONID不讓隨著瀏覽器的關閉而丟失
    設定JSESSIONID時間,不讓隨著瀏覽器的關閉而丟失
        Cookie  c=new Cookie(“JSESSIONID”,session.getId());
        c.setMaxAge(1*30*24*60*60);//一個月
        response.addC(c);
    3)直接手動的銷燬session物件
        session=request.getSession();
        session.invalidate();
    4)建立或得到session物件
        request.getSession()/request.getSession(true);建立或得到session物件 查詢session物件,如果沒
        有session物件則建立新的session物件
        request.getSession(false);      得到session物件  查詢session物件,如果沒有session物件,直接返回null;
    3.5使用者登入