一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("编码后的字符串"); // 解
(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是客户端保存用户状态的机制。