Cookie与Session

会话的概念:

现实生活中,我们经常会用到手机和对方进行通话,结束后挂断电话,打电话到结束这个过程可以与浏览器访问Web容器做个类比,首先打开浏览器输入URL地址(相当于对方的号码),然后浏览器就发出HTTP请求(拨号等待接通),服务器接收到请求进行逻辑的处理,将请求结果发还给浏览器端(进行通话),这个过程会一直反复,到最后用户关闭浏览器(挂断电话),这个过程我们称之为会话,会话可以简单理解为,用户打开浏览器,点击多个超链接,访问Web浏览器的一些资源,最后到关闭浏览器的过程

会话的使用:

--偏好记录:购物网站会通过会话的数据显示您的偏好记录。
--自动登录:保存用户的用户名与密码,下次访问自动登陆。
--浏览记录:浏览器会显示你曾经浏览的记录。

原理:
客户端或者服务器保存用户数据

会话保存的方式:

Cookie与Session
(1)Cookie:会话数据保存在浏览器客户端。
(2)Session:会话数据保存在服务器端。

Cookie:

中文名称为小甜饼,某些网站为了辨别用户身份,而存储用户终端的数据。

特点:

*Cookie对象保存会话数据。
*保存在客户端。
*以Key-Value形式保持数据。

Cookie的工作流程

首次访问服务器时候
(1)客户端浏览器发送HTTP请求,服务器接收请求根据需要生成Cookie对象;

(2)服务器把客户端的数据保存到Cookie对象中;

(3)服务器会把Cookie对象放到相应头中通过response对象发送给浏览器;

(4)浏览器接收到服务器的响应后,提取服务器的Cookie,保存到浏览器中。

再次浏览器再次访问服务器的时候:
(1)浏览器会将Cookie对象放到请求头中发送给服务器;

(2)服务器就会从request对象中提取该Cookie对象;

(3)判别Cookie里的数据,然后做出个性化的响应。

Cookie生命周期
*有效期:保存在客户端的Cookie不是一直有效的,如果我们不设置过期时间,则Cookie的生命周期是浏览器的会话周期,就是我们只要关闭浏览器窗口,Cookie就消失。这种生命周期的Cookie我们称之为会话Cookie,会话Cookie一般保存在内存中而不是硬盘上。
*设置有效期:可以通过setMaxAge设置cookie有效期,如果设置了过期时间,浏览器就会把他保存到硬盘上关闭浏览器再次打开,Cookie依然有效直到超过过期时间,Cookie就会被自动清除。


Cookie的缺陷:
Cookie对于用户辨别是非常好的功能,但是存在一些缺陷。
*大小和数据的限制:一般来说每个站点能保存20个Cookie,每个Cookie大小限制一般在4K以内;
*数据安全性问题:由于HTTP的Cookie是明文传递的,所以有安全风险问题。
代码例子:
下面将实现一个简单的Cookie的使用。
准备工作:
1.index.html:用于用户登陆。
2.UserServlet的Sevlet程序,用于实现业务逻辑。
3.error.html的页面,登陆信息错误时会跳转到这个页面。
index.html,form表单有两个参数,一个是userName,一个是password,点击登陆时,将以post方式提交表单数据到UserServlet:

<!DOCTYPE html>
<head>
  <title>登录页</title>
</head>
<body>
  <section class="container">
    <div class="login">
      <h1>登录</h1>
      <form method="post" action="/UserServlet">
        <p><input type="text" name="userName" value="" placeholder="用户名"></p>
        <p><input type="password" name="userPassword" value="" placeholder="密码"></p>
        <p class="submit"><input type="submit" name="commit" value="登陆"></p>
      </form>
    </div>
  </section>
</body>
</html>
UserServlet一些包自行导入,这里只写了关于使用Cookie代码片段:
public class UserServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		process(request, response);
	}
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		logger.info("UserServlet post method is invoked.");
		//设置返回的内容格式,与编码方式
		response.setContentType("text/html;charset=UTF-8");
		process(request, response);
	}
	//创建process方法来处理业务逻辑
	protected void process(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		//转发对象
		RequestDispatcher dispatcher = null;
		//首先提取请求中的form表单中字段的值
		String userName = request.getParameter("userName");   
		String userPassword = request.getParameter("userPassword");
		//Cookie的使用
		//1.创建Cookie,第一次当浏览器访问服务器的时候,创建相应的Cookie对象,将表单提交的数据放到Cookie中
		Cookie userNameCookie = new Cookie("userName", userName);
		Cookie pwdCookie = new Cookie("pwd", userPassword);
	
		//2.设置Cookie的过期时间,单位是秒
		userNameCookie.setMaxAge(10 * 60);
		pwdCookie.setMaxAge(10 * 60);
		
		//3.返还Cookie,将Cookie对象放到响应体中返还给浏览器,浏览器拿到这个Cookie,当它第二次访问服务器就会带上这个Cookie对象
		response.addCookie(userNameCookie);
		response.addCookie(pwdCookie);
		//4.获取Cookie,我们从请求体中获取对应的Cookie对象,获得到的Cookie是一个Cookie数组
		Cookie[] cookies = request.getCookies();
		//5.做判断,辨别浏览器是不是第一次请求
		if (cookies != null) {
			for (Cookie cookie : cookies) {   //遍历获取我们需要的数据
				if (cookie.getName().equals("userName")) {
					userName = cookie.getValue();  //获取到cookie中的userName将其保存到表单中
				}
				if (cookie.getName().equals("pwd")) {
					userPassword = cookie.getValue();//获取到cookie中的pwd将其保存到表单中的userPassword
									//这样就不用从表单中获取userName和userPassword的值,从而实现直接登陆的功能
				}
			}
		}
		try {	//对用户的登陆信息做个判断,若信息正确,则返还用户的信息,否则转发到登陆信息错误页面
			if (userName.equals("123") && userPassword.equals("123")) { 
				PrintWriter writer = response.getWriter();
				writer.println("<html>");
				writer.println("<head><title>用户中心</title></head>");
				writer.println("<body>");
				writer.println("<p>用户名:" + userName + "</p>");
				writer.println("<p>用户密码:" + userPassword + "</p>");
				writer.println("</body>");
				writer.println("</html>");
				writer.close();
			} else {               //3.否则返回一个error页面
				dispatcher = request.getRequestDispatcher("/error.html");
				dispatcher.forward(request, response);
			}
		} catch (Exception e) {
			e.printStackTrace();
			dispatcher = request.getRequestDispatcher("/error.html");
			dispatcher.forward(request, response);
		}


	}
}
error.html:
<!DOCTYPE html>
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <title>404</title>
</head>
<body>
  <section class="container">
    <div class="login">
      <h1>404</h1>
      <p>Not Found</p>
    </div>
  </section>
</body>
</html>
Session:
这里学习的是HTTPSession:服务器为客户端创建的一个对象,在这个对象中用于保存用户的数据,这些数据的作用在于服务端与客户端的状态保存.
Session的工作流程:

首次访问服务器:

(1)客户端浏览器发送HTTP请求,服务器接收请求通过request对象生成Session对象,自动给Session对象附上唯一的编号;

(2)服务器会把对应的数据记录到Session对象中;

(3)服务器端做些逻辑处理,把Session对象的唯一编号放到一个Cookie中;

(4)将处理的结果随着HTTP相应发送到浏览器中。

再次访问服务器的时候:


(1)浏览器会发带有SessionID的Cookie给服务器;

(2)服务器拿到带有SessionID的Cookie之后,取出对应的SessionID,然后在服务器中找到对应的Session对象;

(3)当服务器辨别出该用户之后,做出个性化的响应。

Session的生命周期:

*默认的有效期为30分钟;

*通过接口的方式来设置其有效期:setMaxInactiveInterval;

*通过部署描述符来配置Session的有效期;

*优先级:接口方式高于部署描述符的方式;

*与Cookie不同,能直接使Session失效,调用incalidate接口是Session失效。

Session的代码片段:
 //1.创建Session:首先创建HttpSession对象,这个Session是从request对象获取到的,调用getSession创建Session对象
	HttpSession session = request.getSession();
	//第一请求的时候是拿不到这个字段的,用户第二次请求时候才能拿得到,所以后面要做个判断
	String name = (String)session.getAttribute();
	if(name!=null){
	System.out.println("second login:"+name);
	}
	//2.Session数据保存:把需要的数据放到Session对象中,setAttribute()有两个参数,第一个为逻辑名称可以任意命名,第二个参数通常为从表单获取的参数
	session.setAttribute("userName","userName");
通过部署描述符来配置Session的有效期:
<seesion-config>
	<session-timeout>2</session-timeout>  //单位是分钟
</session-config>
Cookie与Session对比
(1)从数据存储角度对比:
Cookie存在客户端,Session存在服务器端。
(2)从安全性来讲:
Cookie是以明文的方式存在客户端的但是安全性通过较弱,但是可以通过加密的方式进行存放。
Session存放在服务器端内存中,安全性较强。
(3)从生命周期来看:
Cookie的生命周期是累计时间的,即到点就失效。
Session的生命周期时间是间隔时间的,就是从我们最后一次访问开始计时,与Cookie不同的Session可以直接调用API直接就能使它失效。
(4)从使用原则方面:
Cookie使用时有限制的,每个站点只有20个Cookie,而且每个Cookie的大小在4K以内。
Session是存在服务器端的,会占用服务器的内存,因此建议不要再Session中存放过多过大的对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值