本节概要:
首先,Cookie和Session是一门会话技术。主要是处理浏览器和服务器的一些存储问题而产生的。
会话技术:
Cookie技术:存到客户端
发送cookie
Cookie cookie = new Cookie(name,value)
cookie.setMaxAge(秒)
cookie.setPath()
response.addCookie(cookie)
获得cookie
Cookie[] cookies = request.getCookies();
cookie.getName();
cookie.getValue();
Session技术:存到服务器端 借助cookie存储JSESSIONID
HttpSession session = request.getSession();
setAttribute(name,value);
getAttribute(name);
Cookie
Cookie的创建与发送
其实创建与发送只是两句话的事情。
Cookie cookie = new Cookie("name","aoteman");
response.addCookie(cookie);
这时候只要有浏览器访问我们这个服务器的这个servlet,服务器就会向浏览器传回这个cookie,浏览器就会记下这个cookie。
这是抓包后的结果,其实,流程是这样的。
浏览器第一次发送请求到CookieServlet时,没有带着Cookie。服务器接收到请求,并返回了Cookie,浏览器存储该Cookie,下次发送请求会带着该Cookie。
那么什么时候Cookie被删除呢?
如果没有设置保存时间的话,每次浏览器关闭就删除,而创建的时间就是第一次访问Cookie生成。
Cookie的API使用
Cookie的持久化
如果我们想让浏览器在关闭时还保留Cookie。那我们就需要以下的代码了
// cookie持久化十分钟
cookie.setMaxAge(60*10);
这里的参数其实单位是秒,1秒*60=1分钟*10=10分钟。
但是这个10分钟也只是大约的十分钟而已。
Cookie的携带路径
简单来说,就是我们访问哪些路径时会返回一个Cookie呢?
这里我们要用到的方法是:setPath(String)
// Cookie的携带路径的设置
// 在访问WEB09_Cookie&Session这个项目下都可以
cookie.setPath("/WEB09_Cookie&Session");
// 在访问WEB09_Cookie&Session/cookieServlet这个项目目录下都可以
cookie.setPath("/WEB09_Cookie&Session/cookieServlet");
// 在访问该服务器的任意一个web应用都会响应该cookie
cookie.setPath("/");
这里要抓包测试太多了,我不贴图了。?
另外,默认的不写的话,这个有点难以理解,这里我写一些路径来说明
比如以下路径:
第1个路径:http://localhost:8080/WEB09_Cookie&Session/testServlet1
第2个路径:http://localhost:8080/WEB09_Cookie&Session/dome/cookieServlet
第3个路径:http://localhost:8080/WEB09_Cookie&Session/dome/testServlet
第4个路径:http://localhost:8080/WEB09_Cookie&Session/index.jsp
第5个路径:http://localhost:8080/WEB09_Cookie&Session/wangye/index.jsp
注意:这里我们默认在访问第2个路径时会给浏览器返回cookie,就是说浏览器访问了我们这个servlet就会返回cookie
当我们访问以上这几个路径时,谁会返回cookie呢?
也许你会认为默认不写setPath的话,整个项目都可以。
但其实是第2个路径和第3个路径。
我们默认不写,真正能产生cooike的是第二个路径。
因此,只要是http://localhost:8080/WEB09_Cookie&Session/dome/这个路径下的所有的资源都会返回cookie
第三个路径同样也是在http://localhost:8080/WEB09_Cookie&Session/dome/下的。我们可以理解为兄弟路径都可以!
Cookie的删除
删除其实很简单,我们只需要将同名同路径持久化为0的cookie来进行覆盖就可以了!
服务器获得Cookie
既然我们可以在将Cookie发给浏览器了,那如何接受浏览器发过来的Cookie呢?
这里我们只有一个方法:getCookies();获得所有的Cookie
代码:
//获得浏览器传过来的Cookie
Cookie[] cookies = request.getCookies();
//遍历获得想要的Cookie
for(Cookie cookie : cookies){
String cookieName = cookie.getName();
if("name".equals(cookieName)){
String value = cookie.getValue();
System.out.println(value);
}
}
使用Cookie技术实现记录访问时间
主要是使用了Cookie对数据的存储,并且需要持久化Cookie。
代码挺简单的,我们把判断某个Cookie是否存在封装了一个方法
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
Cookie[] cookies = request.getCookies();
response.setContentType("text/html;charset=utf-8");
String cookieName = "lasttime";
SimpleDateFormat dateF = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
long time = System.currentTimeMillis();
String date = dateF.format(time);
String lasttime = null;
//试图寻找lasttime的cookie,并单独封装一个方法
if(cookies!=null){
lasttime = searchCookie(cookieName, cookies);
}
if(lasttime!=null){
response.getWriter().write("您上次访问时间是:"+lasttime);
}else{
response.getWriter().write("欢迎首次访问!");
}
Cookie cookie = new Cookie("lasttime",date);
cookie.setMaxAge(60*10);
cookie.setPath("/WEB09_Cookie&Session");
response.addCookie(cookie);
}
//查询某个Cookie是否存在
private String searchCookie(String cookieName,Cookie[] cookies){
for(Cookie cookie : cookies){
if(cookieName.equals(cookie.getName())){
return cookie.getValue();
}
}
return null;
}
Session
session其实就是将数据存在服务器端,其实也需要利用到Cookie技术。
Session的获得或者创建
无fuck说。
HttpSession session = request.getSession();
Session的操作
首先,我们要思考一个问题
我们将Session存储到服务器,服务器为我们的浏览器专门分出一片空间,那么应该如何判断那片空间属于我的浏览器呢?
其实,我们在将数据存储在服务器的时候,服务器会传回一个Cookie对象,里边有一个JSESSIONID的键值对,这就是标识每一个浏览器专属Session的一个标志!
因此,如果我们在浏览器上删除了Cookie记录,那么再次访问服务器时,将为浏览器重新分配空间。之前的空间就找不回来了。
Session其实也是一个域对象,也可以使用我们对域对象的一些操作
比如下面这些方法:
session.setAttribute("name", "Jerry");
session.getAttribute("name");
session.removeAttribute("name");
Session生命周期
其实,我们的服务器并非永久的存储一个session的,而是默认的30分钟,我们可以在tomcat/conf/web.xml里看到
也就是说,30分钟session就过期了。那我们怎么算这30分钟呢?
其实时,当我们的页面不进行数据库操作时候就计时,而当我们到了29分钟再次操作数据库时,计时就会重置!
另外,我们可以在我们项目里的web.xml里修改session过期时间
<session-config>
<session-timeout>1</session-timeout>
</session-config>
创建:第一次执行request.getSession()方法时
销毁:
1.服务器非正常关闭
2.session过期/失效 :默认30分钟
3.手动过期session:调用方法 session.invalidate();
范围:
一次会话,也就是说一次会话任何资源公用一个session对象
持久化Session
我们的在上边知道了可以设置session过期时间,但是当我们关闭了浏览器,想重新获取session里的数据时缺拿不到了!
问题就出在,我们只是持久化了Session,而没有持久化Cookie。因为我们在Cookie里存储了Session的钥匙:JSESSIONID.没了这把钥匙,自然是找不到原来的session了!
因此我们持久化Cookie十分钟
Cookie cookie = new Cookie("JSESSIONID",id);
cookie.setPath("/WEB09_Cookie&Session/");
cookie.setMaxAge(10*60);
response.addCookie(cookie);
本节概要:
首先,Cookie和Session是一门会话技术。主要是处理浏览器和服务器的一些存储问题而产生的。
会话技术:
Cookie技术:存到客户端
发送cookie
Cookie cookie = new Cookie(name,value)
cookie.setMaxAge(秒)
cookie.setPath()
response.addCookie(cookie)
获得cookie
Cookie[] cookies = request.getCookies();
cookie.getName();
cookie.getValue();
Session技术:存到服务器端 借助cookie存储JSESSIONID
HttpSession session = request.getSession();
setAttribute(name,value);
getAttribute(name);