1.cookie技术
认识Cookie(servlet)
概念:
在程序中 cookie 就是保存在客户端的少量数据,由服务器下发。浏览器的机制是,每次访问某个网站的时候就会把这个网站中所有的cookie自动上传。
(1) 读取cookie
Cookie cks[] = request.getCookies();
if (cks != null) {
for (Cookie cookie : cks) {
System.out.println(cookie.getName() + "-->" + cookie.getValue());
}
}
(2) 构建cookie对象
Cookie c = new Cookie("date", new SimpleDateFormat("yyyyMMddHH:mm:ss").format(new Date()));
<1>存活时间
c.setMaxAge(60 * 60 * 24);
A.如果maxAge为负数,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效
Cookie默认的maxAge值为-1
B.如果maxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie的方法,因此通过设置该Cookie即时失效实现删除Cookie的效果。失效的Cookie会被浏览器从Cookie文件或者内存中删除
C.ck.setMaxAge(数字);//设置cookie的存活时间 单位为秒(Second)
// 什么路径下访问,cookie每次会被浏览器自动携带到服务器上
// 在服务器的什么路径下可以访问到当前的cookie
<3>作用域
c.setDomain("/");
<2>路径
c.setPath("/");
// 向客户端下发cookie
response.addCookie(c);// 必须要有,否则cookie只存在于服务器内存
创建Cookie
<%@ page language ="java" pageEncoding="UTF-8"%>
<%
Cookie cookie=new Cookie("UserName","Tom");//创建对象
cookie.setMaxAge(60*10);//设置存活时间
response.addCookie(cookie);//将Cookie发送给客户端
%>
读取Cookie
<%@ page language="java" pageEncoding="UTF-8"%>
<%
Cookie [ ] cookies=request.getCookies();
if(cookies!=null){
for(int i=0;i<cookies.length;i++){
Cookie cookie=cookies[ i];
if("UserName".equals(cookie.getName())){
out.print(cookie.getValue());
break;
}
}
}
%>
2.session技术
session与cookie相反,session是存储在服务器端的,session理论上可以存储任意java对象
session的获取
HttpSession session=request.getSession();
session的读取数据
session.setAttribute("unameabc", uname);
session.getAttribute("unameabc");
session原理
session是基于cookie的。当客户端向服务器端发送请求之后,服务器端获得session的时候,机制是如此的:服务器端会根据客户端的cookie name JSESSIONID获取服务器对应的 session对象,如果没有找到,则创建一个session,并且创建一个JSESSIONID,且将JSESSIONID这个cookie和值下发给客户端。
当客户端下一次请求服务器的时候,客户端会自动上传JSESSIONID这个cookie对象。服务器根据JSESSIONID对应的值找到存储再服务器端内存中的session对象。继而实现会话跟踪。
总之:session是保存再服务端的数据,它是基于cookie技术的。
session是保存再服务器端内存中的数据,session的本质是通过map集合对数据进行管理。
session如果长久驻留内存,则会引发内存泄漏的风险。
在servlet中只要获取了session
HttpSession session = request.getSession();
如果客户端有对应的session,则直接返回对应的session。
否则会创建一个新的session,并且下发sessionid值,给一个叫做JSESSIONID的cookie 值就是 session的id。
以后客户端cookie JSESSIONID 与服务器 session进行查找。
因为session是在服务器端内存中的,所以谨慎操作session,因为大数据量如果存放在session中会导致内存溢出。
session的失效方式:
1.浏览器关闭;
2.服务器关闭;
3.session失效时间设置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<display-name>test</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<session-config>
<session-timeout>20</session-timeout>
//20单位分钟,设定session的请求最大间隔为20分钟,如果调用session对象的setMaxInterval方法来设定session请求间隔大小,那么将覆盖xml配置的时间
</session-config>
</web-app>
4.杀会话:
session.invalidate()是杀掉会话
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%
String sessionId=session.getId();
//获得当前session的sessionID
out.print("sessionId:"+sessionId+"<br/>);
if(session.isNew()){
//判断当前session是否是一个新的session
out.print("这是一个新的session");
}else{
out.print("这是一个老的session");
}
Date createDate= new Date(session.getCreationTime());
//获得当前session创建时间
Date lastAccessDate=new Date(session.getlastAccessedTime());
//获得客户端最后一次请求服务器的时间
out.print("最后访问的时间为:"+lastAccessDate.toString()+"");
out.print("session 最大请求间隔时间:"+session.getMaxInactiveInterval()+"");
String name=(String)session.getAttribute("name");
//根据key从session中获取对象
session.setAttribute("name","Tom");//存储对象
session.removeAttribute("name");//删除对象
session.invalidate();//强制session过期
%>