java EE笔记(五) Cookie和Session

1回顾: HttpServletRequest对象的常用方法: 1).设置请求编码:
setCharacterEncoding(“UTF-8“); 2).获取一个请求参数的值: getParameter(“请求参数名”)
3).获取一组请求参数的值:getParameterValues(“请求参数名”),针对checkbox 4).请求转发:
getRequestDispatcher(String path).forward(request,response);
5).获取请求头的值:getHeader(“请求头的名称”); HttpServletResponse对象的常用方法:
1).设置响应的类型: setContentType(“text/html”); 2).设置响应的编码:
setCharacterEncoding(“UTF-8“);
3)设置响应类型和编码:setContentType(“text/html;charset=UTF-8”);
4).重定向:sendRedirect(String path); 请求转发和重定向的区别:
1)请求转发的过程中,地址栏上的url不变(还是第一次请求的url),只有1个请求; 重定向的过程中,url会变化,产生了新的请求
2).请求转发只能跳转到服务器内部的资源,而重定向可以访问外部资源

会话概念:浏览器和服务器的一次完整通信过程,包含多次请求和响应,当关闭浏览器时,会话就结束了。
会话技术:实现在多个请求之间共享数据的技术,分为session和cookie.

1.Cookie

1.1 服务器怎么将Cookie发送给浏览器
1)服务器端创建Cookie
Cookie cookie=new Cooke(String name,String value);
2) 服务器将Cookie发送给浏览器,就是将Cookie添加到响应头中

response.addCookie(cookie);

此时,响应头中会有set-Cookie头字段,值就是cookie,每个Cookie都是保存在set-Cookie中的
Set-Cookie: cookie名=cookie值

1.2 服务器如何读取(接收)浏览器携带的Cookie
浏览器第2次访问服务器时,就带着Cookie过去,COokie就在请求头中
在这里插入图片描述
在这里插入图片描述
1.3 设置Cookie有效时间
setMaxAge(int sec):设置以秒为单位的时间,超过了这个时间后会自动销毁Cookie

1.4 设置Cookie有效路径
setPath(String path):只有当访问path路径下的资源时,才会带着Cookie,此时就可以读取Cookie的数据
通常设置有效路径为web应用根路径, 表示当前web应用下的资源可以访问Cookie
cookie.setPath(request.getContextPath() );
在这里插入图片描述
1.5 Cookie的问题
1.Cookie是保存在客户端的,如果是会话级别的Cookie,那么它存在浏览器的内存中,关闭浏览器就销毁了,如果是持久级别的Cookie,那么它存在的硬盘上(一般在C盘,不同浏览器存储Cookie的文件的位置不同,通常是一个txt文件)
Cookie是不安全的,浏览器可以将Cookie删除,此时就自动删掉硬盘上的cookie文件
在这里插入图片描述
2. 不支持中文,默认是不能保存中文数据,如果非要存数据数据,必须先把中文转码,变成字母+数字形式

	String city = "武汉";
		// 将中文编码,变成字母+数字的形式
		city = URLEncoder.encode(city, "UTF-8");
		System.out.println(city);
		Cookie cookie = new Cookie("city", city);
获取Cookie的值时,需要解码
Cookie[] cookies = request.getCookies();
		for (Cookie ck : cookies) {
			if (ck.getName().equals("city")) {
				String value=ck.getValue();
				//解码
				value= URLDecoder.decode(value, "UTF-8");;
				System.out.println("名为city的Cookie的值:" +value);
				break;
			}
		}

3.有大小限制
4.不能操作对象,因为Cookie只能存字符串
什么时候用Cookie?
如果要为当前的会话保存简单的字符串,就用Cookie来保存。

2.Sesssion

第1次访问服务器时,服务器端为该会话创建一块内存空间存储客户端的数据(内存空间相当于房间),同时还会给客户端发送一个名为jSessionID的Cookie,值为本次会话的Id(相当于房间的钥匙),后面再次访问服务器时,就会在请求中带着名字为jSessionID的Cookie,服务器端接收到Cookie后,读出Cookie值(会话的ID),再根据会话ID去寻找专属于本次会话的内存空间,session就是服务器端的内存空间。
不同的用户会话的ID是不同的,服务器端就会创建不同的Session(内存空间)为不同的会话存储数据,客户端只需要带着钥匙(Cookie)过去就能找到专属于本会话的Session.
在这里插入图片描述
JSessionID的值就是session的Id ,用session.getId()获取.
JSessionID的值就是session的Id ,用session.getId()获取.
2.1获取Session对象的方法
1)request.getSession()
此方法用在servlet中的,第1次请求Servlet,此时请求中没有名字叫JSessionID的Cookie,服务器根据这个判断出还没有属于当前会话的Session对象,就创建一个新的并返回;
再次请求servlet调用此方法,就直接返回已有的Session

2)request.getSession(false)
第1次请求Servlet,服务器端还没有属于本会话的Session对象,就返回null;如果已经有了Session就直接返回
注意: 1)getSession()等价于getSession(true)
2)jsp页面默认会创建session,可以直接用session(内置对象),有时候不想用session,就要禁用session,在page指令上加session=“false”

<%@ page language="java" import="java.util.*"  session="false" pageEncoding="UTF-8"%>

2.2 存取数据
存数据:setAttribute(String name,Object value)
取数据: getAttribute(String name)
删数据: removeAttribute(String name);
2.3 session生命周期
1)创建
2)销毁
Session的三种“死法”
A.正常关闭服务器
B. Session过期 ,session有效期默认是30分钟
手动设置session有效期的两种方法
A).在web.xml文件中配置session超时时间

 <session-config>
      <!-- 配置session超时时间,单位是分钟 -->
     <session-timeout>20</session-timeout>
  </session-config>

B).在程序中调用setMaxInactiveInterval(int sec),时间单位是秒
//在程序中手动设置session的有效期,单位是秒
session.setMaxInactiveInterval(10*60);
设置了有效期后,过了这个时间session就自动销毁了
C) 手动销毁,session.invalidate()
此方法会直接将session销毁掉,即使它还没过期,用在注销或安全退出功能中
2.4 session的登录案例
需求1:登录成功后在后续的每个请求页面上都能访问用户信息
1.登录成功后,将用户保存在session中

if("admin".equals(username)&&"123456".equals(userpwd)){
    	    //登录成功
    	    HttpSession session=request.getSession();
    	   /* session.setAttribute("username", username);
    	    session.setAttribute("userpwd", userpwd);*/
    	    //将用户名,密码都封装到对象中
    	    User user=new User();
    	    user.setUsername(username);
    	    user.setUserpwd(userpwd);
    	    user.setEmail("[email protected]");
           //将对象存到session中
    	    session.setAttribute("user", user);
    	     //跳转到show.jsp
    	    response.sendRedirect("view/show.jsp");
    	    
      }else{
    	   response.sendRedirect("login.jsp");
      }

2.在每个页面上使用EL访问用户信息

	用户名:${user.username },密码:${user.userpwd },邮箱:${user.email }

需求2:.如果没有登录直接访问页面,将跳转到登录页面
在页面上加入判断:

<%
		User user = (User) session.getAttribute("user");
		if (user == null) {
			//没有经过登录,跳转到登录页面
			response.sendRedirect(request.getContextPath() + "/login.jsp");
		}
	%>

需求3:安全退出
1.页面上加入安全退出的超链接

<a href="javascript:void(0)"  onclick="exit()">安全退出</a>
	<script type="text/javascript">
	  function exit(){
		   var flag=confirm("确定要退出吗?");
		  if(flag){
			 //跳转到logout.action
			  location.href="${pageContext.request.contextPath }/logout.action";
		  }
	  }
	</script>

2.servlet中处理安全退出请求

public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 获取session
		HttpSession session = request.getSession();
		// 销毁
		session.invalidate();
		//跳转到登录页面
		response.sendRedirect("login.jsp");
	}

2.5 为什么关闭浏览器,再开浏览器后就取不出session中的数据了?
因为当我们访问服务器时,服务器返回给浏览器的名为jSessionID的Cookie是会话级别的Cookie,关闭浏览器后该Cookie就失效了。再开浏览器访问时,服务器就没办法查找属于上次会话对应的Session对象了(相当于房子还在,钥匙丢了,就进不了房间了)
解决办法:在session保存数据的同时,对名为JSESSIONID的Cookie进行持久化的设置,把它变成持久级别的Cookie

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 使用session来保存用户的购物车数据
		HttpSession session = request.getSession();
		session.setAttribute("book", "西游记");
		//将名字为jSesssionID的Cookie设置有效时间,变成持久级别的 
		Cookie cookie=new Cookie("JSESSIONID", session.getId());
		//设置有效期,为用户保存3天
		cookie.setMaxAge(3*24*60*60);
		cookie.setPath(request.getContextPath());
		//返回给浏览器
		response.addCookie(cookie);
		response.sendRedirect("list.jsp");
	}

猜你喜欢

转载自blog.csdn.net/qq_41532872/article/details/87869996