【HM】第9课:Cookie与HttpSession详解

  1. 云栖社区>
  2. 博客>
  3. 正文

【HM】第9课:Cookie与HttpSession详解

技术小胖子 2017-11-09 22:53:00 浏览909
展开阅读全文

<pre>

 

day09

 

昨天内容回顾

         1response

         *response里面对应http协议里面的对应的方法

         *response里面做了四个案例(不包含验证码)代码至少写三遍

         *验证码的案例,看懂就可以了。

         *重点掌握看不清换一张实现

         *Response向页面输出中文乱码解决(****

 

         2request

         *获取客户机信息和头信息的方法

         *获取表单提交的数据

         *获取表单提交中文数据乱码问题解决(****

         *request

         *重定向和转发的区别

 思维导图

wKiom1WYkUqDsgafAAEHmc_NDsk207.jpg

1JSP入门(代码位置/day09/WebRoot/jsp

         *什么是jsp:学过servlet,如果向页面输出内容,需要使用字节流或者字符流输出,这样很麻烦。

         针对这种很麻烦的情况,sun公司开发了一个新的技术jsp(方便向页面进行输出)

         *java server pagesjava服务器端的页面,jsp运行在服务器里面。

         *jsp就是一个servletjsp最终会被编译成servlet,会把编译之后的servlet放到tomcatwork目录下

        

         *jsp在什么时候编译成servlet:在请求jsp时候会把jsp编译成servlet

 

         *jsp组成:html+java代码+jsp自身的一些东西

 

         *jsp里面如何嵌入java代码(*****

         **有三种方式

         第一种:<%!  %>:在定义的变量是成员的变量

                   =<%! int i = 10; %>

 

         第二种:<%=  %>:向页面输出的内容

                   =servlet里面生成的代码 out.print("hello" );

 

         第三种:<%  %>

                   =servelt里面生成的代码在service里面

        

         在实际开发中一般 jsp里面经常 html代码和java代码混合使用

         *练习:使用htmljava代码在jsp里面生成五行五列的表格

            <table border="1">

            <%

                   for(inti=1;i<=5;i++) {

                   %>

                            <tr>

                                     <%

                                               for(intj=1;j<=5;j++) {

                                     %>

                                                        <td>aaaaaaaaa</td>

                                     <%

                                               }

                                      %>

                            </tr>

                   <%

                   }

                   %>

            </table>

 

        

2EL表达式入门(代码位置/day09/WebRoot/el

         *什么是el表达式:用于获取域对象里面的值

         *el表达式用于jsp页面中,不能在html中使用

         *语法: ${域对象名称}

 

         *    <!-- 使用el表达式获取域对象里面的值-->

            <!-- 向域对象里面设置值 -->

            <%

                   //servletContext里面设置值

                   getServletContext().setAttribute("msg1","itcast");

                           

                   //request域里面设置值

                   request.setAttribute("msg2","itheima");

             %>

             <!-- 使用传统方式获取域对象里面的值-->

            <%=getServletContext().getAttribute("msg1") %>

             <%=request.getAttribute("msg2")%>

            

             <hr/>

             <!-- 使用el表达式获取域对象里面的值-->

             ${msg1 }

             ${msg2 }

        

         *如果向不同的域对象里面设置值的名称是相同的,使用el表达式获取的是域对象范围小的里面的值

 

         *如果使用传统方式获取域对象里面的值,名称不存在得到null

         如果使用el表达式获取域对象里面的值,名称不存在返回空字符串 ""

 

 

3、会话管理

         *什么是会话:打开一个浏览器进行网页的浏览,在一个浏览器里面浏览很多的网页,到关闭浏览器的这个过程

         称为一次会话。

 

         *会话管理的技术有两种

         第一种:cookie,客户端的技术          

         第二种:session,服务器端的技术

 

         *使用域对象保存购物信息

         **使用request域对象保存购物信息

                   =因为request域范围是一次请求,所以request域不能保存购物信息

 

         **使用servletContext域对象保存购物信息

                   =因为servletContext域范围是整个web项目,每个web项目都有一个servletContext

                   ,进行结算时候,谁先结算把servletContext里面的所有商品都结算

 

         *可以使用会话技术保存购物信息

         **使用cookie保存购物信息

                   =基本过程:

                   第一次买百度,到服务器端得到百度,把百度放到cookie里面,把cookie返回到浏览器内存中

                   第二次买ibm,从浏览器内存中得到信息,拿着这个百度发送请求,到服务器端得到ibm和百度,

                   把这两个值放到cookie里面,把现在cookie返回到浏览器内存中。

                   最终进行结算,拿着内存中的百度和ibm发送请求,在服务器端得到两个值进行结算

 

         **使用session保存购物信息

                   =基本的过程:

                   第一次买电脑,到服务器端得到电脑,在服务器端开辟一个空间,把得到放到空间里面,返回一把可以打开

                   这个空间唯一钥匙,把这把钥匙返回浏览器的内存中。

                   第二次买鼠标,拿着第一次返回的钥匙进行购买,到服务器端得到鼠标,拿着钥匙打开空间,

                   把鼠标放到空间里面,也会返回一把新的钥匙,返回到浏览器的内存中。

                   最终结算:拿着新的钥匙进行结算,到服务器端使用钥匙把空间打开,从里面取出值完成结算

 

 

4、案例一:使用cookie记录用户的上次访问时间(cn.itcast.cookie.CookieDemo1

         *需求描述:第一次访问某个servlet,产生一个访问时间,显示欢迎

                      第二次再次访问这个servlet,有一个上次的时间,产生一个现在的时间

        

         *案例的分析(画图分析)

 

         *得到所有的cookieCookie[] getCookies() 

         *cookie的值返回到浏览器内存中(回写) response.addCookie(Cookie cookie)

         *创建cookieCookie(String name, String value)

 

         *代码片段

                   //得到所有的cookie

                   Cookie[]cookies = request.getCookies();

                   //比如时候cookie的名称  visit,判断是否有和visit名称相同的cookie

                   Cookiecookie = findCookie(cookies,"visit");

 

                   //得到当前的时间

                   Datedate = new Date();

                   Stringtimes = date.toLocaleString();

                   //times保存到cookie里面

                   Cookiec = new Cookie("visit",times);

                   //cookie值返回浏览器内存

                   response.addCookie(c);

 

5cookieAPI使用

         *创建cookieCookie(String name, String value)

         *得到cookie的名称:getName()

         *得到cookie的值:getValue()

 

         *setMaxAge(int expiry):设置cookie的有效时长

         *setPath(String uri) :设置cookie的有效路径

         1cookie的分类有两种

         第一种:会话级别的cookie,关闭浏览器cookie消失了(销毁了)

         第二种:持久性的cookiecookie会在一定的时间内一直有效

                   *可以进行设置

                   *使用 setMaxAge(int expiry):参数是int类型,值是秒

                   *使用 setPath(String uri):一般参数传递成 setPath("/")

 

                   *代码

                   Cookiec = new Cookie("visit",times);

                   //设置持久性cookie

                   //设置有效时长

                   c.setMaxAge(3600);

                   //设置有效路径

                   c.setPath("/");

                   //cookie值返回浏览器内存

                   response.addCookie(c);

 

         *cookie一些细节问题

 

         **一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。

 

         **一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie

 

         **浏览器一般只允许存放300Cookie,每个站点最多存放20Cookie,每个Cookie的大小限制为4KB

         我的总结:

         **如果你在浏览器中设置了自动清除cookies的话,也达不到想要的效果。

         **不同的sevlet是共享Cookie的,即使在不同的servletnew出了相同名称的Cookie

           但是它们还是同一个CookieCookie是存储在客户端浏览器中的,服务器与Cookie

           存储无关,只与它的创建、修改、获取有关。

         **不同的浏览器即使Cookie名称相同,也不是同一个Cookie   

        

         **如果创建了一个cookie,并将他发送到浏览器,

         默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。

         若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。

        

 

        

6、案例二:使用cookie记录用户浏览的商品

         (页面位置:/day09/WebRoot/cookie/product.jsp

         servlet位置:/day09/src/cn/itcast/cookie/CookieDemo2.java

         1)实现的步骤:

         1、创建页面,在页面里面有多个超链接表示不同的商品 ,使用id的值区分

          * 1、判断是否是第一次浏览

          * 2、如果是第一次浏览,获取id值,把id值存到cookie里面,再把cookie写到浏览器的内存中

          * 3、如果不是第一次浏览,首先得到第二次购物的id值,到cookie里面进行判断,判断是否有相同的id

          * 如果有相同的id,不需要回写cookie

          * 4、如果没有相同的id值的cookie,首先获取之前id值,在之前的基础之上追加一个id值,回写到浏览器的内存中

 

         **代码片段

         *//判断id是否相同 cookie里面存结构 his 1,2,3

                   Stringvalues = cookie.getValue();

                   //切割values

                   String[]ids = values.split(",");

                   //写方法实现遍历数组,和id值进行比较

                   booleanflag = checkIds(ids,id);

                   //没有相同的id才进行下一步操作

                   if(!flag){

                            Stringvalue = values+","+id; //比如values 1,2 追加之后 1,2,3

                            //存到cookie

                            Cookiec = new Cookie("his",value);

                            //设置cookie是持久性的cookie

                            c.setMaxAge(3600);

                            c.setPath("/");

                            //cookie写到浏览器的内存中

                            response.addCookie(c);                             

                   }

 

         2)清空浏览记录的功能(代码位置:/day09/src/cn/itcast/cookie/Clear1.java

                   *因为浏览信息存到cookie里面,所有销毁cookie就可以了

                   *如果是会话级别的cookie,关闭浏览器就销毁cookie

 

                   *如果是持久性的cookie如何销毁呢?

                   c.setMaxAge(3600);

                   c.setPath("/");

 

                   *访问的路径里面包含setPath里面的值,会携带cookie信息发送请求

                   比如:c.setPath("/day01");

                   如果通过这个路径进行访问http://127.0.0.1/day01/... 会携带cookie信息

                   如果通过这个地址访问http://127.0.0.1/day02/..... 不会写到cookie信息

                   *一般都是设置成 /

 

                   *销毁持久性cookie的步骤

                   1、创建一个和要销毁cookie相同名称的cookie

                            Cookiecookie = new Cookie("his","")

                   2、设置这个cookie的有效时长是0

                            cookie.setMaxAge(0)

                   3、设置有效路径和要删除cookie的路径一样

                            cookie.setPath("/");

                   4、把这个cookie回写到浏览器的内存

 

7session的简介

         *第一次买电脑,到服务器端得到电脑,在服务器端开辟一个空间,把得到放到空间里面,返回一把可以打开

         这个空间唯一钥匙,把这把钥匙返回浏览器的内存中。

         第二次买鼠标,拿着第一次返回的钥匙进行购买,到服务器端得到鼠标,拿着钥匙打开空间,

         把鼠标放到空间里面,也会返回一把新的钥匙,返回到浏览器的内存中。

         最终结算:拿着新的钥匙进行结算,到服务器端使用钥匙把空间打开,从里面取出值完成结算

 

         1)如何创建session

         *执行getSession()  方法之后创建session对象 名称是 HttpSession

 

         *一个浏览器独占一个session对象

 

         *举例看效果

         **创建一个servlet1,在创建session,打印sessionid

         **servlet1写一个超链接到servlet2,在servlet2也是创建session,打印id

         ***看这两个id值是否一样

        

         *session向浏览器回写钥匙,也是使用cookie来实现的,jsessionid=

         **session也是要依赖于cookie实现的

 

8、案例三:使用session实现简单的购物车(****)

         (代码的位置

         页面:/day09/WebRoot/session

         servlet/day09/src/cn/itcast/session/SessionDemo1.java

         )

         *首先创建商品的列表的页面

                   (区别不同的商品id

         *点击某个商品加入到购物车

         *会到一个页面(结算还是继续购物)

                   **点击继续购物,回到列表页面

         *到结算页面,在结算页面上显示商品名称和数量

 

         *session也是一个域对象,范围:一次会话

         **存值 setAttribute(name,value)

         **取值 getAttribute(name)

 

          * 1、判断是否是第一次购物

          * 2、如果是第一次购物,创建购物车,把商品名称和数量1放到map里面(得到id,根据id得到商品名称)

          * 3、根据商品名称进行判断,判断购物车里面是否有相同名称的商品,如果有,把商品的数量取出来+1,放回map里面

          * 4、如果没有相同名称的商品,直接把商品名称和数量1放到map里面

          * 5、最终把map放到session里面

 

9session的创建、销毁和清空购物车

         (代码:/day09/src/cn/itcast/session/ClearSession.java

         *request.getSession()进行创建

 

         *session的销毁(****

         **有三种方式

         第一种:非正常关闭服务器

         第二种:session有一个默认的过期时间 这个时间是30分钟

         第三种:直接调用session里面的方法实现invalidate() (重点掌握)

 

10、案例四:使用session进行验证码的校验

         (代码位置:/day09/src/cn/itcast/session/CodeServlet.java

                   /day09/src/cn/itcast/session/LoginServlet.java

         *创建一个登陆页面,在添加验证码,完成校验

 

         *debug调试web项目

 

          * 1、获取输入的验证码

          * 2、获取session里面的验证码

          * 3、判断这两个验证码是否相同

 

11、禁用cookiesession的使用(了解)

       ** 创建一个servlet1,在创建session,打印sessionid

         **servlet1写一个超链接到servlet2,在servlet2也是创建session,打印id

         ***看这两个id值是否一样

 

         **在请求的地址后面添加一个参数 ;jsessionid=sessionid

 

         **如果网站里面有很多地址,这些地址都需要加jsessionid

 

         **一般的购物网站,如果禁用了cookie,直接不让你买东西

 

=======================================================================

         完成的任务:

         1)昨天写的requestresponse案例的代码写一遍

         2cookie里面的两个案例代码至少写两遍

         3session里面购物车的代码至少写一遍

                   *根据实现步骤把代码写出来

 

 

 

 

</pre>


      本文转自屠夫章哥  51CTO博客,原文链接:http://blog.51cto.com/4259297/1671016,如需转载请自行联系原作者







网友评论

登录后评论
0/500
评论
技术小胖子
+ 关注