JavaWeb-4、Cookie&Session
1、会话
会话是指一个终端用户与交互系统进行通讯的过程,比如从输入账户密码进入操作系统到退出操作系统就是一个会话过程。还比如说用户打开一个浏览器,点击了一些超链接,然后关闭浏览器,这个过程就称作会话。
有状态会话:比如说一个客户曾经访问了你这个网页,下次你这个网页知道他曾经来过,这样的过程就是有状态会话。
比如说我们登录个B站,我关闭浏览器再打开B站他依然是登录着的.
那么我怎么证明你来过啊!这里我们主要用到了cookie和session两大技术,下面是关于两种技术比较通俗的解释
cookie:我给你一个通行证,下次你再访问的时候拿着这个通行证来我就知道你曾经来过!通行证就是cookie。
session:我登记你曾经来过,下次来的时候匹配你。
下面我们来分别聊一聊cookie和session。
2、Cookie
Cookie是客户端(一般指浏览器)请求服务器后服务器发给客户端的一个辨认标识,保存在客户端,当客户端再次向服务器发送请求时,会携带着这个辨认标识,服务器就可以通过这个标识来识别客户端的身份或状态等。
我们先来看看cookie的源码。
Cookie的构造方法主要是name和value键值对类型
所以说一个cookie中只能保存一个相关的值。
现在我们来写一个小demo来了解以下cookie类。我们还是创建一个新的servlet类,
public class Cookies extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置编码
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
//拿浏览器中的cookies
Cookie[] cookies = req.getCookies();
if(cookies==null){
System.out.println("这是您第一次访问本站");
}
else {
for (int i = 0; i < cookies.length; i++) {
//拿其中的cookie值
if(cookies[i].getName().equals("lastlogintime")){
long lastlogintime =Long.parseLong(cookies[i].getValue()) ;
Date date = new Date(lastlogintime);
resp.getWriter().println("上次登录的时间是:"+date.toLocaleString());
}
}
}
//把当前事件添加到cookie中
Date date = new Date();
//创建一个新的cookie
Cookie cookie = new Cookie("lastlogintime",String.valueOf(System.currentTimeMillis())
);
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
注册,配置好tomcat后,我们可以发现浏览器确实可以拿到cookies的值
浏览器中确实也有相关的cookie
我们也可以通过setMaxAge()方法来设置cookie到期的时间。
总体来说,cookie现在使用的已经比较少了,但是大家还是要好好理解其中的原理。
3、Session(重要)
啥叫Session啊:
- 浏览器会给每个用户都创建一个独有的Session对象,通过SessionId对session进行识别,然后session中可以保存信息,是保存在服务端上
- 一个session独占一个浏览器,浏览器不关或者Session没有到期,这个session就存在!
下面还是以一个小demo来演示下session在javaweb中的用法。
下面我们写两个servlet,一个负责赋值,一个负责取值
public class SessionServ01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置编码
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//拿session
HttpSession session = req.getSession();
//设置个属性
session.setAttribute("name","dirtylily");
String id = session.getId();
if (session.isNew()) {
resp.getWriter().println("session创建ok,id是"+id);
}
else {
resp.getWriter().println("session已经存在,id是"+id);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class SessionServ2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//拿session
HttpSession session = req.getSession();
//打印其ID和属性
System.out.println(session.getId());
System.out.println(session.getAttribute("name"));
}
}
配置好启动运行一下!首先通过下第一个servlet,之前我测试的时候已经创建了session,我们发现session是这个值。
我们再使用相同浏览器调用下第二个servlet,发现拿的id和属性是一摸一样的
所以我们可以得出一个结论,在同一浏览器上,session是完全可以跨servlet进行操作的。
我们保持现在浏览器不关闭,换另外一个浏览器访问下第一个servlet看看
我们发下sessionid完全不一样,所以在不同浏览器上,session值是不一样的。
如何使session失效呢?
- 关闭浏览器就可
- 使用invalidate方法也是可以使session失效
- 在webxml里的sessionconfig标签中设置session到期时间,session到期后会自动消失创建新的session
Session和Cookie的区别
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。