1. Cookie
1什么是cookie
Cookie就是浏览器写在你本地计算机上的一个一个文本文件,大小不能超过4k
1.1.1. cookie类的学习
1. 与 Cookie 操作相关的方法:
1>public Cookie(String name,String value)
构造方法,用来创建一个名字为name和值为value的cookie对象
Ø setValue()/getValue() 修改 Cookie 的值,得到 Cookie 中指定的值
Ø getName() 得到 Cookie 的名字
Ø setMaxAge()/getMaxAge() 设置 Cookie 过期的时间,单位是秒
Ø setPath()/getPath() 用来设置 Cookie 的保存路径,这只是一个虚拟路径
2>response接口
AddCookie()把cookie对象写到浏览器
原理:添加了一个set-cookie的响应头信息
3>request接口
Cookie[]getCookies()得到浏览器发送回来的cookie数组
2. Cookie 的写入:
演示:在 Servlet 中创建一个Cookie("name","admin"),使用 addCookie()添加到浏览器端
注意:在默认的情况下,Cookie是不保存的。当浏览器关闭,Cookie 就消失了。
1.1.2. 增加cookie
public class AddCookieServlet extends HttpServlet {
/** * Get method */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //增加cookie //原理,服务器产生cookie,通过response将cookie响应到浏览器,浏览器存储cookie到本地缓存目录 //1.创建cookie Cookie cookie = new Cookie("name", "admin"); //1.1 设置cookie的有效期。cookie的默认有效期是浏览器关闭,不会产生文本小文件,因为cookie数据在浏览器内存中。如果想产生文本小文件,必须设置有效期 cookie.setMaxAge(60*60*24*7);//单位秒,7天 //1.2 浏览器默认每次请求服务器都携带cookie到服务器,这样不好,因为只有需要读取cookie的服务器资源才读取cookie,其他资源不要读取 //设置cookie的有效路径解决,有效路径就是指定服务器特定资源才可以读取cookie数据,这样浏览器只会在访问特定的资源才会携带cookie到服务器 //cookie的默认有效路径是当前工程名字,所以浏览器只要访问当前服务器和当前的工程名字都会携带cookie到服务器 //要求:只允许GetCookieServlet读取cookie数据 //cookie.setPath(路径);路径格式:/项目名字/资源路径,浏览访问服务器这个资源路径的时候才会携带cookie cookie.setPath(request.getContextPath()+"/getCookie"); //2.将cookie写入到浏览器,response响应cookie数据是通过响应头传递给浏览器 //Set-Cookie: name=admin response.addCookie(cookie); //输出写入成功 response.getOutputStream().write("cookie写入浏览器成功".getBytes()); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } |
1.1.3. 查询cookie
public class GetCookieServlet extends HttpServlet {
/** * Get method */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//查询cookie,cookie会通过请求头数据传递给服务器,请求数据格式:Cookie: name=admin //获取cookie数据2个方法 //方法1:request.getHeader("Cookie") //方法2:cookie的获取已经被request封装好了,可以直接获取当前网站所有cookie对象 Cookie[] cookies = request.getCookies(); //打印cookie中存储的name if(cookies!=null){ for (Cookie cookie : cookies) { if(cookie.getName().equals("name")){ //cookie.getName()获取cookie里面存储的键 //cookie.getValue()获取cookie里面存储的值 String value = cookie.getValue(); //打印value response.getWriter().write(value); } } }
}
|
1.1.4. 删除cookie
1. 手动清除浏览器缓存文件
2. 服务器创建一个一模一样的cookie(name和path要一样),value设置null或“”空字符串,有效期设置为0,让cookie为默认有效期。这样就会新创建的cookie会覆盖客户端一样的cookie文件。‘
注意:
浏览器与服务器传输中文都要经过url编码的,cookie的数据是通过请求头与响应头来传递的,所以在请求头与响应头不会主动url编码和url解码需要我们手动来完成
一般没有在请求头与响应头传输中文的需求。
代码
cookie写入的时候需要手动进行url编码
URLDecoder.decode(Stringstr,"utf-8");
cookie读取的时候需要手动进行url解码
URLEncoder.encode(String str,"utf-8");
1.2. cookie的生命周期
默认的生命周期为,服务器创建并且输入给浏览器,浏览器关闭cookie失效
设置生命周期:通过setMaxAge()设置有效期
1.3. 总结
服务器端生成cookie数据,通过响应头传给浏览器,在浏览器本地生成cookie的文本文件最大为4k。
浏览器每次请求都会携带与cookie有效路径一样的cookie数据通过请求头的带到服务器端。
Cookie 存储在客户端,对于安全性来说是不安全的,对于存储一些重要的数据必要时进行加密处理。
2. Session
2.1. 会话Session概述
1.什么是会话:
从用户打开浏览器开始访问网站到关闭浏览器窗口时,我们就认为浏览器与服务器进行了一次会话。会话提供了一种方法,它可以让服务器可以识别多次请求或访问服务器的同一个用户,并且服务器会存储有关该用户的信息。会话在指定的时间段内有效。
2.2. session技术特点
1> 运行在服务端,由服务器为每个浏览器创建单独的存储空间对象,称为会话对象。
2> 每一个用户都有自己的会话对象,不同的浏览器代表不同的用户。
3> 会话对象是一个域对象,主要用于存储每个用户自己的数据,不同的用户之间数据不能共享。
2.3. session的使用
1、会话的使用
1>由服务器创建,在用户第一次访问服务器的时候会创建一个会话,调用下面的方法创建同一个用户每次访问都是同一个会话。
2>创建 Session 对象的方法:HttpSession request.getSession()
3> 不同的浏览器得到的会话对象是不同的。注:同一个浏览器不同的标签页,是同一个会话。
2.4. HttpSession 类中的方法:
session 也是一个域对象,用来保存不同用户的数据。
●域范围的大小:
request(一次请求) < session(一次会话内) <servletContext(整个应用程序范围内)
Ø void setAttribute(String name, Object value) 向会话中保存数据
Ø void removeAttribute(String name) 从会话中删除指定的数据
Ø Object getAttribute(String name) 从会话中得到指定的数据
Ø String getId() 得到会话的 ID,一个 32 位的十六进制数,在服务上唯一。
1、 session 域对象演示
2.4.1. session写入数据
public void doGet(HttpServletRequest request,HttpServletResponse response)
throwsServletException, IOException {
//创建 Session 对象的方法: HttpSessionrequest.getSession()
//session对象的方法
// void setAttribute(String name, Object value) 向会话中保存数据
// void removeAttribute(String name) 从会话中删除指定的数据
// Object getAttribute(String name) 从会话中得到指定的数据
// String getId() 得到会话的 ID,一个 32 位的十六进制数,在服务上唯一。
//session域对象的作用
// 作用域,一次会话内,默认有效期
// session的数据是存储在服务器内存里面
//1.创建session对象
HttpSession session =request.getSession();
//2.往session写入数据
session.setAttribute("loginUser","admin");
}
2.4.2. 读取session数据
public void doGet(HttpServletRequest request, HttpServletResponseresponse)
throwsServletException, IOException {
//获取session域对象里面的数据,loginUser数据
//1.获取session对象
HttpSession session = request.getSession();
//2.读取session中的loginUser
Object object = session.getAttribute("loginUser");
if(object!=null){
response.getWriter().write(object.toString());
}
}
2.4.3. 演示不同浏览器获得不同的session对象
publicvoid doGet(HttpServletRequestrequest, HttpServletResponse response)
throwsServletException, IOException {
//session对象的方法String getId() 得到会话的ID,一个 32 位的十六进制数,在服务上唯一。
//sessionid是会话对象的唯一标识符
//演示不同浏览器获得不同的session对象
//不同浏览器输出sessionid不一样,就说明不同浏览器获得的session对象不同
//1.获取session对象
HttpSession session =request.getSession();
//2.输出session的id
response.getWriter().write("sessionid="+session.getId());
//演示效果得出,不同浏览器获得的会话对象不同。
}
思考:服务器是通过什么识别不同的浏览器的呢?
服务器为不同的浏览器创建了不同session对象。服务器是怎么识别不同浏览器?
2.5. session运行原理
1、当用户第一次访问服务器,服务器运行request.getSession()服务器会创建一个新存储session存储空间,会将session写入到cookie中Cookie cookin=new Cookie(“JSESSIONID”,sessionid);cookie默认有效性为当浏览器关闭时cookie失效。
2、当用户第二次访问服务器,服务器运行request.getSession()时,服务器会获取请求数据中的cookie的JESSIONID,服务器会更具sessionid去服务器内存去找session对象返回,所以第二次访问的sessionid与第一次的session是相等的,没有再次写入cookie。
3、关闭了浏览器,已有的cookie已经过期,服务器无法获取到cookie中的sessionid,所以服务器又创建了新的session对象,产生了新的sessionid。
总结:
Session技术是依赖或基于cookie技术的
用户第一次访问没有cookie,所以服务器就创建session同时将sessionid写入到cookie中
当用户第二次访问时,服务器会通过请求头中去找到cookie-jsessionid,就可以返回已有的session对象。
2.6. session有效性
Session的有效期是在一次会话内,关闭了浏览器session就没用了,但是session对象依然储存在服务器内存中,session对象并没有销毁。
默认的会话时间是 30 分钟(服务器创建一个session对象,30分钟后会销毁这个对象。超过30分钟浏览器没有关闭,浏览器访问服务器,服务器会产生一个新的session对象。)
2.7. 如何改变会话销毁时间
方式一(重要):
1). 通过 web.xml 中的配置
<!--配置会话的时间,以分钟为单位-->
<session-config>
<session-timeout>1</session-timeout>
</session-config>
2). session-timeout 的解释:
如果设置为 0 或负数,则会话不过期,但受限于服务器的内存空间。
3). 演示:在 web.xml 中设置会话超时的时间
a. 不设置参数;
b. 将参数的值设置为 1 分
4). 示例:设置 web.xml 的会话配置,并且在代码中设置会话过期的时间,以哪个为准?
就近原理,以代码为准。
注意:一般没有人会去更改session默认30分钟有效期。
3. 方式二:会话立刻失效(最有用)
session.invalidate();