Cookie 

1) HTTP是无状态协议(连接结束后就自动断开),服务器不能记录浏览器的访问状态,也就是说服务器不能区分中两次请求是否由一个客户端发出。这样的设计严重阻碍的Web程序的设计。如:在我们进行网购时,买了一条裤子,又买了一个手机。由于http协议是无状态的,如果不通过其他手段,服务器是不能知道用户到底买了什么。而Cookie就是解决方案之一。
2) Cookie实际上就是服务器保存在浏览器上的一段信息。浏览器有了Cookie之后,每次向服务器发送请求时都会同时将该信息发送给服务器,服务器收到请求后,就可以根据该信息处理请求。
3) Cookie的用途
  用户登录状态的保持
4) Cookie的限制性
  ① Cookie作为请求或响应报文发送,无形中增加了网络流量。
  ② Cookie是明文传送的安全性差。
  ③ 各个浏览器对Cookie有限制,使用上有局限

5) Cookie的具体使用

  1、创建Cookie,并将Cookie保存到浏览器端

        //演示Cookie
Cookie cookie = new Cookie("username","Admin");
// 保存到浏览器端
response.addCookie(cookie); //cookie的默认时效 就是当前浏览器的内存. //设置cookie的保存时间
//cookie.setMaxAge();
//设置cookie的路径 默认的路径就是web应用名
//cookie.setPath(uri);

  2、读取Cookie,只会发于当前请求路径相符的Cookie

        //获取cookie

        Cookie [] cookies = request.getCookies();
if(cookies!=null) {
for (Cookie cookie : cookies) {
System.out.println(cookie.getName() + " : " + cookie.getValue());
}
}else {
System.out.println("没有Cookie");
}

Session
1) 使用Cookie有一个非常大的局限,就是如果Cookie很多,则无形的增加了客户端与服务端的数据传输量。而且由于浏览器对Cookie数量的限制,注定我们不能再Cookie中保存过多的信息,于是Session出现

2) Session的作用就是在服务器端保存一些用户的数据,然后传递给用户一个名字为JSESSIONID的Cookie,这个JESSIONID对应这个服务器中的一个Session对象,通过它就可以获取到保存用户信息的Session。

3) Session的工作原理
   ① Session的创建时机是在request.getSession()方法第一次被调用时。
   ② Session被创建后,同时还会有一个名为JSESSIONID的Cookie被创建。
  ③ 这个Cookie的默认时效就是当前会话。
  ④ 简单来说,Session机制也是依赖于Cookie来实现的

4) Session的具体使用

        //获取session对象

        HttpSession session = request.getSession();

        System.out.println("当前请求的session对象:" + session);
System.out.println("sessionID:" + session.getId());

5) Session的时效问题
    Session默认有效时间为30分钟,可以在服务器的web.xml配置中修改.

6)URL重写(当Cookie被禁用时采取的方式)

1) 整个会话控制技术体系中,保持JSESSIONID的值主要通过Cookie实现。但Cookie在浏览器端可能会被禁用,所以我们还需要一些备用的技术手段,例如:URL重写。
2) URL重写其实就是将JSESSIONID的值以固定格式附着在URL地址后面,以实现保持JSESSIONID,进而保持会话状态。这个固定格式是:URL;jsessionid=xxxxxxxxx
3) 实现方式

JSTL标签

        JSTL:
<c:if>
<c:foreach> 等 使用标签:
1. 导入标签库 jar包
2. 在jsp页面中引入标签库。 <%@taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core"%>
    <c:if test="${empty  emps}">
<h2 align="center">没有任何员工信息。</h2>
</c:if> <!-- 通过循环 显示 员工数据 -->
<!--
c:forEach 循环 迭代
items: 指定要迭代的集合
var: 代表当前迭代出的元素
-->
<c:forEach items="${emps}" var="emp">
<tr align="center">
<td>${emp.id }</td>
<td>${emp.lastName }</td>
<td>${emp.email }</td>
<td>${emp.gender==0?"女":"男" }</td>
<td>${emp.dept.deptName }</td>
<td>
<a href="#">Edit</a>
&nbsp;&nbsp;
<a href="#">Delete</a>
</td>
</tr>
</c:forEach>

最新文章

  1. QT 网络编程
  2. Qt回忆录之配置开发环境
  3. spring3使用task:annotation-driven开始定时
  4. JQuery在循环中绑定事件的问题详解
  5. nested exception is com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1044 &gt; 1024
  6. C#中服务端接受前端JSON字符串转换成字典集合
  7. ADS(一)
  8. 如何给spine骨骼动画挂载粒子特效
  9. java synchronized wait
  10. vue端口号被占用如何解决
  11. cassandra 3.x官方文档(6)---内部原理之存储引擎
  12. [LeetCode] 24. 两两交换链表中的节点
  13. 对象&amp;内置对象&amp; 对象构造 &amp;JSON&amp;__proto__和prototype
  14. JS解析url
  15. 二.hadoop环境搭建
  16. c# async/await异步编程死锁的问题
  17. html标签之img
  18. 使用VMware克隆Linux系统
  19. BZOJ3196 &amp; 洛谷3380:二逼平衡树——题解
  20. 【MFC】画线

热门文章

  1. git-github远程仓库以及git的进阶使用
  2. 【kubevirt】VirtualMachineInstanceReplicaSet(vmis)-扩缩容-弹性伸缩
  3. 一行代码如何隐藏 Linux 进程?
  4. 精彩分享 | 欢乐游戏 Istio 云原生服务网格三年实践思考
  5. arts-week10
  6. 806. Number of Lines To Write String - LeetCode
  7. unity---脚本代码报错
  8. Kube-OVN v1.10.0:新增Windows节点支持,用户自定义子网ACL等10+硬核功能
  9. .net6.0 初探
  10. C++primer第二章