在學習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
