Cookie
服务器通知客户端保存键值对的一种技术。客户端有了 Cookie 后,每次请求都发送给服务器。每个 Cookie 的大小不能超过 4kb
//cookie的创建
protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建cookie对象
Cookie cookie = new Cookie("k1", "v1");
//通知客户端保存cookie 通过响应头set-cookie
//客户端收到响应后发现set-cookie响应头 就看有没有创建cookie 有就修改 没有就新建
resp.addCookie(cookie);
resp.getWriter().write("cookie创建成功");
}
//服务器获取cookie
Cookie[] cookies=req.getCookies(); //获取全部cookie
for (Cookie cookie : cookies) { //遍历查找某一个cookie
if(name.equals(cookie.getName())){
return cookie;
}
}
cookie值的修改
protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//法一
//1 先创建一个要修改的同名(指的就是 key)的 Cookie 对象
//2 在构造器,同时赋于新的 Cookie 值。
Cookie cookie = new Cookie("k1", "nv1");
//3 调用 response.addCookie( Cookie );
resp.addCookie(cookie);
//法二
//1 先查找到需要修改的 Cookie 对象
Cookie cookie1 = CookieUtils.findCookie("k2", req.getCookies());
if(cookie1!=null){
//2 调用 setValue()方法赋于新的 Cookie 值。
cookie1.setValue("nv2");
//3 调用 response.addCookie()通知客户端保存修改
resp.addCookie(cookie1);
}
}
Cookie的生命控制
Cookie 的生命控制指的是如何管理 Cookie 什么时候被销毁(删除)
protected void cookieAge(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("d1", "vd1");
cookie.setMaxAge(-1); //默认 -1 表示浏览器以关cookie就会被删除
// 0 表示马上删除 Cookie
// 正数 表示在指定的秒数后过期
resp.addCookie(cookie);
}
Cookie 有效路径 Path 的设置
Cookie 的 path 属性可以有效的过滤哪些 Cookie 可以发送给服务器,哪些不发
path 属性是通过请求的地址来进行有效的过滤
protected void pathCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie = new Cookie("p1", "p1");
//getContextPath 得到工程路径
//满足如下设置的路径才会显示cookie 达到一个过滤效果
cookie.setPath(request.getContextPath()+"/abc");
response.addCookie(cookie);
response.getWriter().write("cookie path成功");
}
Cookie实现免用户名和密码登录(保存在客户端)
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
Cookie cookie = new Cookie("username", username); //把用户名放入cookie中
cookie.setMaxAge(3600); //设置保存时间
//通知客户端保存cookie
response.addCookie(cookie);
}
Session会话
Session 就一个接口(HttpSession。它是用来维护一个客户端和服务器之间关联的一种技术。每个客户端都有自己的一个 Session 会话,Session 会话中,经常用来保存用户登录之后的信息(保存在服务器端)
req.getSession():第一次调用是创建session会话,之后调用都是获取前面创建好的session会话对象
protected void createSession(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建和获取session会话对象
HttpSession session = req.getSession();
//判断当前session会话是否是新创建出来的
boolean aNew = session.isNew();
//获取session会话的唯一标识
String id = session.getId();
resp.getWriter().write(id+"<br/>");
resp.getWriter().write(""+aNew);
}
Session 域数据的存取
//往 Session 中保存数
req.getSession().setAttribute("key1", "value1");
// 获取 Session 域中的数据
Object attribute = req.getSession().getAttribute("key1");
Session 生命周期控制
//可在web.xml 中自定义设置session的超时时长
<session-config>
<session-timeout>20</session-timeout>
</session-config>
setMaxInactiveInterval(int interval) 单独设置个别Session 的超时时间(以秒为单位),超过指定的时长,Session 就会被销毁;interval值为正数的时候,设定 Session 的超时时长,负数表示永不超时(极少使用)
getMaxInactiveInterval()获取 Session 的超时时间
invalidate() 让当前 Session 会话马上超时无效。
注:session超时指的是,客户端两次请求的最大间隔时长
浏览器和session之间的关联
客户端在没有cookie情况下向服务器发起请求,服务器会创建一个session会话对象。服务器每次创建session会话时,都会创建一个cookie对象(JSESSIONID),用来存储新创建出来的session对象的id值
req.getSession()通过cookie中的id值找到自己之前创建好的session对象,并返回;
注:Session 技术,底层其实是基于 Cookie 技术来实现的。所以每次关闭浏览器session会话就会没有,是因为底层的cookie对象被删除了