Java Web学习(21):Cookie机制状态管理

        一HTTP协议无状态性      

        HTTP协议(超文本传输协议)是无状态协议,无状态是指当浏览器发送请求给服务器的时候,服务器响应客户端请

求。这意味着每次客户端检索网页时,都要单独打开一个服务器连接,因此服务器不会记录下先前客户端请求的任何

信息。也就是当同一个浏览器再次发送请求给服务器的时候,服务器并不知道它就是刚才那个浏览器。

        简单地说,就是服务器不会记得你,所以就是无状态协议。

        JSP中有保存用户状态的两大机制:

        1)session机制

        2)Cookie机制

        有四种方法来维持客户端与服务器的会话:

        1)Cookie

        网络服务器可以指定一个唯一的session ID作为Cookie来代表每个客户端,用来识别这个客户端接下来的请求。

        2)隐藏表单域

        一个网络服务器可以发送一个隐藏的HTML表单域和一个唯一的session ID,就像下面这样:

        这个条目意味着,当表单被提交时,指定的名称和值将会自动包含在GET或POST数据中。每当浏览器发送一个

请求,session_id的值就可以用来保存不同浏览器的轨迹。

        这种方式可能是一种有效的方式,但点击标签中的超链接时不会产生表单提交事件,因此隐藏表单域

也不支持通用会话跟踪。

        3)重写URL

        我们也可以可以在每个URL后面添加一些额外的数据来区分会话,服务器能够根据这些数据来关联session标识

符。

        举例来说,http://www.baudu.com/file.html;sessionid=12345, session标识符为sessionid=12345,服务

器可以用这个数据来识别客户端。

        相比而言,重写URL是更好的方式来,就算浏览器不支持Cookie也能工作,但缺点是您必须为每个URL动态指定

session ID,就算这是个简单的HTML页面。

        4)session对象

        JSP利用Servlet提供的HttpSession接口来识别一个用户,存储这个用户的所有访问信息。

        默认情况下,JSP允许会话跟踪,一个新的HttpSession对象将会自动地为新的客户端实例化。禁止会话跟踪需

要显式地关掉它,通过将page指令中session属性值设为false来实现,就像下面这样:

<%@ page session="false" %>

        JSP引擎将隐含的session对象暴露给开发者。由于提供了session对象,开发者就可以方便地存储或检索数据。

        二Cookie机制

        (1)Cookie简介

        什么是Cookie?

        Cookie的中文名称为"小甜饼",是Web服务器保存在客户端的一系列文本信息。我们可以举出各大电商网站的

典型应用:

        典型应用一:判定注册用户是否已经登录网站;

        典型应用二:购物车的处理。

        生活中Cookie的应用

        图片一:系统会自动记录已经浏览过的视频

        Java Web学习(21):Cookie机制状态管理_第1张图片

        图片二:记住用户名和密码实现自动登录功能

        Java Web学习(21):Cookie机制状态管理_第2张图片

        (2)Cookie处理

        Cookie是存储在客户机的文本文件,它们保存了大量轨迹信息。在Servlet技术基础上,JSP显然能够提供对

HTTP Cookie的支持。

        通常有三个步骤来识别回头客:

        1)服务器脚本发送一系列Cookie至浏览器。比如名字,年龄,ID号码等等。

        2)浏览器在本地机中存储这些信息,以备不时之需。

        3)当下一次浏览器发送任何请求至服务器时,它会同时将这些Cookie信息发送给服务器,然后服务器使用这些

信息来识别用户或者干些其它事情。

        Cookie处理需要对中文进行编码与解码,方法如下:

String str = java.net.URLEncoder.encode("中文");        //编码
String str = java.net.URLDecoder.decode("编码后的字符串");   // 解

        (3)Cookie的作用

        1)对特定对象的追踪;

        2)保存用户网页浏览记录与习惯;

        3)简化登录;

        安全风险:容易泄露用户信息。

        (4)Cookie的创建与使用

        使用JSP设置cookie包含三个步骤:

        1)创建一个Cookie对象:调用Cookie的构造函数,使用一个cookie名称和值做参数,它们都是字符串。

Cookie cookie = new Cookie(String key,Object value);

        请务必牢记,名称和值中都不能包含空格或者如下的字符:[ ] ( ) = , " / ? @ : ;

        2)设置有效期:调用setMaxAge()函数表明cookie在多长时间(以秒为单位)内有效。下面的操作将有效期设为了

24小时。

 cookie.setMaxAge(60*60*24); 

        3)将cookie发送至HTTP响应头中(也即是写入Cookie对象):调用response.addCookie()函数来向HTTP响应头

中添加cookie。

<response.addCookie(cookie);

        4)读取Cookie对象

        在JSP想要读取cookie,您就需要调用request.getCookies()方法来获得一个javax.servlet.http.Cookie对象的数

组,然后遍历这个数组,使用getName()方法和getValue()方法来获取每一个cookie的名称和值。

Cookie[] cookies = request.getCookies();

        5)删除Cookie

        删除cookie非常简单。如果您想要删除一个cookie,按照下面给的步骤来做就行了:获取一个已经存在的

cookie然后存储在Cookie对象中。将cookie的有效期设置为0。将这个cookie重新添加进响应头中。

        (5)Cookie的方法

        下表列出了Cookie对象中常用的方法:

        Java Web学习(21):Cookie机制状态管理_第3张图片

        三实例项目

        实现记忆用户名和密码功能

        实现效果图:

        Java Web学习(21):Cookie机制状态管理_第4张图片

        实例代码:

        login.jsp页面代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@ page import="java.net.*" %>




用户登录


    

用户登录

   
        <%            //防止中文乱码      request.setCharacterEncoding("UTF-8");          String username= "";      String password = "";            Cookie[] cookies = request.getCookies();      if(cookies!=null&&cookies.length>0){           for(Cookie c:cookies){               if(c.getName().equals("username")){                   username =  URLDecoder.decode(c.getValue(),"UTF-8");               }               if(c.getName().equals("password")){                   password =  URLDecoder.decode(c.getValue(),"UTF-8");               }           }      }     %>     
                                                                                                                                                   
用户名:
密码:
十天内记住我的登录状态
                                               
   

        doLogin.jsp页面代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@ page import="java.net.*" %>




登录页面


    

登录成功

   
    <%            //防止中文乱码           request.setCharacterEncoding("UTF-8");                //首先判断用户是否选择了记住登录状态           String[] isUseCookies = request.getParameterValues("isUseCookie");                      if(isUseCookies!=null&&isUseCookies.length>0){          //把用户名和密码保存在Cookie对象里面               String username = URLEncoder.encode(request.getParameter("username"),"UTF-8");               //使用URLEncoder解决无法在Cookie当中保存中文字符串问题               String password = URLEncoder.encode(request.getParameter("password"),"UTF-8");                          Cookie usernameCookie = new Cookie("username",username);               Cookie passwordCookie = new Cookie("password",password);                              //设置最大生存期限为10天(10*24*60*60秒)               usernameCookie.setMaxAge(864000);               passwordCookie.setMaxAge(864000);                              //使用response对象保存Cookie对象               response.addCookie(usernameCookie);               response.addCookie(passwordCookie);           }else{          //不选择记录状态          Cookie[] cookies = request.getCookies();               if(cookies!=null&&cookies.length>0){               for(Cookie c:cookies){               if(c.getName().equals("username")||c.getName().equals("password")){               //设置Cookie失效               c.setMaxAge(0);                //重新保存                            response.addCookie(c);                         }                    }                }           }     %>     查看用户信息

        users.jsp页面代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@ page import="java.net.*" %>




用户界面


    

用户信息

   
    <%            //防止中文乱码      request.setCharacterEncoding("UTF-8");           String username= "";      String password = "";            Cookie[] cookies = request.getCookies();      if(cookies!=null&&cookies.length>0){           for(Cookie c:cookies){              if(c.getName().equals("username")){                   username = URLDecoder.decode(c.getValue(),"UTF-8");              }              if(c.getName().equals("password")){                   password = URLDecoder.decode(c.getValue(),"UTF-8");              }           }      }     %>      用户名:<%=username %>
     密码:<%=password %>

        运行结果:

        Java Web学习(21):Cookie机制状态管理_第5张图片

        Java Web学习(21):Cookie机制状态管理_第6张图片

        

        在登录的时候选择记住用户名和密码;再次刷新页面我们看到浏览器记住了用户名和密码。

        四session与Cookie的对比

        对比图:

        Java Web学习(21):Cookie机制状态管理_第7张图片

        1)Cookie中对保存对象的大小是有限制的。

        2)Cookie保存的是String类型,session保存的是Object类型。

        3)Cookie与session都可以设置生存期限。

        4)session是服务器端保存用户状态的机制。

        5)Cookie是客户端保存用户状态的机制。



你可能感兴趣的:(JavaWeb,Java,Web学习之路)