web16 cookie session

  • 在temp代碼模板中,有需要變換的部分,打出$符號,在后面選擇{cursor}
  • 會話開始是瀏覽器客戶端打開相應網(wǎng)頁,結(jié)束是瀏覽器關(guān)閉(在windows中的內(nèi)存結(jié)束)
    獲得cookie只有一個方法:getcookies()
  • 一臺電腦可以有多個客戶端
  • 新session創(chuàng)建條件(客戶端沒有第一次訪問,客戶端清除cookie服務器端還有,服務器端定期清除session)就是訪問資源時候getsession會開客戶端有沒有,沒有就創(chuàng)建
  • session過期:服務器關(guān)閉,session過期,手動銷毀
  • session過期時間都在做自己的web.xml中配置不在代碼中設(shè)置
 <session-config>
三十分鐘過期
        <session-timeout>30</session-timeout>
    </session-config>
  • session中的jsession是依存于cookie而存在的要想長期存在
  • 一個思想是服務器面對的是許多不確定的客戶端而不是一個
  • session不存不經(jīng)常用的比如(驗證碼粗偶信息)減少服務器壓力
  • 兩個servlet傳遞數(shù)據(jù)時候使用session(比如驗證圖片信息inmservlet傳遞到loginservlet)
  1. 會話技術(shù):從打開一個瀏覽器訪問某個站點,到關(guān)閉這個瀏覽器的整個過程,成為一次會話。
  • 會話技術(shù)分為Cookie和Session:
    Cookie:數(shù)據(jù)存儲在客戶端本地,減少服務器端的存儲的壓力,安全性不好,客戶端 可以清除cookie
    Session:將數(shù)據(jù)存儲到服務器端,安全性相對好,增加服務器的壓力
1)創(chuàng)建Cookie:
Cookie cookie = new Cookie("username","zhangsan");
那么該cookie會以響應頭的形式發(fā)送給客戶端:
2)設(shè)置Cookie在客戶端的持久化時間:
cookie.setMaxAge(int seconds); ---時間秒
注意:如果不設(shè)置持久化時間,cookie會存儲在瀏覽器的內(nèi)存中,瀏覽器關(guān)閉   cookie信息銷毀(會話級別的cookie),如果設(shè)置持久化時間,cookie信息會被持久化到瀏覽器的磁盤文件里
示例:
cookie.setMaxAge(10*60);
設(shè)置cookie信息在瀏覽器的磁盤文件中存儲的時間是10分鐘,過期瀏覽器    自動刪除該cookie信息
3)設(shè)置Cookie的攜帶路徑:
cookie.setPath(String path);
注意:如果不設(shè)置攜帶路徑,那么該cookie信息默認會在訪問產(chǎn)生該cookie的web資源所在的路徑都攜帶cookie信息(同一級)
示例:
cookie.setPath("/WEB16");
代表訪問WEB16應用中的任何資源都攜帶cookie
cookie.setPath("/WEB16/cookieServlet");
代表訪問WEB16中的cookieServlet時才攜帶cookie信息
cookie.setPath("/");//訪問服務器下的所有的資源都攜帶這個cookie
4)向客戶端發(fā)送cookie:
response.addCookie(Cookie cookie);
5)刪除客戶端的cookie:
如果想刪除客戶端的已經(jīng)存儲的cookie信息,那么就使用同名同路徑的持久化時  間為0的cookie進行覆蓋即可
//刪除客戶端保存 name=zhangsan的cookie信息
Cookie cookie = new Cookie("name","");
//將path設(shè)置成與要刪除cookie的path一致
cookie.setPath("/WEB16");
//設(shè)置時間是0
cookie.setMaxAge(0);
response.addCookie(cookie);
-------------------------------------------
服務器端接受cookie
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    // 獲得客戶端攜帶的cookie的數(shù)據(jù)
    Cookie[] cookies = request.getCookies();
    // Cookie cookie = new Cookie("name","zhangsan");
    // 通過cookie名稱獲得想要的cookie
    if (cookies != null) {
        for (Cookie cookie : cookies) {
            // 獲得cookie的名稱
            String cookieName = cookie.getName();
            if (cookieName.equals("name")) {
            // 獲得該cookie的值
                String cookieValue = cookie.getValue();
                System.out.println(cookieValue);
                }
            }
        }
    }

---------------顯示上次登錄時間---------------------
public class LastAccessTimeServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        // 獲得當前時間
        Date date = new Date();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String currentTime = format.format(date);
        // 1、創(chuàng)建Cookie 記錄當前的最新的訪問時間
        Cookie cookie = new Cookie("lastAccessTime", currentTime);
        cookie.setMaxAge(60 * 10 * 500);
        response.addCookie(cookie);
        // 2、獲得客戶端攜帶cookie ---- lastAccessTime
        String lastAccessTime = null;
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie coo : cookies) {
                if ("lastAccessTime".equals(coo.getName())) {
                    lastAccessTime = coo.getValue();
                }
            }
        }
    response.setContentType("text/html;charset=UTF-8");
        if (lastAccessTime == null) {
            response.getWriter().write("您是第一次訪問");
        } else {
            response.getWriter().write("您上次的訪問的時間是:" + lastAccessTime);
        }

    }

2.Session也是一個域?qū)ο?/p>

  • Session技術(shù)是將數(shù)據(jù)存儲在服務器端的技術(shù),會為每個客戶端都創(chuàng)建一塊內(nèi)存空間 存儲客戶的數(shù)據(jù),但客戶端需要每次都攜帶一個標識ID去服務器中尋找屬于自己的內(nèi) 存空間。所以說Session的實現(xiàn)是基于Cookie,Session需要借助于Cookie存儲客 戶的唯一性標識JSESSIONID
1.獲得Session對象
HttpSession session = request.getSession();
此方法會獲得專屬于當前會話的Session對象,如果服務器端沒有該會話的Session 對象會創(chuàng)建一個新的Session返回,如果已經(jīng)有了屬于該會話的Session直接將已有的Session返回(實質(zhì)就是根據(jù)JSESSIONID判斷該客戶端是否在服務器上已經(jīng)存在session了)

2.向session中存取數(shù)據(jù)(session也是一個域?qū)ο螅?Session也是存儲數(shù)據(jù)的區(qū)域?qū)ο螅詓ession對象也具有如下三個方法:
session.setAttribute(String name,Object obj);
session.getAttribute(String name);
session.removeAttribute(String name);
3.Session對象的生命周期(面試題/筆試題)
創(chuàng)建:第一次執(zhí)行request.getSession()時創(chuàng)建
銷毀:
1)服務器(非正常)關(guān)閉時
2)session過期/失效(默認30分鐘)

問題:時間的起算點 從何時開始計算30分鐘?
從不操作服務器端的資源開始計時

可以在工程的web.xml中進行配置
<session-config>
        <session-timeout>30</session-timeout>
</session-config>
3)手動銷毀session
session.invalidate();

作用范圍:
默認在一次會話中,也就是說在,一次會話中同一個客戶端任何資源公用一個session對象
面試題:瀏覽器關(guān)閉,session就銷毀了? 不對

總結(jié):
會話技術(shù):
Cookie技術(shù):存到客戶端
發(fā)送cookie
Cookie cookie = new Cookie(name,value)
cookie.setMaxAge(秒)
cookie.setPath()
response.addCookie(cookie)
獲得cookie
Cookie[] cookies = request.getCookies();
cookie.getName();
cookie.getValue();


Session技術(shù):存到服務器端 借助cookie存儲JSESSIONID
HttpSession session = request.getSession();

setAttribute(name,value);
getAttribute(name);

session生命周期
創(chuàng)建:第一次指定request.getSession();
銷毀:服務器關(guān)閉、session失效/過期、手動session.invalidate();
session作用范圍:默認一會話中
----------------延長jsession時間就是自己重新寫一次所在cookie的時間-----------------
protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        //創(chuàng)建屬于該客戶端(會話)的私有的session區(qū)域
        /* request.getSession()方法內(nèi)部會判斷 該客戶端是否在服務器端已經(jīng)存在session
         * 如果該客戶端在此服務器不存在session 那么就會創(chuàng)建一個新的session對象
         * 如果該客戶端在此服務器已經(jīng)存在session 獲得已經(jīng)存在的該session返回
         */
        HttpSession session = request.getSession();
        session.setAttribute("name", "jerry");      
        String id = session.getId();//該session對象的編號id   
        //手動創(chuàng)建一個存儲JSESSIONID的Cookie 為該cookie設(shè)置持久化時間
        Cookie cookie = new Cookie("JSESSIONID",id);
        cookie.setPath("/WEB16/");
        cookie.setMaxAge(60*10);
    response.addCookie(cookie);
response.getWriter().write("JSESSIONID:"+id);       
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容