会话管理(session&cookie)

会话管理(session&cookie)

前言:

1.Http协议特点

2.Session与Cookie的创建与销毁

3.Session与Cookie的区别和联系

4.总结

一、Http协议的特点

1.1 HTTP协议特点有三个特点:

1、无状态协议;

​ 2、用于通过 Internet 发送请求消息和响应消息;

​ 3、使用端口接收和发送消息,默认为80端口;

1.2 会话的概念

​ 当前浏览器与服务器间多次的请求、响应关系,被称作一个会话

二、会话技术之session

2.1 HttpSession接口

​ 在Servlet API中的HttpSession接口实现会话管理,它是通过session机制来跟踪客户的状态信息。

​ –服务器为每个会话创建一个HttpSession对象

​ –每个会话对象都有一个唯一的ID

​ –把用户的数据保存在相应的HttpSession对象内

2.2 HttpSession创建与使用

使用HttpServletRequest 的 getSession() 方法创建会话。

语法如下:

 public HttpSession getSession(); 
 public HttpSession getSession( boolean value); // 参数为true与getSession()方法一样
/*
补充说明:
参数为true表示:返回与当前关联的会话,如果没有就创建后将其返回
参数为false表示:返回与当前关联的会话,如果没有返回null
*/

使用session保存数据与获取数据方法:

public void setAttribute(String key,Object value); // 保存数据

public Object getAttribute(String key);// 获取数据
2.3 HttpSession的生命周期

session的创建

浏览器访问服务器时,服务器为每个浏览器创建不同的session对象

session的关闭

1、调用session. invalidate()方法,使session对象失效

2、访问时间间隔大于非活动时间间隔, session对象失效

3、关闭浏览器时,session对象失效

Session会话管理测试:

/**************************************************
 * 
 * @author xiaochong Session会话管理测试
 * 
 *
 */
@WebServlet("/sessiontest")
public class SessionServlet extends HttpServlet {

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html;charset=utf-8");

		PrintWriter out = response.getWriter();

		// 创建或者关联一个HttpSession对象


		HttpSession session = request.getSession(true);
        		/*
		 * 参数为true 表示 返回与当前关联的 会话,如果没有就 创建后将其返回 参数为false 表示 返回与当前关联 的会话,如果没 有返回null
		 */

		if (session != null) {
			String id = session.getId();
			out.print("sessionid:" + id + "<br />");
			out.println("是否为新的session:" + session.isNew() + "<br />");

			SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
			out.println("session创建的时间:" + dateFormat.format(new Date(session.getCreationTime())));
			out.print("<br/>");
			out.print("session最后的访问的时间:" + dateFormat.format(new Date(session.getLastAccessedTime())));
		} else {
			out.print("会话对象无法关联");
		}

		//  设置最大非活动间隔时间,单位:秒
		//session.setMaxInactiveInterval(5);
		
		// 设置session失效
		// session.invalidate();
		
		
	}

}

Session会话销毁:

1、调用session. invalidate()方法,使session对象失效

2、 访问时间间隔大于非活动时间间隔, session对象失效

3、关闭浏览器时,session对象失效

三、会话技术之Cookies

3.1 Cookies概念

​ Cookie 客户端会话技术,将数据保存到客户端。

3.2 Cookies的使用

​ 使用步骤:

​ 1、创建Cookie对象,绑定数据-new Cookie(String name, String value)

​ 2、 发送Cookie对象 -response.addCookie(Cookie cookie)

​ 3、获取Cookie,拿到数据-Cookie[] request.getCookies()

举例:记住上一次访问时间

需求:

1、访问一个Servlet,如果是第一次访问,则提示:您好,欢迎您首次访问。

2、如果不是第一次访问,则提示:欢迎回来,您上次访问时间为:显示时间字符串。

分析:

​ 1、可以采用Cookie来完成。

​ 2、在服务器中的Servlet判断是否有一个名为lastTime的cookie

​ 如果有不是第一次:响应数据:欢迎回来,您上次访问时间为:2019年11月11日11:11:11

​ 如果没有 是第一次:响应数据:您好,欢迎您首次访问。

案例代码:

@WebServlet("/cookieTest")
public class CookieServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		this.doPost(request, response);
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// 设置响应的消息体的数据格式以及编码
		response.setContentType("text/html;charset=utf-8");

		PrintWriter out = response.getWriter();

		// 从请求中获得Cookie
		Cookie[] cs = request.getCookies();
		// 如果不是第一次请求,cookie的内容为空
		System.out.println("length:" + cs.length);
		if (cs == null || cs.length <= 2) {

			SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
			String lastTime = dateFormat.format(new Date());
			System.out.println("编码前:" + lastTime);
			lastTime = URLEncoder.encode(lastTime, "utf-8");
			System.out.println("编码后:" + lastTime);
			// 第一次访问
			Cookie cookie_lastTime = new Cookie("lastTime", lastTime);
			// 设置cookie有效时间
			cookie_lastTime.setMaxAge(60 * 60 * 24);
			// 添加到响应中
			response.addCookie(cookie_lastTime);

			out.print("<h1>你好!欢迎你首次访问</h1>");

		} else {

			// 从cookie中读取lasTime的内容
			String lastTime = null;
			for (Cookie c : cs) {
				if (c.getName().equals("lastTime")) {
					lastTime = c.getValue();
					// 重新设置最新时间
					SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
					String newlastTime = dateFormat.format(new Date());
					System.out.println("编码前:" + newlastTime);
					newlastTime = URLEncoder.encode(newlastTime, "utf-8");
					System.out.println("编码后:" + newlastTime);
					c.setValue(newlastTime);
					// 添加到响应中
					c.setMaxAge(60 * 60 * 24);
					response.addCookie(c);

					break;
				}
			}

			System.out.println("解码前:" + lastTime);
			lastTime = URLDecoder.decode(lastTime, "utf-8");
			System.out.println("解码后:" + lastTime);

			out.print("<h1>欢迎您再回来,您上次访问的时间:" + lastTime + "</h1>");

		}

	}

}

注:不同浏览器的判断逻辑不一样。

四、综合案例

​ 1、需求

​ 自动登录

​ 如果用户已经登录成功过,并且保存用户名和密码(勾选自动登录多选框),下次登录可以不需要输入用户名和密码直接点击登录,完成登录。

​ 2、 分析

​ 可以在登录验证通过的业务中,把用户名和密码信息使用Cookie保存到客户端中,当用户下次登录就可以从本地的客户端读取用户名和密码信息,然后完成登录验证。

代码案例:

login.jsp页面代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户登录-Session与Cookies综合案例</title>
</head>
<body>
		<form action="LoginServlet"  method="post">
			用户名:<input type="text"  name="username" /><br />
			密码:<input type="text"  name="password" /><br />
				<input type="checkbox"  name="iscookie"  value="1" />是否自动登录
			<input type="submit" value="登录" />
		</form>	
</body>
</html>

LoginServlet代码如下:

@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		Cookie[] cookies = request.getCookies();
		String username = null, pwd = null, isCookie = null;
		if (cookies.length <= 4) {
			// 获得用户名和密码
			username = request.getParameter("username");
			pwd = request.getParameter("password");
			isCookie = request.getParameter("iscookie");
			// 把用户名和密码保存到Cookie中
			if ("1".equals(isCookie)) {

				Cookie username_cookie = new Cookie("username", username);
				Cookie pwd_cookie = new Cookie("pwd", pwd);

				username_cookie.setMaxAge(1800);
				pwd_cookie.setMaxAge(1800);

				// 添加到响应中
				response.addCookie(username_cookie);
				response.addCookie(pwd_cookie);
			}
		}else {
			for(Cookie c:cookies) {
					if(c.getName().equals("username")) {
						  // 从cookie中获得用户名
						 username = c.getValue();
					}else if(c.getName().equals("pwd")) {
						// 从cookie中获得密码
						pwd = c.getValue();
					}
			}
			
			
		}

		if ("admin".equals(username) && "123456".equals(pwd)) {
			request.getSession().setAttribute("admin", username);
			response.sendRedirect("admin.jsp");
		} else {
			response.sendRedirect("error.jsp");
		}

	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

总结:

一. HTTP协议的三个特点:

1、无状态协议
2、通过 Internet 发送请求消息和响应消息
3、使用端口接收和发送消息,默认为80端口

二.Cookie和Session有什么区别和联系

区别:
Cookie是保存在用户浏览器端的键值对
Session是保存在服务器端的键值对
联系:
session利用cookie来传递用户的session id号,存取对应的用户信息

三.Cookie和Session的创建和销毁

Cookie创建:
1.创建Cookie对象,New Cookie(String name,String value)
2.设置Cookie的最大生命周期,cookie.setMaxAge(60 * 60 * 24);
3.将创建的Cookie对象添加到响应中,response.addCookie(Cookie cookie)

// 获取Cookie数据
1.获取Cookie数据Cookie[],request.getCookies()

Cookie销毁:
1.Cookie的最大生命周期已到
2.将Cookie的最大生命周期设为0,cookie.setMaxAge(0);

Session创建:
1.创建或者关联一个HttpSession对象,request.getSession(true);
2.在session中添加字段,session.setAttribute(String key, String value);
3.设置最大非活动间隔时间,session.setMaxInactiveInterval(5);

Session会话销毁:
1.获取session后调用session. invalidate()方法
2.访问时间间隔大于最大非活动时间间隔
3.关闭浏览器

四.会话跟踪机制

当用户第一次连接到服务器的时候,服务器为其建立一个Session,
并分配给用户一个唯一的标识Session ID,以后用户每次提交请求的时候,
都要将标识一起提交。服务器根据标识找出特定的Session,用这个Session记录用户的状态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值