javax.servlet.http.HttpServletResponse 修改Cookie的困惑


在學習java王者java web整合開發王者歸來源代碼的Session那一章遇到了問題,希望可以幫助我解惑。
一、問題描述:
session那一章有一個jsp的頁面的功能是通過cookie信息存儲用戶的用戶名和登錄次數的信息,為了描述簡單,假設用戶名和登錄次數都已經保留在cookie中。
每次刷新頁面的時候:都會通過 request.getCookies();得到所有的cookie,然后遍歷找到對應的用戶名 username和登錄次數 visitTimes的值, visitTimes++ 之后,通過
Cookie visitTimesCookie = new Cookie("visitTimes", Integer.toString(visitTimes));
response.addCookie(visitTimesCookie);
這兩句代碼實現把cookie信息,重新寫到客戶端上。
<%
request.setCharacterEncoding("UTF-8");
 
String username = "";
int visitTimes = 0;
 
// 所有的 cookie
Cookie[] cookies = request.getCookies();
 
// 遍歷所有的 Cookie 尋找 用戶帳號信息與登錄次數信息
for(int i=0; cookies!=null&&i<cookies.length; i++){
Cookie cookie = cookies[i];
if("username".equals(cookie.getName())){
username = cookie.getValue();
}
else if("visitTimes".equals(cookie.getName())){
visitTimes = Integer.parseInt(cookie.getValue());
cookie.setValue("" + ++visitTimes);
}
}
 
// 如果沒有找到 Cookie 中保存的用戶名,則轉到登錄界面
if(username == null || username.trim().equals("")){
throw new Exception("您還沒有登錄。請先登錄");
}
 
// 修改 Cookie,更新用戶的訪問次數
Cookie visitTimesCookie = new Cookie("visitTimes", Integer.toString(visitTimes));
response.addCookie(visitTimesCookie);
%>
2我的問題是:
首先cookie是key-value的屬性對,上面第一句重新實例化了一個 登錄次數的cookie對象,然后在調用 response.addCookie(visitTimesCookie);把這個新的   登錄次數的cookie對象放到客戶端。對於這個操作,我認為它的執行流程應該是這個樣:
addCookie (visitTimesCookie) 首先檢查 visitTimesCookie的name是否已經存在了,如果存在則替換value,如果不錯在,則直接添加到相應的存儲結構。
我想問的問題是:
1這個 addCookie的存儲實現到底是怎么樣的?
2 response對象保存所有cookie數據結構到底是什么(hashtable?hashmap?)?
三求解問題的過程:
於是我想查看相關源代碼,找到了myEclipse依賴的javaee.jar,發現找不到源代碼,去jdk中查找javax下的源代碼也沒有發現servlet相關的包,后來去網上查了一查才發現javaee這部分只是規范,具體實現要看具體情況比如說tomcat就有實現的,於是找到了api的定義     http://docs.oracle.com/javaee/6/api/       發現

 

javax.servlet.http  Interface HttpServletResponse

All Superinterfaces:
ServletResponse
All Known Implementing Classes:
HttpServletResponseWrapper   
發現HttpServletResponse是一個接口,它的具體實現要靠 HttpServletResponseWrapper這個類,於是根據tomcat的源代碼apache-tomcat-7.0.40-src和 javaee的api定義找到了tomcat中的源代碼。
也有可能我我找源代碼的方式不正確,不過我現在看不懂了。
HttpServletResponseWrapper 中關於addCookie的源代碼、
 private HttpServletResponse _getHttpServletResponse() {
        return (HttpServletResponse) super.getResponse();
    }
    /**
     * The default behavior of this method is to call addCookie(Cookie cookie)
     * on the wrapped response object.
     */
    @Override
    public void addCookie(Cookie cookie) {
        this._getHttpServletResponse().addCookie(cookie);
    }
 
首先, HttpServletResponse 是一個接口,繼承於 ServletResponse接口,這兩個函數就是通過兩個接口指向的對象向實現這個addCookie的, 所以我現在依然不知道addCookie是如何實現的
所以我發了這個求助帖子,問題如下:
1這個 HttpServletResponse  接口中   addCookie()是如何實現的?
2HttpServletResponseWrapper 保存所有cookie數據結構到底是什么(hashtable?hashmap?)?
3tomcat源代碼中 HttpServletResponseWrapper類的addCookie函數中接口指向的對象是在什么時候生產的? HttpServletResponseWrapper的構造函數中,我到時發現了有實例化蛛絲馬跡,找不到更多的東西了,如果您看不懂我的問題3就pass吧,我描述不清楚了。
public HttpServletResponseWrapper(HttpServletResponse response) {
        super(response);
    }
 
                                                                                                                                                           菜包子
                                                                                                                                                2013年5月27日16:30:34


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM