书签 分享 收藏 举报 版权申诉 / 46

类型Cookie与Session机制.docx

  • 文档编号:2191604
  • 上传时间:2023-05-02
  • 格式:DOCX
  • 页数:46
  • 大小:151.43KB

程序使用Cookie记录用户的访问次数。

如果用户没有登录,则显示登录界面。

工作原理是程序先检查Cookie,如果没有找到包含username属性的Cookie,则抛出异常,页面跳转到errorPage指定的错误处理页面login.jsp。

login.jsp源代码如下:

代码5.2 login.jsp

<%@pagelanguage="java"pageEncoding="UTF-8"isErrorPage="true"%>

<%

   request.setCharacterEncoding("UTF-8");    //设置request编码方式

   response.setCharacterEncoding("UTF-8");//设置response编码方式

   if("POST".equals(request.getMethod())){//如果是以POST方式登录

      

      CookieusernameCookie=            //新建名为username的Cookie

      newCookie("username",request.getParameter("username"));

      CookievisittimesCookie=newCookie("visitTimes","0");

                                    //新建Cookie

            

      response.addCookie(usernameCookie);//添加到response中

      response.addCookie(visittimesCookie);  //response会将Cookie发送

                                      给客户端

      

      response.sendRedirect(request.getContextPath()+"/cookie.jsp");   //显示Cookie页面

      return;

   }

%>

DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">

请先登录

10px;">

   

      登录

      

         

            

               

               

            

            

               

               

            

            

               

               

            

            

               

               

            

         

                  

red;"><%=exception.get

                  Message()%>

账号:

               200px;">

密码:

               "width:

200px;">

               "button">

      

   

程序运行效果如图5.2所示。

图5.2 使用Cookie记录用户访问次数

客户端A与客户端B都可能访问该程序,A会提交A的Cookie,B会提交B的Cookie。

代码request.getCookies()并没有指明获取谁的Cookie。

这句代码取的是谁的Cookie呢?

答案是A执行时取的是A的Cookie,B执行时取的是B的Cookie。

这是Cookie机制规定的。

程序只需要简单执行request.getCookies()就可以了,服务器只会返回当前客户的Cookie,而不会返回其他客户的Cookie。

各客户端的Cookie彼此独立,互不可见。

1.3 Cookie的不可跨域名性

很多网站都会使用Cookie。

例如,Google会向客户端颁发Cookie,Baidu也会向客户端颁发Cookie。

那浏览器访问Google会不会也携带上Baidu颁发的Cookie呢?

或者Google能不能修改Baidu颁发的Cookie呢?

答案是否定的。

Cookie具有不可跨域名性。

根据Cookie规范,浏览器访问Google只会携带Google的Cookie,而不会携带Baidu的Cookie。

Google也只能操作Google的Cookie,而不能操作Baidu的Cookie。

Cookie在客户端是由浏览器来管理的。

浏览器能够保证Google只会操作Google的Cookie而不会操作Baidu的Cookie,从而保证用户的隐私安全。

浏览器判断一个网站是否能操作另一个网站Cookie的依据是域名。

Google与Baidu的域名不一样,因此Google不能操作Baidu的Cookie。

需要注意的是,虽然网站与网站同属于Google,但是域名不一样,二者同样不能互相操作彼此的Cookie。

%注意:

用户登录网站之后会发现访问时登录信息仍然有效,而普通的Cookie是做不到的。

这是因为Google做了特殊处理。

本章后面也会对Cookie做类似的处理。

1.4 Unicode编码:

保存中文

中文与英文字符不同,中文属于Unicode字符,在内存中占4个字符,而英文属于ASCII字符,内存中只占2个字节。

Cookie中使用Unicode字符时需要对Unicode字符进行编码,否则会乱码。

编码可以使用.URLEncoder类的encode(Stringstr,Stringencoding)方法,解码使用.URLDecoder类的decode(Stringstr,Stringencoding)方法,例如:

代码5.3 encoding.jsp

<%@pagelanguage="java"pageEncoding="UTF-8"%>

directive.pageimport=".URLEncoder"/>

directive.pageimport=".URLDecoder"/>

<%

   //使用中文的Cookie.name与value都使用UTF-8编码

   Cookiecookie=newCookie(

      URLEncoder.encode("姓名","UTF-8"),

      URLEncoder.encode("刘京华","UTF-8"));

      

   response.addCookie(cookie);//发送到客户端

%>

DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">

CookieEncoding

<%

   if(request.getCookies()!

=null){

      for(Cookiecc:

request.getCookies()){    //遍历所有的Cookie

         StringcookieName=URLDecoder.decode(cc.getName(),"UTF-8");

         StringcookieValue=URLDecoder.decode(cc.getValue(),"UTF-8");

         

         out.println(cookieName+"="+cookieValue+";
");

      }

   }

   else{

      out.println("Cookie已经写入客户端.请刷新页面.");

   }

%>

程序使用UTF-8编码了Cookie内容,然后再使用UTF-8解码Cookie并显示出来。

程序运行效果如图5.3所示。

图5.3 Cookie的UTF-8编码

%提示:

Cookie中保存中文只能编码。

一般使用UTF-8编码即可。

不推荐使用GBK等中文编码,因为浏览器不一定支持,而且JavaScript也不支持GBK编码。

1.5 BASE64编码:

保存二进制图片

Cookie不仅可以使用ASCII字符与Unicode字符,还可以使用二进制数据。

例如在Cookie中使用数字证书,提供安全度。

使用二进制数据时也需要进行编码。

下面的例子使用BASE64编码在Cookie中保存二进制文件。

源代码如下:

代码5.4 base64.jsp

<%@pagelanguage="java"pageEncoding="UTF-8"%>

directive.pageimport="sun.misc.BASE64Encoder"/>

directive.pageimport="java.io.InputStream"/>

directive.pageimport="java.io.File"/>

<%

   Filefile=newFile(this.getServletContext().getRealPath("cookie.

   gif"));

   

   byte[]binary=newbyte[(int)file.length()];     //二进制数组

   

   //从图片文件读取二进制数据.

   InputStreamins=this.getServletContext().getResourceAsStream

   (file.getName());

   ins.read(binary);

   ins.close();   

   

   Stringcontent=BASE64Encoder.class.newInstance().encode(binary);

   //BASE64编码

      

   Cookiecookie=newCookie("file",content);

                                    //包含二进制数据的Cookie

   response.addCookie(cookie);            //将Cookie发送到客户端

%>

DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">

CookieEncoding

从Cookie中获取到的二进制图片:


配套讲稿:

如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

特殊限制:

部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

关 键  词:
Cookie Session 机制
提示  冰点文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:Cookie与Session机制.docx
链接地址:https://www.bingdoc.com/p-2191604.html
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2


收起
展开