会话管理(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记录用户的状态