ITKeyword,专注技术干货聚合推荐

注册 | 登录

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

erlian1992 分享于 2016-07-27

推荐:Java Web学习总结(8)——使用Cookie进行会话管理

一、会话的概念   会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。   有状态会话

2019阿里云全部产品优惠券(新购或升级都可以使用,强烈推荐)
领取地址https://promotion.aliyun.com/ntms/yunparter/invite.html

        一HTTP协议无状态性      

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

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

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

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

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

        1)session机制

        2)Cookie机制

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

        1)Cookie

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

        2)隐藏表单域

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

<input type="hidden" name="sessionid" value="12345">

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

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

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

也不支持通用会话跟踪。

        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的应用

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

        

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

        

        (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("编码后的字符串");   // 解

推荐:学习《21天学通Java 6》(一)——Java自动内存管理机制

感谢分享  http://blog.sina.com.cn/s/blog_9cc9465901012xh7.html Java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同的数据区。 它们都有各

        (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对象中常用的方法:

        

        三实例项目

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

        实现效果图:

        

        实例代码:

        login.jsp页面代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 导入工具类URLDecoder -->
<%@ page import="java.net.*" %>
<!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=UTF-8">
<title>用户登录</title>
</head>
<body>
    <h1>用户登录</h1>
    <hr>
    <!-- 曾经选择过记住登录状态 -->
    <% 
          //防止中文乱码
	      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");
	               }
	           }
	      }
    %>
    
	<form name="loginForm" action="doLogin.jsp" method="post">
	       <table>
	         <tr>
	             <td>用户名:</td>
	             <td><input type="text" name="username" value="<%=username %>"/></td>
	         </tr>
	         <tr>
	             <td>密码:</td>
	             <td><input type="password" name="password" value="<%=password %>" /></td>
	         </tr>
	         <tr>
	             <td colspan="2"><input type="checkbox" name="isUseCookie" checked="checked"/>十天内记住我的登录状态</td>
	         </tr>
	         <tr>
	             <td colspan="2" align="center">
	                  <input type="submit" value="登录"/>
	                  <input type="reset" value="取消"/>
	             </td>
	         </tr>
	       </table>
    </form>
</body>
</html>

        doLogin.jsp页面代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 导入工具类URLDecoder -->
<%@ page import="java.net.*" %>
<!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=UTF-8">
<title>登录页面</title>
</head>
<body>
    <h1>登录成功</h1>
    <hr>
    <% 
          //防止中文乱码
          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); 
                       }
                   }
               }
          }
    %>
    <a href="users.jsp" target="_blank">查看用户信息</a>
</body>
</html>

        users.jsp页面代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 导入工具类URLDecoder -->
<%@ page import="java.net.*" %>
<!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=UTF-8">
<title>用户界面</title>
</head>
<body>
    <h1>用户信息</h1>
    <hr>
    <% 
          //防止中文乱码
	      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 %><br>
     密码:<%=password %><br>
</body>
</html>

        运行结果:

        

        

        

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

        四session与Cookie的对比

        对比图:

        

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

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

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

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

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



推荐:(张龙讲学)java web学习---session(会话机制)的使用

跟踪客户状态 Web服务器跟踪客户状态通常有四种方法 – 建立含有跟踪数据的隐藏字段 – 重写包含额外参数的URL – 使用持续的Cookie – 使用Servlet API中的Sess

        一HTTP协议无状态性               HTTP协议(超文本传输协议)是无状态协议,无状态是指当浏览器发送请求给服务器的时候,服务器响应客户端请 求。这意味着每次客户端检索网页时,都要单

相关阅读排行


用户评论

游客

相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。