目录
前言:http协议是一种无状态的协议,它不记录任何客户端相关信息
会话技术
从打开浏览器访问某个站点,到关闭这个浏览器的整个过程,就是一次会话。会话技术就是记录这次会话过程中客户端的状态以及数据
常用的两个会话技术Session 和 Cookie
Session
Session:存储在服务器。安全性好,但是增加服务器压力。
Session概述
Session 技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间存储客户的数据,但客户端需要每次都携带一个表示ID去服务器中寻找属于自己的内存空间。所以说Session的实现是基于Cookie,Session需要借助Cookie存储客户的唯一标识JSESSIONID
操作Session(API)
HttpSession session = request.getSession();
此方法会获得专属于当前会话的Session对象,如果服务器端没有该会话的Session对象会创建一个新的Session返回,如果已经有了属于该会话的Session直接将已有的Session返回(实质就是根据JSESSIONID判断该客户端是否在服务器上已经存在session)
getMaxInactiveInterval()
获取Session 的有效时间,单位为秒
//先实例化session对象
HttpSession session = req.getSession();
//查看Session 的有效时间
session.getMaxInactiveInterval();
invalidate()
使当前 Session 失效,如退出登录时调用
//先实例化session对象
HttpSession session = req.getSession();
//使当前 Session 失效
session.invalidate();
setMaxInactiveInterval(int seconds)
设置 Session 的有效时间,单位为秒
//先实例化session对象
HttpSession session = req.getSession();
//设置7天后过期——免登陆理念
session.setMaxInactiveInterval(7*24*60*60);
getId()
用于获取 session对象的ID
//先实例化session对象
HttpSession session = req.getSession();
//使用getId获取到ID,打印
System.out.println("SessionId="+session.getId());
isNew()
判断当前会话是否是新建的会话
//Session对象实例化
HttpSession session = req.getSession();
//判断当前会话是否为新建会话,true/false
System.out.println(session.isNew());
removeAttribute(String name)
根据键从session中移除某个数据
//session实例化
HttpSession session = req.getSession();
//向session存键值对name=zhangsan
session.setAttribute("name","zhangsan");
//移除键为name的数据,键值对name=zhangsan
session.removeAttribute("name");
setAttribute(String name,Object value)
用于以键值对形式向session中存入数据
@WebServlet("/session")
public class Session extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
//session对象实例化,当cookie中没有对应的JESSESSIONID,就会创建实例
HttpSession session = req.getSession();
//isNew()方法能告诉你当前会话是否是新建的会话
System.out.println(session.isNew());
//getId()方法获取到SessionId打印
System.out.println("SessionId="+session.getId());
//将键值对保存到服务器
session.setAttribute("name","zhangsan");
}
}
getAttribute(String name)
从session中获取指定键的值
@WebServlet("/getSession")
public class GetSessionServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//session对象实例化,当cookie中没有对应的JESSESSIONID,就会创建实例
HttpSession session = req.getSession();
//创建name对象使用session.getAttribute()方法获取到保存在服务器中对应name的值
Object name = session.getAttribute("name");
//处理乱码
resp.setContentType("text/html;charset=utf-8");
//打印值
resp.getWriter().print("name="+name);
}
}
Cookie
Cookie:存储在客户端本地(浏览器),减少服务器端的存储压力,安全性较差,客户端可以清楚Cookie。
Cookie概述
- Cookie 是Web 服务器在 HTTP 响应信息中附带传送给客户端浏览器的一段数据。一旦浏览器保存了这段数据,那么在以后每次访问该Web 服务器时,都会在 HTTP 请求中将这段数据带给 Web 服务器
- Cookie 是最先由 Web 服务器发出的,是否发送Cookie 和发送 Cookie的具体内容,完全由服务器端程序来决定,但是Cookie数据是存储在客户端
操作Cookie (API)
addCookie()
添加Cookie
//创建Cookie对象,键值对
Cookie cookie = new Cookie(“goods”, “phone”);
//将Cookie添加到浏览器对象
resp.addCookie(cookie);
@WebServlet("/addCookie")
public class AddCookieServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建Cookie对象,键值对
Cookie cookie = new Cookie("goods", "phone");
//将Cookie添加到浏览器对象
resp.addCookie(cookie);
//处理乱码
resp.setContentType("text/html;charset=utf-8");
//自定义反馈信息
resp.getWriter().append("添加成功");
}
}
getCookie()
获取Cookie
getName方法用于获取Cookie的名称 getValue方法用于获取Cookie的值
@WebServlet("/getCookie")
public class GetCookieServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
//获取全部Cookie
Cookie[] cookies = req.getCookies();
//遍历打印所有cookie键值对
if(cookies != null) {
for(int i=0; i<=cookies.length; i++) {
//getName方法用于获取Cookie的名称
String name = cookies[i].getName();
//getValue方法用于获取Cookie的值
String value = cookies[i].getValue();
resp.getWriter().append(name+":"+value);
}
}
}
}
setMaxAge()
设置 Cookie的有效时间,单位为秒
//实例化Cookie
Cookie cookie = new Cookie("name","张三");
//留存7天
cookie.setMaxAge(7*24*60*60);