今日内容
- Cookie
- Session
- 完善项目修改、删除
- 会话简介
(一)概念
客户端和服务器连接开始,请求和响应(多次)的整个过程都属于一次会话。客户端和服务器交流的过程,这个过程是一个持续的过程,当关闭客户端或者服务器该次会话结束。
一次会话指的是:就好比打电话,A给B打电话,接通之后,会话开始,在此期间,A与B可以进行多次对话,直到挂断电话,该次会话就结束了。而浏览器访问服务器,就跟打电话一样,浏览器A给服务器发送请求,访问web程序,该次会话就已经接通,期间不管浏览器与服务器发生过多少次请求响应,都视为一次会话,直到浏览器或服务器关闭,本次会话结束。
注意:一个浏览器就相当于一部电话,使用不同的浏览器,用同一个账户访问同一个web应用,属于不同的会话。
(二)作用与分类
会话的作用:跟踪客户信息,保存客户状态,共享数据等。
会话包含以下两种:
客户端会话:Cookie
服务器端会话:Session
二、为什么使用会话
因为HTTP协议是无状态的,所以服务器不知道我们之前是否访问过该资源,也就是说服务器不保留任何访问痕迹,也就无法做到跟踪或区别不同用户信息的作用。
当然,最简单的解决方案就是在每一次请求里都携带上用户名和密码,每次请求都要做用户身份验证。这样虽然可行,但大大加重了服务器的负担(对于每个request都需要到数据库验证),也大大降低了用户体验(每个页面都需要重新输入用户名密码,每个页面都带有登录表单)。此时,就只有在服务器或客户端保存一些类似的可以代表身份的信息,所以就有了cookie与session,cookie和session用来跟踪用户的整个会话。
三、使用方式
(一)客户端会话Cookie
1、理解
Cookie:本意是小点心 小甜点 小饼干。
在计算机中,Cookie有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。是一种特殊的缓存技术,加密后用来存储少量数据至客户端,以便下次访问时使用。
Cookie的应用场景:
①判断用户是否登录过某网站,如果登录过用户信息会被保存在客户端浏览器中,下次可以从Cookie中直接获取,实现自动加载用户信息功能;
②用来记录购物车或者记录用户使用偏好来制定推送,比如某人近期购买过某款商品,该商品信息会被记录到客户端浏览器,并根据用户喜好给用户做定向推送;
2、原理
那么如何跟踪会话呢,我们需要掌握该会话的原理就清楚了:
原理:
本质上讲,Cookie是一段文本信息。客户端请求服务器时,如果服务器需要记录用户状态,就在响应用户请求时发送一段Cookie信息。客户端浏览器保存该Cookie信息,当用户再次访问该网站时,浏览器会把Cookie做为请求信息的一部分提交给服务器。服务器检查Cookie内容,以此来判断用户状态,服务器还会对Cookie信息进行维护,必要时会对Cookie内容进行修改。
简而言之我们可以这么理解:
1. 当从浏览器发送请求到服务器后,servlet创建cookie,保存少量数据,发送浏览器。
2. 浏览器获得服务器发送的cookie数据,将自动的保存到浏览器端。
3. 下次访问时,浏览器将自动携带cookie数据发送给服务器,服务器可以根据cookie信息来跟踪用户身份。
3、查看Cookie
1)查看浏览器Cookie的方式:在打开的浏览器地址栏前小锁图标或小i图标上单击即可看到下面显示的Cookie数量。
- 具体查看某个Cookie的方式:单击上面显示的Cookie数量进入以下页面,选择某一个Cookie文件,下面即可显示当前Cookie的详细信息。其中最重要是Cookie的创建时间和到期时间,一旦Cookie过期,数据就会消失。
- 查看并清除某网站Cookie数据,以淘宝网为例(taobao.com),在浏览器右上角单击三个小点图标,选择下面的“设置”。
通过单击设置,打开一个新页面后选择最下方的“高级”
高级---左侧的安全检查---网站设置(内容设置)---Cookie---查看所有 Cookie 和网站数据
可以全部删除,也可单个删除Cookie。
清除Cookie的快捷方式:Ctrl + Shift + Delete,可以根据时间范围选择性的删除。
4、使用
1.Cookie创建
Cookie cookie = new Cookie(String key,String value);
key:表示cookie的名字
value:表示cookie中保存的数据
2.设置有效时间,默认情况下Cookie的有效期是浏览器关闭即结束,如果希望不受浏览器关闭的影响,可以长时间保存Cookie数据,则需要设置有效时间,单位为秒。
cookie.setMaxAge(int expiry);
说明:
- 默认值为 -1 :代表浏览器关闭后,也就是会话结束后,cookie就失效了,也就没有了;
2)expiry>0 :代表浏览器关闭后,cookie不会失效,仍然存在。并且会将cookie保存到硬盘中,直到设置时间过期才会被浏览器自动删除;
3)expiry=0:删除cookie。不管是之前的expiry=-1还是expiry>0,当设置expiry=0时,cookie都会被浏览器给删除。
3. 发送给浏览器,响应Cookie
response.addCookie(cookie);
4. 获取cookie
Cookie[] cookies = request.getCookies();
if(cookies!=null) {
for (Cookie cookie : cookies) {
// 获取cookie的名称
String name = cookie.getName();
// 获取cookie的值
String value = cookie.getValue();
System.out.println(name+":::"+value);
}
}
案例
存Cookie:
取Cookie:
5、特点
1、Cookie中只能以键值对的形式保存字符串类型的数据
2、Cookie中保存的数据有大小限制,一般不超过4KB
3、Cookie是保存在客户端的,安全性较差
4、Cookie默认有效期是浏览器关闭即销毁,所以如果想持久保存Cookie对象,一定要设置有效期,并且有效期时间单位是秒。
6、案例:记住密码
我们以学生信息管理系统中的登录功能为例,用户登录成功后,将用户信息(账号和密码)保存到Cookie中,再次登录时从Cookie中直接获取账号和密码,自动加载到文本框中,避免手动输入。
实现思路:
- 用户登录成功时保存用户信息到Cookie中
- 在登录页面login.jsp页面中读取cookie的数据并显示在文本框中
说明:当第一次访问登录页面login.jsp时,账号和密码文本框是空的。
当使用正确的账号和密码登录成功后,关闭浏览器,再次打开登录页面login.jsp时,会自动加载账号和密码到对应的文本框,可以直接单击登录按钮进行登录。
(二)服务器会话Session
1、理解
Session是服务器提供的一个会话对象,是第二大作用域对象。创建之后这个Session是存储到服务器中的。但Session的使用需要和浏览器建立关联,这个关联与Cookie有关,其中每一个Session对象都会对应一个sessionId,这个sessionId就被存储在Cookie中。
2、原理
第一次通过浏览器请求服务器,如果需要创建一个Session来跟踪用户信息时,服务器端会先检查这个客户请求是否包含一个Session的标识(也就是SESSIONID),如果已经包含则说明之前为用户创建过Session,服务器就按它的标识SESSIONID检索使用即可。但如果不包含标识,服务器会为此用户创建一个新的Session并生成一个唯一的SESSIONID,而这个SESSIONID就是使用Cookie对象来存储,在向客服端响应时会把SESSIONID响应到客户端浏览器进行保存。这样在后续的交互过程中,浏览器每次向服务器发送请求都会携带这个存储SESSIONID的Cookie,从而借用Cookie的跟踪原理完成Session的会话跟踪。
原理图如下:
3、使用
1.获取session对象(如果是在servlet中,需要先获取,jsp中内置对象,可以直接使用)
HttpSession session = request.getSession();
2. 保存数据到session中
session.setAttribute(String 绑定名, Object 绑定值);
3. 获取session数据
Object obj = session.getAttribute("绑定名");
4. 有效时间默认30分钟,可以去tomcat中conf下web.xml文件查看
手动设置有效期:
session.setMaxInactiveInterval(int expiry);单位秒
5. 销毁session对象
1)session.invalidate();
2)非活动时间超时
3)服务器非正常关闭
4、特点
1、存储在服务器端,安全性好
2、默认超时时间为30分钟
3、Session做为第二大域对象,在一个会话范围内的数据是可以共享的
4、Session存储的数据可以是任意类型
5、多个页面显示用户信息案例:
登录成功时将用户对象信息保存到session域中,在其他页面显示用户名。
页面中取session数据显示:
6、案例:登录控制
实现思路:在用户登录成功时,将用户信息保存到session域中,当用户访问未经允许的页面时,先对session中的用户信息做判断,如果用户信息为空,表示未登录,则强制跳转到登录页面,否则可正常访问。
- 登录验证成功存session
package com.ujiuye.servlet; |
- 在需要验证的页面对Session数据进行判断,为了实现多个页面中的登录控制功能,将登录控制代码单独创建一个jsp页面完成:
- 在需要验证的页面中,使用include指令引用jsp验证文件
- 安全退出
在首页index.jsp添加安全退出按钮,单击按钮时请求后台servlet完成退出操作。
Servlet:
(三)Cookie和Session的区别
1. Cookie和Session都是会话技术,Cookie是运行在客户端,Session是运行在服务器端。
2. Cookie有大小限制以及浏览器存cookie的个数也有限制,Session是没有大小限制和服务器的内存大小有关。
3.Cookie只能保存字符串数据,Session可以保存任意类型数据
4. Cookie有安全隐患,通过拦截或本地文件找得到你的cookie后可以进行攻击。
5. Session是保存在服务器端上会存在一段时间(默认30分钟)才会消失,如果session过多会增加服务器的压力。
二者之间的联系:
sessoin依赖Cookie,sessionId保存在客户端Cookie中。
- 完善学生管理系统项目
(一)优化显示头像
图片路径的挂载
(二)抽象BaseServlet
由于考虑到每一个Servlet中都需要重写service方法,并且service方法中的代码基本是相同的,所以考虑到进行抽取封装,这里提取出一个父类BaseServlet去继承HttpServlet,在这里实现serivce方法的重写,利用反射机制完成分发操作,具体代码如下:
public class BaseServlet extends HttpServlet { |
修改学生和管理员的Servlet,将其原来的serivce方法去掉,同时继承BaseServlet:
注意:此时通过返回获取要执行的方法时必须用方法名,所以在请求Servlet传递参数时必须传递的是方法名,而不能随便传递关键字。
(三)详情查询
- dao
- service
- servlet
- 页面:details.jsp
<%-- |
效果图: