为了账号安全,请及时绑定邮箱和手机立即绑定

请教下Cookie问题。

   String list ="";
              //从客户端获得Cookies集合
              Cookie[] cookies = request.getCookies();
              //遍历这个Cookies集合
              if(cookies!=null&&cookies.length>0)
              {
	              for(Cookie c:cookies)
	              {
	                  if(c.getName().equals("ListViewCookie"))
	                  {
	                     list = c.getValue();
	                  }
	              }
	          }
              
              list+=request.getParameter("id")+",";
              //如果浏览记录超过1000条,清零.
              String[] arr = list.split(",");
              if(arr!=null&&arr.length>0)
              {
                  if(arr.length>=1000)
                  {
                      list="";
                  }
              }
              Cookie cookie = new Cookie("ListViewCookie",list);
              response.addCookie(cookie);
if(cookies!=null&&cookies.length>0)
              {
	              for(Cookie c:cookies)
	              {
	                  if(c.getName().equals("ListViewCookie"))
	                  {
	                     list = c.getValue();
	                  }
	              }
	          }
              
              list+=request.getParameter("id")+",";

这段代码不太懂,c.getName().equals("ListViewCookie")中的“ListViewCookie”在第一次开始遍历的时候是不存在的对吗?因为在最后才创建了

 Cookie cookie = new Cookie("ListViewCookie",list);

这个cookie对象。如果我第一次点击了id为1的商品

也就是说第一次遍历的时候 list=“1,”。

等到如果我第二次我点击了id为2的时候

list=“1,沃特篮球鞋,2”;

是酱紫吗?

正在回答

6 回答

我建议你实在理不清就这样理解。 

假设代码是这样执行的:

--------------------------------第一次执行-------------------------------------------------------

String list ="";

list+=request.getParameter("id")+",";   //这里相当于就是获取商品的id值并添加到字符串中

              //如果浏览记录超过1000条,清零.

              String[] arr = list.split(",");     

              if(arr!=null&&arr.length>0)

              {

                  if(arr.length>=1000) 

                  {

                      list="";

                  }

              }

 //设置一个cookie,名为ListView,值为list (而这里的list就是上面的request.getParameter("id")即商品的id)

              Cookie cookie = new Cookie("ListViewCookie",list);

              response.addCookie(cookie);


--------------------------------第二次执行-------------------------------------------------------

 //从客户端获得Cookies集合

              Cookie[] cookies = request.getCookies();

              //遍历这个Cookies集合

              if(cookies!=null&&cookies.length>0)

              {

                  for(Cookie c:cookies)

                  {

                //匹配是否有名为ListViewCookie的cookie

                if(c.getName().equals("ListViewCookie")) 

                      {

                         list = c.getValue();  //匹配到后获取cookie的值,覆盖原来的字符串。

                      }

                  }

              }

所以有可能你最后获得的list就是“2,5,6,10,12,”只是商品的id而已,没有商品的名称...只用id即可确定某条具体信息。

1 回复 有任何疑惑可以回复我~
#1

慕田峪7021683 提问者

好吧,可能是我蠢,有点懂。但是很谢谢你。要是其他人跟我有同样疑问的,说不定懂了,那我就采纳你的答案了。
2016-11-23 回复 有任何疑惑可以回复我~
#2

Airly 回复 慕田峪7021683 提问者

刚开始都有个过程,爱钻牛角尖,我也是这样,或许可以多看几遍视频就懂啦,加油。
2016-11-23 回复 有任何疑惑可以回复我~

我始终觉得你是以为代码始终就是从上到下执行,原本这是代码的执行方式没错,但是第一段代码并没有满足条件,所以会直接执行第2段,而下一次执行才会执行第1段,然后第2段

0 回复 有任何疑惑可以回复我~
#1

慕田峪7021683 提问者

我懂,就是第一次不执行第一段代码。 那第二次呢,会执行第一段的代码对吧。那value中的值不应该有中文吧list=c.getValue() 不应该是list="1,安踏运动鞋2," 应该是list="1,2,"
2016-11-23 回复 有任何疑惑可以回复我~
#2

Airly 回复 慕田峪7021683 提问者

唉,你为啥老是要把商品的名称带进去,不需要商品的名称,只要商品的id就可以了。
2016-11-23 回复 有任何疑惑可以回复我~
#3

慕田峪7021683 提问者 回复 Airly

那list=c.getValue(); 这段代码 获得的值是存储什么到list中去
2016-11-23 回复 有任何疑惑可以回复我~
#4

Airly 回复 慕田峪7021683 提问者

获得的值是:由很多个商品id+","组成的拼接字符串。 这里相当于获取最新的list覆盖原来的list,所以可以理解为c.getValue()就是list
2016-11-23 回复 有任何疑惑可以回复我~
查看1条回复

cookie本身是有生命周期的,即有个过期时间。

下面这段代码的用途是来判断是否有匹配的cookie,如果有,执行这行代码   list = c.getValue();

 Cookie[] cookies = request.getCookies();

              //遍历这个Cookies集合

              if(cookies!=null&&cookies.length>0)

              {

                  for(Cookie c:cookies)

                  {

                      if(c.getName().equals("ListViewCookie"))

                      {

                         list = c.getValue();

                      }

                  }

              }

如果没有,则上面这段代码将不被执行,直接执行下面这段代码

 list+=request.getParameter("id")+",";

              //如果浏览记录超过1000条,清零.

              String[] arr = list.split(",");

              if(arr!=null&&arr.length>0)

              {

                  if(arr.length>=1000)

                  {

                      list="";

                  }

              }

              Cookie cookie = new Cookie("ListViewCookie",list);

              response.addCookie(cookie);


实际上项目第一次被执行的时候是先执行的第2段代码,然后第二次才是执行的第1段代码

---------------------------------------------------------------------------------------------------

至于cookie里面存的值:

举个例子,当我点击的id为1的商品, 则list=“1,”;

                        点击id为2的商品,则list ="1,2,";

因为 list+=request.getParameter("id")+","; 等同于 list = list + request.getParameter("id")+","

即重新覆盖原来字符串的意思。


0 回复 有任何疑惑可以回复我~
#1

慕田峪7021683 提问者

那可以请问下list = c.getValue();这条语句是保存什么到list当中。
2016-11-23 回复 有任何疑惑可以回复我~
#2

Airly 回复 慕田峪7021683 提问者

String list =""; list = c.getValue(); 这样不是保存到了list中?
2016-11-23 回复 有任何疑惑可以回复我~
#3

Airly 回复 Airly

cookie是键值对保存的对吧。 c.getName().equals("ListViewCookie"),这里的c.getName()就是键值对的名 而 list = c.getValue();这里的c.getValue()就是键值对的值啊。
2016-11-23 回复 有任何疑惑可以回复我~
#4

Airly 回复 Airly

键值对的名及值就是这句代码体现的。 Cookie cookie = new Cookie("ListViewCookie",list); cookie的名是ListViewCookie,值是list
2016-11-23 回复 有任何疑惑可以回复我~
#5

Airly 回复 慕田峪7021683 提问者

不是的。 cookie的名是ListViewCookie,值是list
2016-11-23 回复 有任何疑惑可以回复我~
#6

Airly 回复 Airly

而这里的list就是商品的id而已。举例,这里的list值可能是String list = "2,3,4,5,6,";
2016-11-23 回复 有任何疑惑可以回复我~
查看4条回复

Cookie[] cookies = request.getCookies();

              //遍历这个Cookies集合

              if(cookies!=null&&cookies.length>0)

              {

                  for(Cookie c:cookies)

                  {

                      if(c.getName().equals("ListViewCookie"))

                      {

                         list = c.getValue();

                      }

                  }

              }else{

                    Cookie cookie = new Cookie("ListViewCookie",list);

                    response.addCookie(cookie);

                 }


0 回复 有任何疑惑可以回复我~
#1

慕田峪7021683 提问者

可是老师就是这么写的耶,而且我运行了也没错。。 你这个我运行试试看。 你这么写的话,只能保存3条记录。 好神奇
2016-11-22 回复 有任何疑惑可以回复我~
#2

aaaaaaaaten

你这么写的话,每次访问都要新建cookie,有些是重复的
2016-11-23 回复 有任何疑惑可以回复我~

c.getName().equals("ListViewCookie"),这段代码是查找ListViewCookie,前面有条件 if(cookies!=null&&cookies.length>0),

Cookie cookie = new Cookie("ListViewCookie",list); response.addCookie(cookie);

这段代码应该放在前面if语句接else里面。

代码错了


1 回复 有任何疑惑可以回复我~

不对,第二次的话应该是list="1,沃特篮球鞋2,"。

也就是说正确的话应该到第二次的时候list="沃特篮球鞋1,安踏运动鞋2"

但还是不懂。

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
JAVA遇见HTML——JSP篇
  • 参与学习       248277    人
  • 解答问题       3071    个

Java Web入门级教程JSP,带你轻松的学习JSP基础知识

进入课程

请教下Cookie问题。

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信