会话?
什么是会员? 比如你打开一个浏览器,在浏览器中做了很多的事情,使用完之后关闭浏览器。 而这个过程我们叫做一次会话。 有状态会话: 比如你去商场办了一个会员,你怎么向商场证明你是这个商场的会员呢? 你------------>商场 出示会员卡 商场--------->你 在他们的会员系统中查
上面的是现实中的例子,下面我们举个网路中的例子。我们将你比作客户端,将商场比作服务端。
- 服务端会给客户端发一个证件,下次来的时候带上这个证件就可以了,这个证件就是cookie
- 服务端会登记客户端的信息,下次来的时候直接匹配就可以了。
保存会话的两种技术
常见的案例有,目前大部分网站登录功能,比如bilibili,你已经登录过了,则你到bilibili的任何一个页面都不需要重新登录。
Cookie
package com.mrli.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
public class CookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
PrintWriter out = resp.getWriter();
Cookie[] cookies = req.getCookies();
if(cookies!=null){
for (Cookie cookie : cookies) {
if(cookie.getName().equals("lastLocalTime")){
long lastLocalTime = Long.parseLong(cookie.getValue());
Date date = new Date(lastLocalTime);
out.write("您上一次访问的时间是:"+date.toString());
}
}
}else{
out.write("您是第一次访问本站");
}
Cookie cookie = new Cookie("lastLocalTime", System.currentTimeMillis() + "");
cookie.setMaxAge(60*60*24);
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
Cookie的上限
- 一个Cookie只能保存一个信息,键值对
- 一个网站最多向浏览器发送20个Cookie,浏览器最多存300个Cookie
- 一个Cookie大小限制为4kb
删除Cookie
编码解码
URLEncoder.encode();
URLDecoder.decode();
Session
Session是什么?
Session被称为“会话控制”,服务器会为每一个用户(浏览器)创建一个Session对象,Session可以用来保存会话的信息。 只要不关闭浏览器,Session就会一直存在
Session和Cookie的区别
Cookie是将信息保存在浏览器上。(可以保存多个) Session是将信息保存在服务器上。(用于保存重要的信息,但是也不要过多,尽量减少服务器资源的额占用) Session对象是由服务端创建的。
利用Session保存信息
package com.mrli.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
public class SessionDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
PrintWriter out = resp.getWriter();
HttpSession session = req.getSession();
String sessionid = session.getId();
session.setAttribute("mrli",new Person("mrli",19));
if(session.isNew()){
out.write("这个session是新创建的");
}else{
out.write("这个session已经在服务器上存在了,ID:"+sessionid);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
然后我们就可以通过别的网站直接去获取
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
PrintWriter out = resp.getWriter();
HttpSession session = req.getSession();
out.write(String.valueOf((Person)session.getAttribute("mrli")));
删除信息
session.removeAttribute("mrli");
注销Session
第一种方法
session.invalidate();
第二种方法 在web.xml中设置Session的失效时间,但是关闭浏览器还是会被注销
<session-config>
<session-timeout>15</session-timeout>
</session-config>
|