• 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的存储实现到底是怎么样的?
    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
  • 相关阅读:
    分布式事务slides
    为什么jdk中把String类设计成final
    Struts 体系结构与工作原理 图
    在指定路径或者是文件名查找指定的字符串
    Apache Avro 与 Thrift 比较
    SSL请求trustStore的两种注册方式
    java中的split使用的是正则表达式
    所有ghost操作系统大全
    Tomcat帮助文档翻译 未完成
    ORACLE基本配置
  • 原文地址:https://www.cnblogs.com/CaiBaoZi/p/3101849.html
Copyright © 2020-2023  润新知