本文已参与「新人创作礼」活动,一起开启掘金创作之路。
会话
从用户打开浏览器,访问各个web资源开始,到用户关闭浏览器结束,叫做一个会话。
用户在使用浏览器与服务器进行会话的过程中所产生的数据,程序会将其保存(账号密码等),叫做cookie缓存。
会话方式:
- 客户端会话技术:Cookie----把信息保存在客户端
- 服务器端会话技术:Session----把信息保存在服务器端
Cookie
服务器将Cookie写给客户端
实现原理
基于响应头set-cookie和请求头cookie实现
实现步骤
- 创建Cookie对象(src/cookie/),绑定数据:new Cookie(String name, String value);
- 发送Cookie对象:response.addCookie(Cookie cookie);
- 获取Cookie,拿到数据
- 删除Cookie
public class CookieServlet extends HttpServlet{
@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException{
//创建Cookie 如果没有设置时间的话,关闭浏览器,cookie就被删除
Cookie cookie = new Cookie("name","value");
//在响应之前,设置Cookie存储时间,单位为秒,若要删除cookie信息,将时间设置为0即可
cookie.setMaxAge(60*3)
//发送Cookie
//把Cookie信息写到客户端
response.addCookie(cookie);
/* 如果想要覆盖name,则再定义一个同是name的cookie对象即可:
Cookie cookie2 = new Cookie("name","value2");
response.addCookie(cookie2);*/
//等下一次访问时,就会自动加上Cookie
//获取Cookie数组,通过遍历获取所需的cookie
Cookie[] cookies = request.getCookies();
for(Cookie c : cookies){
System.out.println("name:" + c.getName());
System.out.println("value" + c.getValue());
}
}
}
**注意:**在tomcat 8之前 cookie中不能直接存储中文数据,在tomcat 8之后,cookie支持中文数据,但特殊字符还是不支持,建议使用URL编码存储,URL编码解析。且注意cookie中不能存在空格。
Cookie cookie3 = new Cookie("name", URLEncoder.encode("这里是value","utf-8"));
System.out.println("name :" + URLDecoder.decode(c.getValue(),"utf-8"));
设置cookie的携带路径
默认情况下会在访问创建cookie的web资源相同的路径都携带cookie信息(比如都在src目录下)
同一工程下设置携带路径:
- cookie.setPath("/CookiePro/cookieServlet");//只有访问cookieServlet才携带cookie信息(常用)
- cookie.setPath("/CookiePro");//访问指定的工程时,都会携带cookie信息
- cookie.setPath("/");//访问服务器下部署的所有工程时都会携带cookie
不同工程下设置携带路径:
- setDomain(String path);//如果一级域名相同,那么多个服务器之间cookie可以共享
- setDomain(".baidu.com");//那么tieba.baidu.com和news.baidu,com中cookie可以共享
疑问
每次访问更新时间后不会将此前cookie覆盖导致获取的cookie是最新时间吗?
**回答:**存过后第二次访问才能取
Session
Session技术是将数据存储在服务器端的技术,它会为每个客户端都创建一块内存空间存储客户的数据,客户端需要每次都携带一个标识ID取服务器中寻找属于自己的内存空间。
Session需要借助于Cookie存储客户的唯一性标识SESSIONID
Session在一个Servlet当中存数据,在另一个Servlet当中取数据,其原理是:
- 每一个会话访问服务器时,会给该用户分配他自己对应的存储空间
- 并为创建的存储空间标一个编号:SessionID
- 第一次访问时,会把对应的sessionID以Cookie的形式写给浏览器
- 下次再访问时,会携带sessionID,找到当初创建的那个存储空间
- 最后在对应的存储空间当中取出数据
获取Session对象
//获取当前会话的Session对象
//如果服务器没有该会话的Session对象,会创建一个新的Session返回
//本质上是根据SESSIONID判断客户端是否在服务器上已经存在session
HttpSession session = request.getSession();
session.setAttribute("sessionName", "sessionValue");
//在所有的Servlet都可以拿到session获取数据
//另一个Servlet下↓
HttpSession session = request.getSession();
session.getID();//获取SESSIONID的方法
Object obj = session.getAttribute("sessionName");//获取SESSION中sessionName键对应的的值
/**
*request域对象
*共享数据
*一次请求当中,请求转发过程当中可以共享数据
*session:域对象
*所有的Servlet都可以共享数据
*第二次访问:
*先去从Cookie中获取JSESSIONID
*如果有值,就直接把对应的Session对象拿来使用
*如果没有值,就创建一个新值,并且会把JSESSIONID写到Cookie
**/
Session的生命周期与使用场景
**创建:**第一次执行request.getSession()时创建
销毁:
- 服务器关闭时
- session过期/失效(从最后一次操作结束时起,默认三十分钟)
- 手动销毁----session.invadate
- 浏览器被关闭,session就销毁这句话是不完全正确的
**作用范围:**默认在一次会话中,任何资源共用一个session对象
使用场景:
登陆成功后,把用户信息写到Session中,在另外一个页面当中会判断session中有没有存储用户信息,如果有,就可以访问,没有session,就重新登陆。
在程序内部办到数据的共享
session的特点
- session用于存储一次会话的多次请求的数据,存在服务器端
- session可以存储任意类型,任意大小的数据
session与cookie的区别
- session存储数据在服务器端,cookie在客户端
- session没有数据大小限制,cookie有
- session数据安全,cookie相对不安全