会话
会话技术可以理解为:用户开启一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭会话浏览器,整个过程称为会话。
注意点:每个用户和服务器进行交流的时候各自有一些数据,程序员要想办法保存每个用户的数据
Cookie技术
Cookie是客户端技术,程序把每个用户的数据以Cookie的形式写给各自的服务器,当用户使用这些浏览器去访问服务器端的web资源的时候,就是带着各自的数据去的,这样,web资源处理的数据就是各自的数据了
举例:
判断用户是不是第一次访问
如果是第一次访问,需要输出欢迎,并且记录当前的时间,保存到cookie中,再写入到浏览器端
如果不是第一次访问,获取cookie中的时间,输出时间,并且记录当前的时间,保持在cookie中,再回写到浏览器端
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 1.获取所有的cookie,判断是不是第一次访问
* 2.如果是第一次访问,输出欢迎,记录当前的时间,回写到浏览器端
* 3.如果不是第一次访问,获取时间,输出到浏览器上,记录当前的时间,回写到浏览器上
*/
//设置中文乱码问题的处理
response.setContentType("text/html;charset=utf-8");
//获取所有的cookie
Cookie[] cookies = request.getCookies();
//通过指定的cookie名称来查找cookie
Cookie cookie = MyCookieUtil.getCookieByName(cookies,"last");
//如果cookie==null,说明第一次访问
if (cookie == null) {
//输出欢迎,记录当前的时间,回写到浏览器上
response.getWriter().write("亲,欢迎下次光临哟");
} else {
//获取cookie的值,输出浏览器,记录当前的时间,回写到浏览器
String value = cookie.getValue();
response.getWriter().write("亲,您又来了,您上次访问的时间是"+value+"
");
}
//记录当前的时间,回写到浏览器
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String sDate = sdf.format(date);
//回写到浏览器
//回写cookie
Cookie c = new Cookie("last",sDate);
//设置有效时间,即可以设置访问的时间,可以在下次访问的时候保存其账号和密码信息
c.setMaxAge(60 * 60);
//设置有效路径 默认的路径就是和servlet的路径相同的.但是你可以通过对数据的改变来完成目的
c.setPath("/day_11");
//回写
response.addCookie(c);
}
实现结果为
cookie细节
1.一个cookie只能标识一种信息,它至少含有一个标识该信息的名称和设置值
2.一个web站点可以给多个web浏览器发送多个Cookie,一个浏览器也可以存储多个web站点提供的Cookie
3.如果创建了一个cookie,并将他发送到浏览器上,默认她是一个会话级别的cookie(存储在浏览器的内存中),用户推出浏览器即被删除
Cookie的使用
编写商品信息列表,给每一个商品起唯一的id值,通过id传值
判断是不是第一次访问
如果不是第一次访问,获取cookie中的商品信息,但是需要判断cookie是否可以包含该商品,如果包含就不用处理,如果不包含,就取出来做累加操作
重定向到商品页面,把商品循环到列表页面
业务流程图如下所示:
代码体现
public class ProductServlet extends HttpServlet {
private static final long serialVersionUID = 4859762620036854202L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 1.获取请求参数
* 2.获取cookie的数组,通过指定的明名称来查找cookie
* 3.如果cookie等于null 则第一次访问
* *如果是第一次访问,创建cookie,回写到浏览器上
* 4.如果不是cookie不等于null 不是第一次访问
* *如果不是第一次访问,说明我的cookie中已经存在id
* *判断当前的id是否已经在cookie的value中
* *如果存在,则不用操作
* *如果不存在,在后面追加(product=1,2)
* 5.重定向商品列表
*/
//获取请求参数:存到cookie中
String id = request.getParameter("id");
//先获取所有的cookie,查找指定名称的cookie
Cookie[] cookies = request.getCookies();
//查找指定名称的cookie 从数组中查询指定名称的cookie
Cookie cookie = MyCookieUtil.getCookieByName(cookies, "product");
if (cookie == null) {
//如果cookie==null,第一次访问,创建cookie,回写
Cookie c = new Cookie("product", id);
//回写
response.addCookie(c);
} else {
//如果不是第一次访问
//获取cookie的value(value可能是1,2,3,4,5,6)
String value = cookie.getName();
//判断当前的id是否包含在value中
String[] values = value.split(",");
if(!checkId(values,id)){
//不包含
cookie.setValue(value+","+id);
//回写
response.addCookie(cookie);
}
}
//重定向到商品页面
response.sendRedirect("/day_11/cookie/productList.jsp");
}
//服务器端页面
<%@page import="cn.ujiuye.utils.MyCookieUtil"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
购物车页面
手电筒
电话
电视机
冰箱
手表
电脑
浏览记录
<%
//获取cookie中的value值 循环遍历
Cookie[] cookies = request.getCookies();
//查询指定名称的cookie
Cookie cookie = MyCookieUtil.getCookieByName(cookies, "product");
//如果cookie不为空,拿到值,遍历
if(cookie != null){
//获取值 1 2 3
String value = cookie.getValue();
//分割
String[] ids = value.split(",");
//循环遍历,获取id
for(String id : ids){
%>
<%
}
}
%>
具体效果
session
在web开发的时候,服务器可以给每个浏览器创建一个会话对象,注意一个浏览器独占一个session对象,因此要保持数据的时候,服务器可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其他程序的时候,其他程序可以从用户的session取出该用户的数据为用户服务
Session和Cookie的区别
Cookie是把用户的数据写到用户的浏览器上
Session技术把用户的数据写到独享的Session中
Session是由服务器创建,开发人员可以使用reqest对象的getSession方法获取Sesssion对象
session案例
使用Session完成简单的购物车功能
1.接受传递过来的商品的id
2.使用Map集合代码购物车(key商品名称,value商品数量)
3.从session中获取购物车
4.把购物车存到Session中
public class CartServlet extends HttpServlet {
private static final long serialVersionUID = -2683239594750700474L;
@SuppressWarnings("unchecked")
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 需求分析
* 1.购物车 Map cart 把购物车存到session中
* 2.获取购物车,判断是不是第一次访问
* *第一次访问:创建购物车,把商品的名称和数量放到购物车里,再存到session中
* *不是第一次访问
* *判断是否包含该商品,通过名称
* *如果包含,数量加1存到session中
* *如果不包含,存入购物车,存到session
* 3.继续购物或者去结算
*/
//获取参数
String id = request.getParameter("id");
//购物车中存入商品的信息和数量
String[] names = {"电脑","手机","平板","电扇","空调"};
//把id翻译成名称
int index = Integer.parseInt(id);
//商品的名称
String name = names[index - 1];
//从session中获取购物车,必须先获取session
HttpSession session = request.getSession();
//从session中获取购物车
Map cart = (Map) session.getAttribute("cart");
//通过cart进行判断,是否是第一次访问
if (cart == null) {
//创建一个购物车
cart = new HashMap();
//第一次访问
cart.put(name, 1);
//存入到session中去
session.setAttribute("cart", cart);
} else {
//不是第一次访问,判断是否包含该商品
if (cart.containsKey(name)) {
//取出数量,+1,存入购物车,存入session
//取出
Integer count = cart.get(name);
count++;
cart.put(name, count);
//存入到session中
session.setAttribute("cart", cart);
}else {
//不包含
cart.put(name, 1);
//存入到session中
session.setAttribute("cart", cart);
}
}
//继续购物或者结算
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("继续购物 | 清空购物车
");
}
//浏览器端代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
购物车
电脑加入购物车
手机加入购物车
平板加入购物车
电扇加入购物车
空调加入购物车
session案例一次性校验码
1.一次性验证码的主要目的就是为了限制人们利用工具软件来暴力猜测密码
2.服务器程序接收到表单数据后,首先判断用户是否填写了正确的验证码,只有该验证码与服务器端保存的验证码匹配时,服务器程序才开始正常的表单处理流程
3.密码猜测工具要逐一尝试每个密码的前题条件是先输入正确的验证码,而验证码是一次性有效的,这样基本上就阻断了密码猜测工具的自动地处理过程
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = -1530508632256373495L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//处理post表单提交的中文乱码问题
request.setCharacterEncoding("UTF-8");
//获取session中的验证码
String code1 = (String) request.getSession().getAttribute("code");
//获取表单中的验证码
String code2 = request.getParameter("code");
//是否相同
if (code2 != null && code1.equals(code2)) {
response.getWriter().write("success");
}else {//如果不相同,则返回错误信息
//转发
request.setAttribute("msg", "验证码输入错误");
request.getRequestDispatcher("/session/login.jsp").forward(request, response);
}
}
浏览器端页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
${msg}
<%@page import="java.util.Set"%>
<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
结算界面
结算界面
<%
//获取购物车,把购物车中的商品信息和数量显示在页面上
Map cart = (Map)request.getSession().getAttribute("cart");
//如果购物车不为空,循环遍历
if(cart != null){
//循环遍历
Set keys = cart.keySet();
//循环遍历,拿到商品的名称
for(String key: keys){
%>
亲,您购买的商品是<%= key %>,数量是<%= cart.get(key) %>
<%
}
} else{
%>
亲,您还没有购物呢,你赶紧去购物吧
<%
}
%>
以上就是鄙人对Cookie和Session的拙见,欢迎大家批评指定