在学习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的存储实现到底是怎么样的?
2response对象保存所有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