javaweb学习笔记(四):会话管理(1)

版权声明:转载请注明出处: https://blog.csdn.net/qq_34774655/article/details/83278437

目录

会话管理

1.概念

2.cookie技术

2.1 Cookie一般处理流程

2.2 Cookie类


会话管理

1.概念

一次会话: 打开浏览器 -> 访问一些服务器内容 -> 关闭浏览器。(浏览器A给服务器发送请求,访问web程序,该次会话就已经接通,其中不管浏览器发送多少请求,都视为一次会话,直到浏览器关闭,本次会话结束。若此时再打开浏览器B,访问服务器,这是另一个会话,虽然是在同一台电脑,同一个用户在访问,但是,这是两次不同的会话。)

http是无状态的,一次请求结束,连接断开,下次服务器再收到请求,它就不知道这个请求是哪个用户发过来的。当然它知道是哪个客户端地址发过来的,但是对于我们的应用来说,我们是靠用户来管理,而不是靠客户端。所以对我们的应用而言,它是需要有状态管理的,以便服务端能够准确的知道http请求是哪个用户发起的,从而判断他是否有权限继续这个请求。

会话管理: 管理浏览器客户端和服务器端之间会话过程中产生的会话数据。

两种会话技术:

①cookie技术:会话数据保存在浏览器客户端。

②session技术:会话数据保存在服务器端。


2.cookie技术

Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。

一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。

一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。

浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。


2.1 Cookie一般处理流程

1.服务器创建cookie对象,把会话数据存储到cookie对象中。

  Cookie cookie=new Cookie("name","value");

2.服务器发送cookie信息到浏览器

 response.addCookie(cookie); 

(如: set-cookie: name=eric  隐藏发送了一个set-cookie名称的响应头)

3.浏览器得到服务器发送的cookie,然后保存在浏览器端。

4.浏览器在下次访问服务器时,会带着cookie信息

(如:cookie: name=eric  隐藏带着一个叫cookie名称的请求头)

5.服务器接收到浏览器带来的cookie信息

request.getCookies();

2.2 Cookie类

javax.servlet.http.Cookie类:用于存储会话数据

1)构造方法:Cookie(java.lang.String name, java.lang.String value)

2)void setValue(java.lang.String  newValue) 设置cookie值

 java.lang.String   getValue() 取得cookie值

3)java.lang.String getName()   取得cookie名字

4)void setMaxAge(int expiry)    设置cookie的有效时间

int getMaxAge()   取得cookie有效期。

其中,expiry为正整数:表示cookie数据保存浏览器的缓存目录(硬盘中),数值表示保存 的时间。以秒为单位,如24*60*60表示一天。

 负整数:表示cookie数据保存浏览器的内存中。浏览器关闭cookie就丢失了! 即只在一次会话中有效,通常取-1(没有调用本方法,即默认为此)。

 零:表示删除同名的cookie数据。(path必须一致,否则不会删除)

 

 5)void setPath(java.lang.String uri) 设置cookie的有效访问路径

  java.lang.String getPath()   取得cookie的有效访问路径

有效路径指的是cookie的有效路径保存在哪里,那么浏览器在有效路径下访问服务器时就会带着cookie信息,否则不带cookie信息。


例1:验证Cookie类的常用方法及流程

public class CookieDemo1 extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		//1.创建cookie对象
		Cookie cookie =new Cookie("name","hua");
		//设置cookie有效时间
		cookie.setMaxAge(5);
		//2.把数据发送到浏览器(通过响应头发送:set-cookie)
		response.addCookie(cookie);
		//3.接收浏览器发送的cookie信息
		//String name=request.getHeader("cookie");
		Cookie[]  cookies=request.getCookies();
		if(cookies!=null) {
			for(Cookie c:cookies) {
				String name=c.getName();
				String value=c.getValue();
				System.out.println(name+"="+value);
			}
		}else {
			System.out.println("没有cookie数据");
		}
	}
}

例2:使用cookie记录用户上次访问时间

public class HistServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		//获取当前时间
		SimpleDateFormat s=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String curTime=s.format(new Date());
		
		String lastTime=null;
		//取得cookie
		Cookie[] cookies=request.getCookies();
		//首次访问
		if(cookies==null || lastTime==null) {
			response.getWriter().write("你是首次访问,当前时间 为:"+curTime);
			Cookie cookie =new Cookie("lastTime",curTime);
			cookie.setMaxAge(1*24*60*60);//保存一天
			response.addCookie(cookie);
		}
		//已经访问过至少一次
		if(cookies!=null) {
			for(Cookie cookie:cookies) {
				if(cookie.getName().equals("lastTime")){
					lastTime=cookie.getValue();
					response.getWriter().write("欢迎回来,上次访问时间为:"+lastTime+",当前时间为:"+curTime);
					
					cookie.setValue(curTime);
					cookie.setMaxAge(1*24*60*60);//保存一天
					response.addCookie(cookie);
					break;
				}
			}
		}	
	}
}

第一次打开浏览器:

稍等一下,再次刷新:

猜你喜欢

转载自blog.csdn.net/qq_34774655/article/details/83278437