Javaweb开发了解前端知识十一、Cookie 和 Session

1、Cookie饼干

1.1、什么是Cookie

1.2Cookie的使用

1.2.1Cookie的创建

1.2.2Cookie的获取

1.2.3Cookie值的修改

1.2.4Cookie生命控制

1.2.5cookie路径Path设置

1.4Cookie用户名免输入

2、Session会话

2.1、什么是Session

2.2Session的使用

2.2.1Session创建和获取

2.2.2Session数据的存取

2.2.3Session 生命周期控制

2.2.6、浏览器和Session关联的技术内幕

1、Cookie饼干

1.1、什么是Cookie

 

Cookie,翻译是小饼的意思。它是一种服务器告诉浏览器以键值对形式存储小量信息的技术。

1.2Cookie的使用

1.2.1Cookie的创建

1.先创建一个Servlet编写创建Cookie的代码,

2.然后打开浏览器访问Servlet程序。

3.按下F12.查看Cookie内容。


1)图解Cookie的创建过程:


2Cookie的创建代码:


/**
 * Cookie的代码
 */
public class CookieServlet extends BaseServlet {
	private static final long serialVersionUID = 1L;

	protected void createCookie(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		// Cookie的创建
		Cookie cookie = new Cookie("cookie-name", "cookie-Value");
		Cookie cookie2 = new Cookie("cookie-name2", "cookie-Value2");

		// 告诉浏览器保存
		response.addCookie(cookie);
		response.addCookie(cookie2);
		response.getWriter().write("已创建Cookie……");
	}
}

记住,访问的时候,一定不是把html的页面托到浏览器中访问,而是在浏览器里输出地址,通过访问Tomcat服务器访问页面。

 

3)浏览器工具--查看结果:

谷歌浏览器,直接按下F12功能键,会弹出调试工具,选择Resource-----Cookies----localhost查看localhost域名下的cookie

1.2.2Cookie的获取

1)图解Cookie的获取过程


2)获取Cookie的代码:


protected void getCookie(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 获取所有cookie对象
		Cookie[] cookies = request.getCookies();
		// 如果没有cookie,则返回null。
		if (cookies != null) {
			// 有cookie则遍历
			for (Cookie cookie : cookies) {
				response.getWriter().write("Cookie名:" + cookie.getName() 
						+ "<br/>Cookie值:" + cookie.getValue() + "<br/><br/>");
			}
		} else {
			response.getWriter().write("没有Cookie");
		}
		
	}

1.2.3Cookie值的修改

1)图解修改Cookie值的过程:


2)修改Cookie值的代码:


	protected void updateCookie(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		// 创建一个已存在key的Cookie对象
		Cookie cookie = new Cookie("cookie-name", null);
		// 修改Cookie的值
		cookie.setValue("this is new value");
		// 通知浏览器保存修改
		response.addCookie(cookie);
		response.getWriter().write("Cookie…已修改值");
	}

1.2.4Cookie生命控制

Cookie对象的.setMaxAge(  ) 方法控制Cookie的存活。

Cookie的默认存活时间(会话)setMaxAge为负数,表示会话级。也就是说浏览器一旦关闭,Cookie就会被删除。

Cookie的删除 setMaxAge 零表示马上删除。表示浏览器一收到响应,马上就会删除Cookie

Cookie的保存    setMaxAge 正数表示多少秒之后删除

 

当我们创建一个新Cookie的时候。Cookie的默认存活时间为会话时间。也就是只要一关浏览器。cookie就会过期,被删除。

当我们调用setMaxAge( 0 ) 为零的时候。表示浏览器一收到响应后,就马上删除Cookie

当我们调用setMaxAge( 正页 ) 的时候,表示Cookie将在多少秒后过期。

1)图解Cookie过期时间被修改的过程:


2)修改Cookie过期时间的代码:


protected void deleteCookie(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 获取Cookie
		Cookie[] cookies = request.getCookies();
		Cookie cookie = null;
		if (cookies != null) {
			// 查找出我们需要修改的Cookie对象
			for (Cookie c : cookies) {
				// 获取键为cookie-name的cookie对象
				if ("cookie-name".equals(c.getName())) {
					cookie = c;
					break;
				}
			}
		}
		if (cookie != null) {
//          负数表示浏览器关闭后删除,正数表示多少秒后删除
//			 设置为零,表示立即删除Cookie
			cookie.setMaxAge(0);
			response.addCookie(cookie);
			response.getWriter().write("删除Cookie……");
		}
		
	}

1.2.5cookie路径Path设置

设置CookiePath路径,只需要调用Cookie对象的setPath方法即可

当我们调用setPath方法设置有效路径为/hello/abc路径

那么下面几个路径能访问到Cookie的是

/hello/abc     能获取Cookie

/hello/xxxx.xxx     不能获取Cookie

/hello/abc/xxx.xxx   能获取Cookie

/hello/abc/a/b/c    能获取Cookie

1)设置Cookie对象Path属性的代码

protected void setPath(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		// 创建一个Cookie对象
		Cookie cookie = new Cookie("cookie-path", "test");
		// 设置Cookie的有效访问路径为/day14/abc/下所有资源
		cookie.setPath(request.getContextPath() + "/abc");
		// 通知浏览器保存修改
		response.addCookie(cookie);
		response.getWriter().write("设置Cookie…的path路径");
	}

1.4Cookie用户名免输入

需求:第一次登录之后,一个星期内免输入用户名登录。

 

1)服务器Servlet的代码

protected void login(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 获取请求参数
		String username = request.getParameter("username");
		String password = request.getParameter("password");

		if ("admin".equals(username) && "admin".equals(password)) {
			// 创建Cookie
			Cookie cookie = new Cookie("username", username);
			// 设置过期时间为一个星期
			cookie.setMaxAge(60 * 60 * 24 * 7);
			// 通知浏览器保存
			response.addCookie(cookie);
			response.getWriter().write("登录成功!");
		} else {
			response.sendRedirect(request.getContextPath() + "/login.jsp");
		}
	}

2WebContent/login.jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="cookieServlet?action=login" method="post">
		用户名:<input name="username" type="text" value="${ cookie.username.value }" /><br /> 
		密码:<input name="password" type="text" value="" /><br /> 
			<input type="submit" value="提 交" />
	</form>
</body>
</html>

1.3Cookie的总结:

创建Cookie

Cookie cookie = new Cookie(key,value); 默认浏览器关闭就会过期

response.addCookie( cookie ); 通知浏览器。一定要调用浏览器才收到

 

获取Cookie request.getCookies(); 获取所有Cookie

 

修改Cookie的值

Cookie cookie = new Cookie(key,null); 只要创建一个已经存在的Cookie

cookie.setValue( Value ); 设置新的值

response.addCookie( cookie ); 通知浏览器修改

 

修改Cookie的有效时间。

setMaxAge( 负数 ) 表示浏览器关闭就会过期

setMaxAge( 0 ) 表示收到响应就会过期

setMaxAge( 正数 ) 表示多少秒后过期

 

修改CookiePath路径

setPath( “/xxxx/xxxx” ) 设置 Cookie的有效访问路径

 

比如设置为/hello/abc,则下面几个路径访问的结果是

/hello/abc     能获取Cookie

/hello/xxxx.xxx     不能获取Cookie

/hello/abc/xxx.xxx   能获取Cookie

/hello/abc/a/b/c    能获取Cookie

2、Session会话

2.1、什么是Session

首先Sessionjsp中九大内置对象之一。

其次Session是一个域对象。

然后Session是在服务器端用来保存用户数据的一种技术并且Session会话技术是基于Cookie实现的。(浏览器关闭,session也将失联)

2.2Session的使用

2.2.1Session创建和获取(id号,是否为新)

request.getSession() 创建或获取Session对象 ( 第一次访问是创建Session对象。之后调用都是获取Session )


1)下面是获取Session和创建Session。以及获取SessionID编号,获取Session是否是新创建的示例代码:


public class SessionServlet extends BaseServlet {
	private static final long serialVersionUID = 1L;

	public SessionServlet() {
	}

	protected void getSession(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println(request.getHeader("Cookie"));
		
		// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
		HttpSession session = request.getSession();
		// 输出会话id号,和是否是新创建
		// session.getId()返回Session的唯一编号
		// session.isNew()返回当前Session是否是刚创建的
		response.getWriter().write(
				"session ID:" + session.getId() + "<br/>是否是新的:" + session.isNew());
	}
}

第一次访问的结果:


之后每次访问的结果:


2.2.2Session数据的存取

Session域对象数据的存取和其他三个域对象PageContextRequestServletContext是一样的。只需要调用下面两个方法。


setAttribute 设置属性

getAttribute 获取属性

编写下面的java代码去访问,就可以在Session域中设置属性,和获取属性。


protected void setAttribute(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
		HttpSession session = request.getSession();
		// 设置数据
		session.setAttribute("abc", "abc value");
		response.getWriter().write("设置属性值成功!");
	}
	
	protected void getAttribute(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
		HttpSession session = request.getSession();
		// 设置数据
		String value = (String) session.getAttribute("abc");
		response.getWriter().write("获取abc的属性值:" + value);
	}

2.2.3Session 生命周期控制

int getMaxInactiveInterval()  获取超时时间。以秒为单位。

setMaxInactiveInterval ( 时间 )  设置用户多长时间没有操作之后就会Session过期。以秒为单位。

如果是正数。表示用户在给定的时间内没有任意操作,Session会话就会过期。

如果是负数。表示Session永不过期。

Session默认存活时间

Session默认的过期时间为30分钟。默认是在tomcatconf目录下web.xml配置文件中(对部署在本服务器下的所有项目而言)。


我们也可以在自己工程的web.xml文件中配置Session会话的超时时间为10分钟。

记住一点,我们在web.xml文件中配置的Session会话超时时间是对(本项目下)所有Session都生效的。

<!-- 设置Session默认的过期时间  -->

<session-config>

<!-- 以分钟为单位。10分钟超时  -->

        <session-timeout>10</session-timeout>

</session-config>


Session在3秒之后超时
		// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
		HttpSession session = request.getSession();
		// 设置过期时间为3秒 
		session.setMaxInactiveInterval(3);
Session在1分钟之后超时
		// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。 
		HttpSession session = request.getSession();
		// 设置过期时间为1分钟
		session.setMaxInactiveInterval(60);
Session在1小时之后超时
		// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
		HttpSession session = request.getSession();
		// 设置过期时间为1小时
		session.setMaxInactiveInterval(60 * 60);
Session在1天之后超时
		// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
		HttpSession session = request.getSession();
		// 设置过期时间为1天
		session.setMaxInactiveInterval(60 * 60 * 24);
Session在1周之后超时
		// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
		HttpSession session = request.getSession();
		// 设置过期时间为1周
		session.setMaxInactiveInterval(60 * 60 * 24 * 7);
Session永远不超时
		// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
		HttpSession session = request.getSession();
		// 设置永远不超时
		session.setMaxInactiveInterval(-1);
Session马上超时(失效)
		// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
		HttpSession session = request.getSession();
		// 让Session对象立即过期
		session.invalidate();

2.2.6、浏览器和Session关联的技术内幕

在前面的演示中我们发现。一旦浏览器关闭之后。我们再去获取Session对象。就会创建了一个新的Session对象。这是怎么回事呢。现在让我们来看一下。这一系列操作过程中的内幕细节


通过上图的分析,我们不难发现。当浏览器关闭之后。只是因为浏览器无法再通知服务器,之前创建的Session的会话id是多少了。所以服务器没办法找到对应的Session对象之后,就以为这是第一次访问服务器。就创建了新的Session对象返回。

Javaweb开发了解前端知识十、EL表达式与JSTL标签库



猜你喜欢

转载自blog.csdn.net/mxcsdn/article/details/80558513