<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    聶永的博客

    記錄工作/學習的點點滴滴。

    Servlet 3.0筆記之會話Cookie設置相關

    在Servlet 3.0中增加對Cookie(請注意,這里所說的Cookie,僅指和Session互動的Cookie,即人們常說的會話Cookie)較為全面的操作API。最為突出特性:支持直接修改Session ID的名稱(默認為“JSESSIONID”),支持對cookie設置HttpOnly屬性以增強安全,避免一定程度的跨站攻擊。
    相關較為深入信息,請訪問進階閱讀部分。
    以前的實現
    雖然新的API提供了簡答便捷的API操作會話Cookie,但新的API之前,我們可以較為生硬的操作響應頭部,完成設定工作??纯匆郧暗拇a吧:
    /**
    * 自定義會話Cookie屬性
    * @author yongboy
    * @date 2011-1-19
    * @version 1.0
    */
    @WebFilter(dispatcherTypes = { DispatcherType.REQUEST }, urlPatterns = { "/*" })
    public class CustomCookieFilter implements Filter {
    private static final Log log = LogFactory.getLog(CustomCookieFilter.class);
    private static final String CUSTOM_SESSION_ID = "YONGBOYID";
    private static final String HTTP_ONLY = "HttpOnly";
    private static final String SET_COOKIE = "SET-COOKIE";

    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse rep,
    FilterChain chain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) rep;

    if (response.containsHeader(SET_COOKIE)) {
    log.info("haha,we have one new user visit the site ...");

    String sessionId = request.getSession().getId();
    String cookieValue = CUSTOM_SESSION_ID + "=" + sessionId + ";Path="
    + request.getContextPath() + ";" + HTTP_ONLY;

    log.info(SET_COOKIE + ":" + cookieValue);

    response.setHeader(SET_COOKIE, cookieValue);
    }

    chain.doFilter(req, response);
    }

    public void init(FilterConfig fConfig) throws ServletException {
    }
    }

    利用攔截器實現,判斷每次請求的響應是否包含SET-COOKIE頭部,重寫會話Cookie,添加需要的屬性。雖較為生硬,但靈活性強。

    新的規范API

    新的規范添加SessionCookieConfig接口,用于操作會話Cookie,需要掌握以下主要方法:
    1. setName(String name)
      修改Session ID的名稱,默認為"JSESSIONID"
    2. setDomain(String domain)
      設置當前Cookie所處于的域
    3. setPath(String path)
      設置當前Cookie所處于的相對路徑
    4. setHttpOnly(boolean httpOnly)
      設置是否支持HttpOnly屬性
    5. setSecure(boolean secure)
      若使用HTTPS安全連接,則需要設置其屬性為true
    6. setMaxAge(int maxAge)
      設置存活時間,單位為秒
    如何使用呢,很方便,在ServletContextListener監聽器初始化方法中進行設定即可;下面實例演示如何修改"JSESSIONID",以及添加支持HttpOnly支持:
    /** 全局設置Session-Cookie相交互部分屬性
    *
    * @author yongboy
    * @date 2011-1-19
    * @version 1.0
    */
    @WebListener
    public class SessionCookieInitialization implements ServletContextListener {
    private static final Log log = LogFactory
    .getLog(SessionCookieInitialization.class);

    public void contextInitialized(ServletContextEvent sce) {
    log.info("now init the Session Cookie");

    ServletContext servletContext = sce.getServletContext();

    SessionCookieConfig sessionCookie = servletContext
    .getSessionCookieConfig();
    sessionCookie.setName("YONGBOYID");
    sessionCookie.setPath(servletContext.getContextPath());
    sessionCookie.setHttpOnly(true);
    sessionCookie.setSecure(false);

    log.info("name : " + sessionCookie.getName() + "\n" + "domain:"
    + sessionCookie.getDomain() + "\npath:"
    + sessionCookie.getPath() + "\nage:"
    + sessionCookie.getMaxAge());

    log.info("isHttpOnly : " + sessionCookie.isHttpOnly());
    log.info("isSecure : " + sessionCookie.isSecure());
    }

    public void contextDestroyed(ServletContextEvent sce) {
    log.info("the context is destroyed !");
    }
    }
    需要通過ServletContext對象獲得SessionCookieConfig對象,才能夠進一步自定義session cookie的名字等屬性。
    無論以前的硬編碼還是新的API實現,目標都是一致的,所產生頭部信息也是完全一致。毫無疑問,后者更為方便快捷,省缺了顯示的操作響應元數據。
    對當前站點的第一次請求,很容易從響應頭信息中看到Set-Cookie的屬性值:

    image


    不同瀏覽器平臺上測試

    1. 在Safari、IE8、Opera 11 一切都很正常
    2. Firefox 3.6、Chrome 9.0,JSESSIONID會繼續存在:
      YONGBOYID=601A6C82D535343163B175A4FD5376EA; JSESSIONID=AA78738AB1EAD1F9C649F705EC64D92D; AJSTAT_ok_times=6; JSESSIONID=abcpxyJmIpBVz6WHVo_1s; BAYEUX_BROWSER=439-1vyje1gmqt8y8giva7pqsu1
    3. 在所有瀏覽器中,SESSION ID等于新設置的YONGBOYID值(若不相等,問題就嚴重了?。?
    4. 在客戶端JS無法獲得正確的SESSIONI ID了。
    Tomcat服務器內置支持

    在Tomcat 6-7,可以不用如上顯示設置Cookie domain、name、HttpOnly支持,在conf/context.xml文件中配置即可:
    <Context useHttpOnly="true", sessionCookieName="YONGBOYID", sessionCookieDomain="/servlet3" … >
    ...
    </Context>
    既然JAVA應用服務器本身支持會話Cookie設定,那就沒有必要在程序代碼中再次進行編碼了。這是一個好的實踐:不要重復造輪子。
    這里給出一段測試Session重寫的一段腳本:
    <div style="margin: 40px; paddding: 10px">
    <div><a href="sessionCookieTest">正常連接</a></div>
    <div><a href="<%=response.encodeURL("sessionCookieTest") %>">重定向連接</a></div>
    </div>
    會被重寫的URL地址類似于:
    http://localhost/servlet3/sessionCookieTest;YONGBOYID=19B94935D50245270060E49C9E69F5B6
    嗯,在取消會話Cookie之后,可以直接看到修改后的SESSION ID名稱了,當然這時候HttpOnly屬性也沒有多大意義了。
    有一點別忘記,設置HttpOnly之后,客戶端的JS將無法獲取的到會話ID了。

    進階閱讀:

    1. 維基對HttpOnly的解釋
    2. 利用HTTP-only Cookie緩解XSS之痛
    3. Tomcat Context 屬性
    4. HttpOnly cookie與跨站點追蹤

    posted on 2011-01-19 21:58 nieyong 閱讀(7896) 評論(0)  編輯  收藏 所屬分類: Servlet3

    公告

    所有文章皆為原創,若轉載請標明出處,謝謝~

    新浪微博,歡迎關注:

    導航

    <2011年1月>
    2627282930311
    2345678
    9101112131415
    16171819202122
    23242526272829
    303112345

    統計

    常用鏈接

    留言簿(58)

    隨筆分類(130)

    隨筆檔案(151)

    個人收藏

    最新隨筆

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 在线观看AV片永久免费| 亚洲国产欧美国产综合一区 | 国产精品久久久久久久久久免费| 免费的黄网站男人的天堂| 亚洲av极品无码专区在线观看| 在线A亚洲老鸭窝天堂| 国产a级特黄的片子视频免费| 国产91免费视频| 免费人成在线观看网站品爱网| 一个人看的www免费高清 | 日本免费人成黄页在线观看视频| 精品国产污污免费网站aⅴ| 99久久99这里只有免费的精品| 亚洲精品女同中文字幕| 亚洲人成免费电影| 亚洲美女视频一区二区三区| 亚洲国产精品无码av| 国产亚洲美女精品久久久| 亚洲乱码中文字幕综合234| 又爽又高潮的BB视频免费看| 四虎在线视频免费观看| 最近最新中文字幕完整版免费高清| 最近中文字幕电影大全免费版| 亚洲免费视频在线观看| 青青草原1769久久免费播放| 永久在线观看免费视频| 你懂得的在线观看免费视频| 两个人日本WWW免费版| 国产成人精品免费视频大全| 国产区在线免费观看| 久久九九久精品国产免费直播| 国产免费高清69式视频在线观看| 一级毛片人与动免费观看| 国产激情久久久久影院老熟女免费| 一级毛片在线免费视频| 国产乱妇高清无乱码免费| 男人天堂免费视频| 久久ww精品w免费人成| 亚洲成人免费在线观看| 国产在线观看片a免费观看| 成人激情免费视频|