Cookie&Sesion

请求转发和重定向

  • 重定向
//之前的写法
response.setStatus(302);
response.setHeader("Location","login_successs.html");

//重定向写法:重新定位方向
response.sendRedirect("login_success.html");

1.地址上显示的是最后的那个资源的地址
2.请求次数最少有两次,服务器在第一次请求后,会返回302以及一个地址,浏览器会根据这个地址执行第二次代码
3.可以跳转到任意路径,不是自己的工程也可以跳
4.效率稍微低一点,执行两次请求
5.后续的请求,没法使用上一次request存储的数据,或者没有办法用上一次的request对象,因为这是两次不同的请求
  • 请求转发
请求转发的写法:参数即跳转位置
request.getRequestDispatcher("login_success.html").forward(request,response);

1.地址上显示的是请求servlet的地址
2.请求次数只有一次,因为是服务器内部帮客户端执行了后续的工作
3. 只能跳转自己项目的资源路径
4. .效率上稍微高一点,因为只执行一次请求
5. 可以使用上一次的request对象

在这里插入图片描述


Cookie

  1. 其实是一份小数据,是服务器给客户端,并且存储在客户端上的一份小数据
  2. 应用场景:自动登陆,浏览记录,购物车
  3. 为什么要有这个Cookie:http的请求是无状态的。客户端与服务器在通讯的时候,是无状态的,其实就是客户端在第二次来访的时候,服务器根本就不知道这个客户端以前有没有来访过。为了更好的用户习惯,更好的交互[自动登陆],其实从公司层面上讲,就是为了更好的手机用户习惯【大数据】

Cookie有什么用

  1. 在响应的时候,添加cookie
package com.java.servlet;

import java.io.IOException;

public class Demo01 extends HttpServlet {
	protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
		response.setContentType("text/html;charset=UTF-8");
		Cookie cookie = new Cookie("aa","bb");
		response.addCookie(cookie);
		response.getWriter().write("发送了一个请求,而且有一个cookie");
	}

	protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
		doGet(request,response);
	}
}
  1. 客户端收到的信息里面,响应头中多了一个字段Set-Cookie
  2. 创建对象的几种方法
  • 直接new
  • 单例模式 | 提供静态方法
  • 工厂模式构建stu(StuFactory StuBuilder)

获取Cookie

//获取客户端带过来的cookie
Cookie[] cookies = request.getCookies();
if(cookies != null) {
	for(Cookie c : cookies) {
		String cookieName = c.getName();
		String cookieValue = c.getValue();
		System.out.println(cookieName+"="+cookieValue);
	}
}

Cookie常用方法

关闭浏览器后,cookie就没有了。--->针对没有设置cookie的有效期
//正值:表示在这个数字过后,cookie将会失效
//负值:关闭浏览器,那么cookie就失效,默认值为-1
cookie.setMaxAge(60 * 60 * 24 * 7);

//赋新的值
cookie.setValue(newValue);

//用于指定只有请求了指定的域名,才会带上该cookie
cookie.setDomin(".java.com");

//只有访问该域名下的cookieDemo的这个路径地址才会带cookie
cookie.setPath("/CookieDemo");

例子1(显示最近访问的时间)

分析:

  1. 判断账号是否正确
  2. 如果正确,则获取cookie,但是得到的是一个数组,我们要从数组里面找到我们想要的对象
  3. 如果找到对象为空,表明是第一次登陆,那么需要添加cookie
  4. 如果找到对象不为空,表明不是第一次登陆
  • login.html
<h2>填写信息进行登陆</h2>
<form action="Demo03" method="get">
		账号:<input type="text" name="username" /><br/>
		密码:<input type="password" name="password" /><br />
		<input type="submit" value="登陆">
</form>
  • 处理login.html页面发来的请求的servlet
response.setContentType("text/html;charset=UTF-8");

String username = request.getParameter("username");
username = new String(username.getBytes("ISO-8859-1"),"UTF-8");
String password = request.getParameter("password");

if("admin".equals(username) && "123".equals(password)) {
	//通过request获取cookie,不过是一个数组
	Cookie[] cookies = request.getCookies();
	//通过一个工具类中的findCookie()方法找到所需要的cookie
	Cookie cookie = CookieUtil.findCookie(cookies,"last");

	if(null == cookie) {
		//如果cookie为空,设置一个cookie,并返回给客户端
		Cookie cookie2 = new Cookie("last",System.currentTimeMillis()+"");
		cookie2.setMaxAge(cookie2);
		response.addCookie(cookie2);
		response.getWriter().write("欢迎您"+username);
	} else {
		long lastVisitTime = Long.parseInt(cookie.getValue());
		response.getWriter().write("欢迎您"+username+"	上次来访时间为:"+new Date(lastVisitTime));
		cookie.setValue(System.currentTimeMillis()+"");
		response.addCookie(cookie);
	}
} else {
	response.getWriter().write("登陆失败!");
}
  • 工具类
public class CookieUtil {
	public staic Cookie findCookie(Cookie[] cookies,String name) {
		if(null != cookies) {
			for(Cookie cookie : cookies) {
				if(name.equals(cookie.getName()))
					return cookie;
			}
		}
		return null;
	}
}

在这里插入图片描述


Jsp里面使用java代码

//定义局部变量
<% int a = 99; %><br />
//定义全局变量
<%! int b = 999;%><br />

<%=a %><br />
<%=b %><br />

由于cookie会保存在客户端上,所以有安全隐患问题,还有一个问题,Cookie的大小和个数有限制。为了解决这个问题,就有了Session


Session

Session介绍

会话,Session是基于Cookie的一种会话机制。Cookie是服务器返回一小份数据给客户端,并且存放在客户端上,Session是数据存放在服务器端


Session常用API

  1. 得到会话ID
String id = session.getId();
  1. 存值
session.setAttribute(name,value);
  1. 取值
session.getAttribute(name);
  1. 移除值
session.removeAttribute(name);

session生存周期

  • 创建:如果有在servlet里面调用了request.getSession()
  • 销毁:seesion是存放在服务器内存中的一份数据。可以持久化,即便关掉了浏览器,session也不会销毁
  1. 关闭服务器
  2. session会话时间过期。默认有效期:30分钟

简单购物车例子

  1. product_list.jsp
    在这里插入图片描述
  2. CarServlet.java
    在这里插入图片描述
  3. cart.jsp
    在这里插入图片描述
  4. clearCartServlet.java
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42216575/article/details/93868700