WEB018_Cookie&Session

本节概要:

首先,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);

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值