Cookie
Cookie 是服务器通知客户端保存键值对的一种技术
客户端
有了Cookie后,每次请求都发送给服务器
每个Cookie的大小不能超过4kb
1.什么是cookie?
cookie是客户端保存数据的一种技术,而且保存的方式是键值对形式
2.如何去创建cookie,在客户端保存数据
cookie这个对象是servlet的jar包给我们提供的,我们只需要去创建cookie,并且通知浏览器保存cookie就可了
创建cookie对象
Cookie cookie = new Cookie("key","value");
通知浏览器保存cookie
response.addCookie(cookie);
3.cookie的生命周期
cookie默认的生命周期是一个session级别的,是浏览器的开启到关闭
服务器获取Cookie
获取cookie方法
request.getCookies()
package com.os467.cookie;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CookieDemo01 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
addCookie(request,response);
getCookies(request,response);
getCookieFilter(request,response);
}
/**
* 向客户端添加cookie
* @param request
* @param response
*/
public void addCookie(HttpServletRequest request,HttpServletResponse response){
//创建cookie对象
Cookie cookie1 = new Cookie("username","tom");
Cookie cookie2 = new Cookie("password","123");
Cookie cookie3 = new Cookie("address","beijing");
Cookie cookie4 = new Cookie("idCard","123124325");
//通知浏览器保存cookie
response.addCookie(cookie1);
response.addCookie(cookie2);
response.addCookie(cookie3);
response.addCookie(cookie4);
}
/**
* 获取单个cookie的方式,只能通过遍历cookie数组,然后进行过滤
* @param request
* @param response
*/
public void getCookieFilter(HttpServletRequest request,HttpServletResponse response){
//根据请求对象获取客户端的cookie
Cookie[] cookies = request.getCookies();
//遍历cookie数组
for (Cookie cookie : cookies) {
if(cookie.getName().equals("username")){
//设置响应对象支持html文本
response.setContentType("text/html;charset=utf-8");
//cookie.getName()获取cookie的key
//cookie.getValue()获取cookie的value
try {
response.getWriter().print(cookie.getName()+" "+cookie.getValue()+"<br>");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 获取浏览器端所有的cookie
*
* 获取cookie没有提供获取单个cookie的方法,只能获取所有然后再筛选出需要的cookie
* @param request
* @param response
*/
public void getCookies(HttpServletRequest request,HttpServletResponse response){
//根据请求对象获取客户端的cookie
Cookie[] cookies = request.getCookies();
//遍历cookie数组
for (Cookie cookie : cookies) {
//设置响应对象支持html文本
response.setContentType("text/html;charset=utf-8");
//cookie.getName()获取cookie的key
//cookie.getValue()获取cookie的value
try {
response.getWriter().print(cookie.getName()+" "+cookie.getValue()+"<br>");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Cookie值的修改
方案一
1.先创建一个要修改的同名Cookie对象
2.再构造器,同时赋予新的Cookie值
3.调用response.addCookie(Cookie)
方案二
1.先查找到需要修改的Cookie对象
2.调用setValue()方法赋予新的Cookie值
3.调用response.addCookie()通知客户端保存修改
/**
* 修改对象的cookie值
* @param request
* @param response
*/
public void setCookie(HttpServletRequest request,HttpServletResponse response){
//把username的值改成jack
Cookie cookie1 = new Cookie("username", "jack");
//通知浏览器保存cookie
response.addCookie(cookie1);
//将密码改成654321
//先获取浏览器所有的cookie
Cookie[] cookies = request.getCookies();
Cookie c = null;
//遍历cookie
for (Cookie cookie : cookies) {
if (cookie.getName().equals("password")){
cookie.setValue("654321");
c = cookie;
}
}
//通知浏览器保存cookie
response.addCookie(c);
}
封装Cookie工具类
Cookie类无法获取浏览器端单个cookie,每次需要去遍历,因此我们选择把对cookie的操作封装成一个工具类
package com.os467.utils;
import javax.servlet.http.Cookie;
/**
*根据cookie的key来找到某一个具体的cookie,因为api中我们只能获取所有cookie
* 获取单个cookie的话只能通过标识去过滤,这样就很麻烦,所以我们可以封装一个工具类
* 来提高开发速率
*/
public class FindCookieUtils {
//构造方法私有化
private FindCookieUtils(){
}
/**
* 根据key来获取cookie
* @return
*/
public static Cookie findCookie(Cookie[] cookies,String name){
if (cookies == null || cookies.length == 0 || name == null){
return null;
}
//遍历cookie数组
for (Cookie cookie : cookies) {
if (cookie.getName().equals(name)){
return cookie;
}
}
return null;
}
}
Cookie的生命周期
cookie默认的生命周期是一个session级别的,是浏览器的开启到关闭
Cookie生命控制
setMaxAge()
正数,表示在指定的秒数后过期
负数,表示浏览器一关,Cookie就会被删除(默认值是-1)
零,表示马上删除Cookie
设置cookie的生命周期
/**
* 设置cookie的生命周期
* @param request
* @param response
*/
public void setMaxAgeCookie(HttpServletRequest request,HttpServletResponse response){
//1.将所有的cookie的生命周期设置为一年
for (Cookie cookie : request.getCookies()) {
cookie.setMaxAge(60 * 60 * 24 * 365);
//通知浏览器保存cookie
response.addCookie(cookie);
}
//将密码所对应的cookie的生命周期改为一周
Cookie cookie = FindCookieUtils.findCookie(request.getCookies(), "password");
//修改生命周期
cookie.setMaxAge(60 * 60 * 24 * 7);
//通知浏览器保存
response.addCookie(cookie);
}
删除一个具体的cookie
/**
* 删除一个具体的cookie
* @param request
* @param response
*/
public void deleteCookie(HttpServletRequest request,HttpServletResponse response) {
//删除idCard所对应的cookie
Cookie cookie = FindCookieUtils.findCookie(request.getCookies(), "idCard");
cookie.setMaxAge(0);
//通知浏览器保存cookie
response.addCookie(cookie);
}
Session
Session是一个接口(HttpSession)
Session就是会话,它是用来维护一个客户端和服务器之间关联的一种技术
每个客户端都有自己的一个Session会话
Session会话中,我们经常用来保存用户登录之后的信息
session是在服务端保存数据的一种技术,而且session可以关联客户端和服务端
session跟cookie是有关系的
以后会用session来保存用户登录之后的用户信息,我们之前所完成的登录功能是不完整的
前端校验会话中是否有用户数据,如果有,才能登录成功
如何去创建session对象?
创建session对象,需要用到request对象
HttpSession session = request.getSession()
session也可以说是一个域对象,可以存取值,取值范围,是浏览器的开启到关闭
request.getSession()
第一次调用是:创建Session会话
isNew()
判断到底是不是刚创建出来的
getId()
得到Session的会话id值
session对象是一个单例的对象
Session域数据的存取
//存数据
request.getSession().setAttribute("key","value");
//取数据
request.getSession().getAttribute("key");
Session生命周期
Session生命周期控制
public void setMaxInactiveInterval(int interval)
设置Session的超时时间,超过指定的时长,Session就会被销毁
值为正数的时候,设定Session的超时时长,负数表示永不超时
getMaxInactiveInterval()
获取Session的超时时间
invalidate()
让当前Session会话马上超时无效
session默认超时时间是30分钟
设置生命周期与cookie区别:
负数,cookie代表浏览器关闭则删除,session代表永不超时
删除cookie可以设置0,删除session不可以,需要用指定的方法
设置session的超时时间
设置session的超时时间
session.setMaxInactiveInterval(3600 * 24);
通过配置文件设置默认超时时间
xml中配置是按照分钟配置的
<!--配置默认的超时时间-->
<session-config>
<session-timeout>45</session-timeout>
</session-config>
让当前的session立即超时无效
这个方法在以后做注销的时候会用到
session.invalidate();
public class SessionDemo01 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//创建session对象
HttpSession session = request.getSession();
HttpSession session2 = request.getSession();
/*session.setMaxInactiveInterval(3600 * 24);*/
response.getWriter().print("session是否是新创建的:"+session.isNew()+"<br>");
response.getWriter().print("session的会话id值为:"+session.getId()+"<br>");
response.getWriter().print("session对象是否是单例的:"+ (session == session2)+"<br>");
//往session域中存数据
session.setAttribute("key1","value1");
session.setAttribute("key2","value2");
//取出session中的数据
response.getWriter().print("取出session中key1的数据"+session.getAttribute("key1")+"<br>");
response.getWriter().print("取出session中key2的数据"+session.getAttribute("key2")+"<br>");
//获取session超时时间
response.getWriter().print("session默认超时时间"+session.getMaxInactiveInterval()+"<br>");
}
}
session和cookie的关系和区别
session和cookie的关系
cookie保存数据的原理就是通过http协议响应头的方式把数据传递过去
在浏览器访问服务端的时候,假设我们并没有手动的去创建session对象,但是我们在响应头会发现一个现象:会有一个set-cookie : JESSIONID = 74045E2CC5F9FA30EE9CEBE1D092E1CD
JSEEIONID = session的会话id
所以说要想获得会话id,就必须得有session对象
总结:浏览器访问服务端的时候,会自动的去创建session会话id,自动生成会话id,然后在底层通过创建cookie对象的方式将会话id保存下来
Cookie cookie = new Cookie("JESSIONID",session的会话id)
session和cookie的区别
cookie
cookie是客户端保存数据的技术:只能去存放一些最基本的字符串,json串,不能存放java对象
cookie相对来说不安全,因为数据存在浏览器的内存里面,所以可以通过一些途径来获取到这些数据
session
session是服务端保存数据的技术,可以存放的数据类型有很多,String、List、Map、java对象
session相对来说是安全的,但是会占用服务器的资源,cookie是不会占用服务器资源的
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以邮件至 1300452403@qq.com