會(huì)話(huà)管理

會(huì)話(huà)?

web應(yīng)用程序的請(qǐng)求與響應(yīng)是基于HTTP昆稿,為無(wú)狀態(tài)通信協(xié)議问裕,服務(wù)器不會(huì)維護(hù)上一次請(qǐng)求和下一次請(qǐng)求之間的關(guān)系,然而有些功能是必須由多次請(qǐng)求完成的鸠删,例如購(gòu)物車(chē):用戶(hù)可能在多個(gè)物品頁(yè)面采購(gòu)物品贫导,web應(yīng)用程序必須要有個(gè)方式來(lái)得知用戶(hù)在這些網(wǎng)頁(yè)中采購(gòu)了哪些商品抛猫,這種維護(hù)上一次請(qǐng)求和下一次請(qǐng)求間關(guān)系的方式,就成為會(huì)話(huà)管理(Session Management)

使用Cookie實(shí)現(xiàn)會(huì)話(huà)管理

Cookie是瀏覽器存儲(chǔ)信息的一種方式孩灯,服務(wù)器可以設(shè)置響應(yīng)頭set-cookie闺金,瀏覽器接收然后將該頭部傳輸過(guò)來(lái)的數(shù)據(jù)以文件的形式存儲(chǔ)在本地
public class Cookie implements Cloneable, Serializable {
    private static final CookieNameValidator validation;
    private static final long serialVersionUID = 1L;
    private final String name;
    private String value;
    private int version = 0;
    private String comment;
    private String domain;
    private int maxAge = -1;
    private String path;
    private boolean secure;
    private boolean httpOnly;

    public Cookie(String name, String value) {
        validation.validate(name);
        this.name = name;
        this.value = value;
    }

    public void setComment(String purpose) {
        this.comment = purpose;
    }

    public String getComment() {
        return this.comment;
    }

    public void setDomain(String pattern) {
        this.domain = pattern.toLowerCase(Locale.ENGLISH);
    }

    public String getDomain() {
        return this.domain;
    }

    public void setMaxAge(int expiry) {
        this.maxAge = expiry;
    }

    public int getMaxAge() {
        return this.maxAge;
    }

    public void setPath(String uri) {
        this.path = uri;
    }

    public String getPath() {
        return this.path;
    }

    public void setSecure(boolean flag) {
        this.secure = flag;
    }

    public boolean getSecure() {
        return this.secure;
    }

    public String getName() {
        return this.name;
    }

    public void setValue(String newValue) {
        this.value = newValue;
    }

    public String getValue() {
        return this.value;
    }

    public int getVersion() {
        return this.version;
    }

    public void setVersion(int v) {
        this.version = v;
    }

    public Object clone() {
        try {
            return super.clone();
        } catch (CloneNotSupportedException var2) {
            throw new RuntimeException(var2);
        }
    }

    public void setHttpOnly(boolean httpOnly) {
        this.httpOnly = httpOnly;
    }

    public boolean isHttpOnly() {
        return this.httpOnly;
    }

    static {
        String prop = System.getProperty("org.apache.tomcat.util.http.ServerCookie.STRICT_NAMING");
        boolean strictNaming;
        if(prop != null) {
            strictNaming = Boolean.parseBoolean(prop);
        } else {
            strictNaming = Boolean.getBoolean("org.apache.catalina.STRICT_SERVLET_COMPLIANCE");
        }

        if(strictNaming) {
            validation = new RFC2109Validator();
        } else {
            validation = new NetscapeValidator();
        }

    }
}
// cookie就是瀏覽器維護(hù)的key-value數(shù)據(jù)
Cookie cookie = new Cookie("id", "233PcDdXD#");

//設(shè)置cookie的有效期,以秒為單位钱反,默認(rèn)是關(guān)閉瀏覽器就失效掖看,這里是一個(gè)星期
cookie.setMaxAge(7 * 24 * 60 * 60);

// 設(shè)置cookie只允許在 https 協(xié)議下使用
cookie.setSecure(true);

// 設(shè)置cookie不能被瀏覽器腳本(js)獲取,能在一定程度上防止XSS攻擊
cookie.setHttpOnly(true);

// response.addCookie()其實(shí)就是給響應(yīng)頭set-cookie添加值
response.addCookie(cookie);

// request可以獲取到該網(wǎng)頁(yè)所屬域中的所有cookie
Cookie[] cookies = request.getCookies();

// 操作cookie中的數(shù)據(jù)
if (cookies != null) {
    for (Cookie cook :cookies) {
        String key = cook.getName();
        String value = cook.getValue();
    }

}

HttpSession

public interface HttpSession {
    long getCreationTime();

    String getId();

    long getLastAccessedTime();

    ServletContext getServletContext();

    void setMaxInactiveInterval(int var1);

    int getMaxInactiveInterval();

    /** @deprecated */
    HttpSessionContext getSessionContext();

    Object getAttribute(String var1);

    /** @deprecated */
    Object getValue(String var1);

    Enumeration<String> getAttributeNames();

    /** @deprecated */
    String[] getValueNames();

    void setAttribute(String var1, Object var2);

    /** @deprecated */
    void putValue(String var1, Object var2);

    void removeAttribute(String var1);

    /** @deprecated */
    void removeValue(String var1);

    void invalidate();

    boolean isNew();
}
// 1面哥、創(chuàng)建會(huì)話(huà)
HttpSession session = request.getSession();

// 2、通過(guò)會(huì)話(huà)傳遞對(duì)象
session.setAttribute("key","value");

// 3毅待、獲取會(huì)話(huà)中被傳遞的對(duì)象
session.getAttribute("key");

// 4尚卫、刪除會(huì)話(huà)中被傳遞的對(duì)象
session.removeAttribute("key");

// 5、刪除會(huì)話(huà)
session.invalidate();
HttpSession原理
1. 當(dāng)通過(guò)請(qǐng)求對(duì)象創(chuàng)建當(dāng)前Session對(duì)象的時(shí)候尸红,web容器會(huì)為每個(gè)Session對(duì)象分配一個(gè)標(biāo)識(shí)ID吱涉,稱(chēng)作Session ID刹泄,可以通過(guò)session.getId()獲取,該Session ID默認(rèn)會(huì)使用Cookie存放在瀏覽器中怎爵,當(dāng)web容器時(shí)tomcat的時(shí)候特石,該Session ID在Cookie的名字是JSESSIONID
// 每個(gè)session都會(huì)有個(gè)標(biāo)識(shí)ID,默認(rèn)會(huì)存放在Cookie中鳖链,在tomcat中名稱(chēng)是JSEESIONID
String sessionId = session.getId();
2. 當(dāng)瀏覽器發(fā)送請(qǐng)求時(shí)姆蘸,會(huì)將Cookie存放的Session ID一并發(fā)送過(guò)去,這樣子web容器就可以根據(jù)Session ID來(lái)找出對(duì)應(yīng)HttpSession對(duì)象芙委,這樣就可以區(qū)分各個(gè)瀏覽器中不同的會(huì)話(huà)了
3. Cookie中存放的JSESSIONID默認(rèn)在瀏覽器關(guān)閉的時(shí)候失效逞敷,重啟瀏覽器的時(shí)候,將會(huì)得到一個(gè)新的JSESSIONID
4. 默認(rèn)關(guān)閉瀏覽器會(huì)馬上消失的是瀏覽器上的Cookie灌侣,而不是服務(wù)器中的HttpSession推捐;要想HttpSession立即失效必須運(yùn)行invalidate()方法,否則的話(huà)侧啼,HttpSession會(huì)等到設(shè)定的時(shí)間到才會(huì)被銷(xiāo)毀牛柒,設(shè)定的時(shí)間可以在程序中設(shè)置,也可以在web部署表述符中配置痊乾,一般都會(huì)選擇后者
4.1 在程序中設(shè)置
// 會(huì)話(huà)不被使用自動(dòng)失效時(shí)間焰络,時(shí)間單位是:秒
session.setMaxInactiveInterval(233);
4.2 在we部署描述符中設(shè)置
<session-config>
    <!-- 不被使用的Session失效時(shí)間,時(shí)間單位:分鐘 -->
    <session-timeout>7</session-timeout>
    <!-- Servlet3.0新特性符喝,設(shè)置Session ID在Cookie中的屬性 -->
    <cookie-config>
        <!-- 自定義Session ID闪彼,在tomcat中默認(rèn)名JSESSIONID -->
        <name>xixihaha</name>
        <!-- 定義存儲(chǔ)Session ID的Cookie存活時(shí)間,單位是秒 -->
        <max-age>30</max-age>
    </cookie-config>
</session-config>
當(dāng)禁用瀏覽器中的Cookie時(shí)协饲,會(huì)把Session ID追加在URL后畏腕;當(dāng)瀏覽器第一次請(qǐng)求網(wǎng)站時(shí),web容器并不知道瀏覽器是否禁用Cookie茉稠,所以也會(huì)把Session ID添加在URL后一并發(fā)送
小心保管Session ID描馅,只要有人取得當(dāng)次的Session ID,在另一瀏覽器相同的URL附上Session ID而线,就可以取得同一個(gè) HttpSession對(duì)象
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末铭污,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子膀篮,更是在濱河造成了極大的恐慌嘹狞,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,946評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件誓竿,死亡現(xiàn)場(chǎng)離奇詭異磅网,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)筷屡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)涧偷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)簸喂,“玉大人,你說(shuō)我怎么就攤上這事燎潮∮黯” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,716評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵确封,是天一觀的道長(zhǎng)除呵。 經(jīng)常有香客問(wèn)我,道長(zhǎng)隅肥,這世上最難降的妖魔是什么竿奏? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,222評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮腥放,結(jié)果婚禮上泛啸,老公的妹妹穿的比我還像新娘。我一直安慰自己秃症,他們只是感情好候址,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著种柑,像睡著了一般岗仑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上聚请,一...
    開(kāi)封第一講書(shū)人閱讀 52,807評(píng)論 1 314
  • 那天荠雕,我揣著相機(jī)與錄音,去河邊找鬼驶赏。 笑死炸卑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的煤傍。 我是一名探鬼主播盖文,決...
    沈念sama閱讀 41,235評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蚯姆!你這毒婦竟也來(lái)了五续?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,189評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤龄恋,失蹤者是張志新(化名)和其女友劉穎疙驾,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體篙挽,經(jīng)...
    沈念sama閱讀 46,712評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡荆萤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铣卡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片链韭。...
    茶點(diǎn)故事閱讀 40,926評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖煮落,靈堂內(nèi)的尸體忽然破棺而出敞峭,到底是詐尸還是另有隱情,我是刑警寧澤蝉仇,帶...
    沈念sama閱讀 36,580評(píng)論 5 351
  • 正文 年R本政府宣布旋讹,位于F島的核電站,受9級(jí)特大地震影響轿衔,放射性物質(zhì)發(fā)生泄漏沉迹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評(píng)論 3 336
  • 文/蒙蒙 一害驹、第九天 我趴在偏房一處隱蔽的房頂上張望鞭呕。 院中可真熱鬧,春花似錦宛官、人聲如沸葫松。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,750評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)腋么。三九已至,卻和暖如春亥揖,著一層夾襖步出監(jiān)牢的瞬間珊擂,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,867評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工费变, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留摧扇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,368評(píng)論 3 379
  • 正文 我出身青樓胡控,卻偏偏與公主長(zhǎng)得像扳剿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子昼激,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評(píng)論 2 361

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

  • 2.1 軟件中的會(huì)話(huà) 一次會(huì)話(huà): 打開(kāi)瀏覽器 -> 訪問(wèn)一些服務(wù)器內(nèi)容 -> 關(guān)閉瀏覽器 登錄場(chǎng)景: 打開(kāi)瀏覽器 ...
    yangliangliang閱讀 380評(píng)論 0 0
  • 1課程回顧 Servlet編程 1)Servlet生命周期(重點(diǎn)) 構(gòu)造方法:創(chuàng)建servlet對(duì)象庇绽。默認(rèn)情況下,...
    守亭翁閱讀 214評(píng)論 0 0
  • 會(huì)話(huà)管理入門(mén) 軟件中的會(huì)話(huà):一次會(huì)話(huà): 打開(kāi)瀏覽器 -> 訪問(wèn)一些服務(wù)器內(nèi)容 -> 關(guān)閉瀏覽器登錄場(chǎng)景:打開(kāi)瀏覽器...
    奮斗的老王閱讀 1,433評(píng)論 4 53
  • 1.加載web應(yīng)用資源文件 這兩句在Servlet中是等價(jià)的橙困。 在servlet中瞧掺,只要是路徑就要寫(xiě)/。 思考:目...
    廖馬兒閱讀 359評(píng)論 0 0
  • 本文包括:HttpSession對(duì)象session內(nèi)置對(duì)象使用session實(shí)現(xiàn)訪問(wèn)控制JSP作用域Cookies...
    廖少少閱讀 2,196評(píng)論 0 8