Servlet之可爱可气的Cookie

来源:互联网 发布:微商做图换头像软件 编辑:程序博客网 时间:2024/04/30 13:29

          前言

                         Servlet的学习进行到Cookie了,对于Cookie也有了一个自己的理解。想着把自己的总结

                  记录下来,形成一份博客。话说笔者这几天都没写博客了,突然感觉不知从何说起,真是有待

                  提高啊。

          Cookie介绍和由来

                       ●  Cookie你从哪里来?

                       在前面的对HTTP的协议中,我们知道了HTTP是一种无状态的协议,这种方式使得web服务器

                  不知道用户上一次访问服务器干了什么,严重的阻碍了交互式web应用程序的实现。一个简单的

                  例子就是我们在登录过一次网站后退出,在进行登录还的去填写登录信息,虽然这种方式安全性

                  比较高,不过总归是一件特别麻烦的事。基于这种情形,Cookie技术就形成了。

                      ●  Cookie是什么?

                       用大白话来说Cookie就是一堆数据,其组织形式是以键值对的形式组织的。在交互式web应用

                   中十分有用,它是服务器在客户端保存的一些信息,例如用户名、密码,这些信息是加密了的。

                   这就是Cookie,Cookie的信息并不大,就好像是小甜饼一样。而且Cookie的大小一般不能超过

                   4kb。

           Cookie和web服务器的交互

                        知道了Cookie的由来和Cookie就是一堆键值对数据,那么Cookie是如何和web服务器进行交

                   互 从而完成交互式的web应用的呢?简单的看下图就明白了:

                      

                       具体流程如下图:

                     

             Cookie可爱之处

                            了解了Cookie与服务器的交互过程,我们思考一个问题:cookie究竟能干什么?

                       典型的应用就是判定用户注册是是否已经注册(实现检测是否存在cookie可以减轻服务器压力)、

                       记住用户名、密码功能可以让我们登录网站的时候快捷一些,网上商店购物车的运用。

             源码实例

                            知道了Cookie的可爱之处,那么我们来看看Cookie在Servle中是如何来操作的吧?

                       这里我们以一个简单的“登录记住”为例。通过Cookie实现下次登录记住用户名,

                       密码的功能。

                            首先看看LoginServle的代码情况,这里主要是在doPost方法中处理的。

                   

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  request.setCharacterEncoding("utf-8");  String username = request.getParameter("username");  String password = request.getParameter("password");  String record = request.getParameter("record");  //第一次登陆根据record是否被选择来确定是否使用cookie  if(record.equals("yes"))  {  //使用cookie  //1、首先在服务器创建Cookies  Cookie nameCookie = new Cookie("username", username);  Cookie passCookie = new Cookie("password", password);  //2、设定cookie存在的时间  nameCookie.setMaxAge(30*60*24);//设置Cookie存在的时间,以秒为单位  passCookie.setMaxAge(30*60*24);  //3、创建cookie并保存到客户端  response.addCookie(nameCookie);  response.addCookie(passCookie);  //用户名验证  if(username.equals("kiritor")&&password.equals("kiritor"))  request.getRequestDispatcher("index.jsp").forward(request, response);  else  request.getRequestDispatcher("error.jsp").forward(request, response);    }  }
                          这样我们在用户第一次登录之后,用户如果选择记住密码之后,服务器就生成了

                   cookie对象并通过response对象将其保存在客户端浏览器中了。下次登录的时候我们

                   就可以通过javaScript代码动态的获取用户名,密码了。

                          详细情况看代码部分。 

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>登录</title></head><body><P></P><P></P><center><form action="LoginServlet" method="post" name="form_name">用户名:<input type="text" name="username" /></br> 密 码:<input type="password"name="password" /></br> 记住密码<input type="radio" name="record"value="yes" /> <input type="submit" value="提交" /></form></center><script type="text/javascript">//js获取cookievar acookie = document.cookie.split("; ");function getck(sname) {//获取单个cookiesfor ( var i = 0; i < acookie.length; i++) {var arr = acookie[i].split("=");if (sname == arr[0]) {if (arr.length > 1)return unescape(arr[1]);elsereturn "";}}return "";}//给相应的form里的input赋值document.form_name.username.value = getck("username");document.form_name.password.value = getck("password");</script></body></html>
                       可以预见的是进过第一次记住密码并登录之后,下次登录就不需要用户手动输入密码了。

                  

                      好了一个简单的Cookie例子就完成了,在Servlet中对Cookie到底具有什么操作,这里我们可以

                     直接阅读Servlet源码,这里笔者对其方法做一个简单的展示

                                  

                      见名知意,根据名字我们就可以得出其方法的目的了,具体作用是什么,笔者也不想多提了。

             Cookie藏哪儿?

                          Cookie的数据时加密的,这里我们想看看它到底长个什么样子。那么Cookie到底藏在哪里

                      呢? 这个不同浏览器貌似不同。读者如果感兴趣的话可以自己找找看。

            可气的Cookie

                         对于Cookie有一些缺陷,此部分参照维基百科:

                       http://zh.wikipedia.org/wiki/Cookie

                         ● 不安全性

                         通过上面的学习我们知道cookie是保存在客户端的,虽然cookie是经过了加密的,但是仍然

                     存在着极大的安全隐患。

                         Cookie在HTTP请求是明文传递的,虽然经过加密,但是解密更加强大,Cookie在某种程度

                      上来说已经严重的危机到用户的隐私安全了,很多情况下,我们接收到的垃圾邮件都是由于使

                       用cookie造成的。

                     ● 识别不精确

                         如果在一台计算机中安装多个浏览器,每个浏览器都会以独立的空间存放cookie。因为cookie

                     中不但可以确认用户,还能包含计算机和浏览器的信息,所以一个用户用不同的浏览器登录或者

                     用不同的计算机登录,都会得到不同的cookie信息,另一方面,对于在同一台计算机上使用同一

                     浏览器的多用户群,cookie不会区分他们的身份,除非他们使用不同的用户名登录。

                     ● 增加流量

                          Cookie会被附加到每个HTTP请求中,占用了流量

                     ● 存储的数据量太小

                          Cookie只支持最多4kb的数据,能够给予的存储空间太小

                     ● 偷窃Cookie和脚本攻击

                          虽然cookies没有中电脑病毒那么危险,但它仍包含了一些敏感信息:用户名,电脑名,

                      使用的浏览器和曾经访问的网站。用户不希望这些内容泄漏出去,尤其是当其中还包含有私人

                      信息的时候。

                         这并非危言耸听,跨站点脚本(Cross site scripting)可以达到此目的。在受到跨站点脚本

                     攻击时,cookie盗贼和cookie毒药将窃取内容。一旦cookie落入攻击者手中,它将会重现其价

                     值。

                       Cookie盗贼:搜集用户cookie并发给攻击者的黑客。攻击者将利用cookie信息通过合法手

                                               段进入用户帐户。
                       Cookie投毒:一般认为,Cookie在储存和传回服务器期间没有被修改过,而攻击者会在

                                                cookie送回服务器之前对其进行修改,达到自己的目的。例如,在一个购物网站的

                                               cookie中包含了 顾客应付的款项,攻击者将该值改小,达到少付款的目的。

                                               这就是cookie 投毒。

              总结

                              Cookie可以帮我们完成一些特别的功能。Cookie有许多的缺陷,但是在一些对安全性要求不

                         高的应用中,我们还是可以借助Cookie来实现业务需求的。

                              对于Cookie的缺陷问题,现在也有一些替代方法,这里笔者可以上网自己查阅下:

                          给个维基百科上的替代方法:http://zh.wikipedia.org/wiki/Cookie

     


   

原创粉丝点击