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

转载于:https://www.cnblogs.com/CaiBaoZi/archive/2013/05/27/3101849.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值