什么是Cookie(某些网站用来免登陆)
- Cookie是在浏览器访问Web服务器的某个资源时,由Web服务器在HTTP响应消息头中附带传送给浏览器的一小段数据。
- 一旦Web浏览器保存了某个Cookie,那么它在以后每次访问该Web服务器时,都应在HTTP请求头中将这个Cookie回传给Web服务器。
- 一个Cookie主要由标识该信息的名称(name)和值(value)组成。
Cookie原理图:
创建Cookie:
public void doPost(HttpServletRequest req,HttpServletResponse resp){
//创建Cookie
Cookie ck=new Cookie("code", code);
ck.setPath("/webs");//设置Cookie的路径
ck.setMaxAge(-1);//内存存储,取值有三种:>0有效期,单位秒;=0浏览器关闭;<0内存存储,默认-1
resp.addCookie(ck);//添加到response对象中,响应时发送给客户端
//注意:有效路径: 当前访问资源的上一级目录,不带主机名
}
从chrome浏览器查看cookie信息:chrome://settings/content/cookies
获取Cookie:
//获取所有的Cookie
Cookie[] cks=request.getCookies();
//遍历Cookie
for(Cookie ck:cks){
//检索出自己的Cookie
if(ck.getName().equals("code"))
{
//记录Cookie的值
code=ck.getValue();
break;
}
}
修改Cookie:只需要保证Cookie的名和路径保持一致即可修改。
//修改Cookie
Cookie ck=new Cookie("code", code);
ck.setPath("/webs");//设置Cookie的路径
ck.setMaxAge(-1);//内存存储,取值有三种:>0有效期,单位秒;=0失效;<0内存存储
response.addCookie(ck);//让浏览器添加Cookie
注意:如果改变cookie的name和有效路径会新建cookie, 而改变cookie值、有效期会覆盖原有cookie
Cookie的优缺点
优点:
- 可配置到期规则。
- 简单性:Cookie 是一种基于文本的轻量结构,包含简单的键值对。
- 数据持久性:Cookie默认在过期之前是可以一直存在客户端浏览器上的。
缺点:
- 大小受到限制:大多数浏览器对 Cookie 的大小有 4K、8K字节的限制。
- 用户配置为禁用:有些用户禁用了浏览器或客户端设备接收 Cookie 的能力,因此限制了这一功能;把数据放在了客户端,一旦请除浏览器数据将无法使用。
- 潜在的安全风险:Cookie 可能会被篡改。会对安全性造成潜在风险或者导致依赖于Cookie 的应用程序失败。
什么是Session?
Session概述(一次会话)
- Session用于记录用户的状态。Session指的是在一段时间内,单个客户端与Web服务器的一连串相关的交互过程。
- 在一个Session中,客户可能会多次请求访问同一个资源,也有可能请求访问各种不同的服务器资源。
Session原理
- 服务器会为每一次会话分配一个Session对象
- 同一个浏览器发起的多次请求,同属于一次会话(Session)
- 首次使用到Session时,服务器会自动创建Session,并创建Cookie存储SessionId发送回客户端
- 注意:session是由服务端创建的。
Session使用
Session作用域:拥有存储数据的空间,作用范围是一次会话有效。
- 一次会话是使用同一浏览器发送的多次请求。一旦浏览器关闭,则结束会话
- 可以将数据存入Session中,在一次会话的任意位置进行获取
- 可传递任何数据(基本数据类型、对象、集合、数组)
获取Session
session是服务器端自动创建的,通过request对象获取
//获取Session对象
HttpSession session=request.getSession();
System.out.println("Id:"+session.getId());//唯一标记,
注意:两次会话是否是同一个session;服务器如何设置sessionId,下次访问cookie的时候或携带sessionId。
Session保存、获取和移除数据
setAttribute(属性名,Object)保存数据到session中;
getAttribute(属性名);获取session中数据;
removeAttribute(属性名);从session中删除数据
session.setAttribute("key",value);//以键值对形式存储在session作用域中。
session.getAttribute("key");//通过String类型的key访问Object类型的value
session.removeAttribute("key");//通过键移除session作用域中的值
Session与Request应用区别
- request是一次请求有效,请求改变,则request改变
- session是一次会话有效,浏览器改变,则session改变
Session应用
package com.qf.sessions;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(name = "SessionServlet",value = "/ss")
public class SessionServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.通过request对象获取Session对象
HttpSession session = request.getSession();
//2.使用session保存数据
session.setAttribute("username","gavin");
request.setAttribute("password","123456");
response.sendRedirect("/WebProject_war_exploded/getValue");
System.out.println(session.getId());
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
GetValueServlet.java
package com.qf.sessions;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(name = "GetValueServlet",value = "/getValue")
public class GetValueServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.通过request获取session对象
HttpSession session = request.getSession();
String password = (String)request.getAttribute("password");
String s = (String) session.getAttribute("username");
System.out.println("从session中获得了:"+s);
System.out.println("从reqeust中获得了:"+password);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
Session的生命周期
开始:第一次使用到Session的请求产生,则创建Session
结束:
- 浏览器关闭,则失效
- Session超时,则失效
- session.setMaxInactiveInterval(seconds);//设置最大有效时间(单位:秒);默认时间是30分钟,在tomcat中的web.xml文件中设置。
- 手工销毁,则失效
- session.invalidate();//登录退出、注销
Session失效
session.setMaxInactiveInterval(60*60);//设置session最大有效期为一小时
session.invalidate();//手工销毁