您的位置:首页 > 编程语言 > Java开发

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

2013-05-27 16:34 381 查看
在学习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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐