14.ServletContext接口
- 介绍:
- 来自于Servlet规范中一个接口。在Tomcat中存在servlet-api.jar
在Tomcat中负责提供这个接口实现类 - 如果两个Servlet来自于同一个网站。彼此之间通过网站的ServletContext
实例对象实现数据共享。 - 开发人员将ServletContext对象称为【全局作用域对象】
- 工作原理:每一个网站都存在一个全局作用域对象,这个全局作用域对象【相当于】一个Map,在这个网站中OneServlet可以将一个数据存到全局作用域对象,当前网站中其他Servlet此时都可以从全局作用域对象得到这个数据进行使用。
- 全局作用域对象生命周期
- 在Http服务器启动过程中,自动为当前网站在内存中创建一个全局作用域对象。
- 在Http服务器运行期间,一个网站只有一个全局作用域对象
- 在Http服务器运行期间,全局作用域对象一直处于存活状态
- 在Http服务器准备关闭时,负责将当前网站中全局作用域对象进行销毁处理
- 全局作用域对象生命周期贯穿当前网站整个运行期间
- 命令实现:【同一个网站】OneServlet将数据共享给TwoServlet
![](img-blog.csdnimg.cn/img_convert…
15.cookie接口
- 介绍:
- cookie来自于Servlet规范中一个工具类,存在于Tomcat提供servlet-api.jar中
- 如果两个Servlet来自于同一个网站,并且为同一个浏览器/用户提供服务,此时
借助cookie对象进行数据共享。 - Cookie存放当前用户的私人数据,在共享数据过程中提高服务质量
- 在现实生活场景中,cookie相当于用户在服务端得到【会员卡】
- 工作原理:注意:cookie只存在于请求包的请求头中,与响应包的响应头中。
- 实现命令:同一个网站 OneServlet 与 TwoServlet 借助于cookie实现数据共享
16.Cookie销毁时机
- 在默认情况下,Cookie对象存放在浏览器的缓存中,
因此只要浏览器关闭,COokie对象就被销毁。 - 在手动设置情况下,可以要求浏览器讲接收的Cookie
存放在客户端计算机硬盘上,同时需要指定Cookie在
硬盘上存活时间。在存活时间范围内,关闭浏览器关闭
客户端计算机,关闭服务,都不会导致Cookie被销毁。
在存活时间到达时,Cookie自动从硬盘上被删除
cookie.setMaxAge(60); // cookie在硬盘上存活一分钟。 - 注意:设置上边的存活时间很重要,原理:到达规定的这个时间,Cookie会自动注销,用户信息消失。比如会员卡什么时候到期,到期之后就不可以在进行使用了,会员卡过期,其实就是里边的Cookie自动销毁了,此时查询不到用户的信息。失效的卡。
17.HttpSession接口
- 介绍:
- HttpSession接口来源于Servlet规范下一个接口。存在于Tomcat中servlet-api.jar
其实现类由Http服务器提供。Tomcat提供实现类存在于servlet-api.jar。
2. 如果两个Servlet来自于同一个网站,并且为同一个浏览器/用户提供服务, 复制代码
- 此时借助于HttpSession对象进行数据共享。
3. 开发人员习惯讲HttpSession接口修饰对象称为【会话作用域对象】 复制代码
- HttpSession 与 Cookie 区别:【面试题】
- 存储位置:
Cookie:存放在客户端计算机(浏览器内存/硬盘)
HttpSession:存放在服务端计算机内存 - 数据类型:
Cookie对象存储共享数据类型只能是String
HttpSession对象可以存储任意类型的共享数据Object - 数据数量
一个Cookie对象只能存储一个共享数据,只能存放一个键值对
Cookie相当于一个小盒子,只能存放String
HttpSession使用map集合存储共享数据,所以可以存储任意数量共享数据
HttpSession相当于一个大盒子,可以存储任意的数据类型。 - 参照物
Cookie相当于客户在服务端【会员卡】
HttpSession相当于客户在服务端【私人保险柜】 - 命令实现:
- Http服务器如何将用户与HttpSession关联起来 : Cookie
- getSession() 与 getSession(false) 的区别
- getSession():如果当前用户在服务端已经拥有了自己的私人储物柜,
要求Tomcat将这个私人储物柜进行返回
如果当前用户在服务端未拥有自己的私人储物柜,
要求Tomcat为当前用户创建一个全新的私人储物柜。 - getSession(false) :如果当前用户在服务端已经拥有了自己的私人储物柜,
要求Tomcat将这个私人储物柜进行返回。
如果当前用户在服务端未拥有自己的私人储物柜,
此时Tomcat将返回null。
- HttpSession销毁时机:
- 用户与HttpSession关联时使用的Cookie只能存放在浏览器缓存中
- 在浏览器关闭时,意味着用户与他的HttpSession关系被切断。
- 由于Tomcat无法检测浏览器何时关闭,因此子啊浏览器关闭时并不会
导致Tomcat将浏览器关联的HttpSession进行销毁。 - 为了解决这个问题,Tomcat为每一个HttpSession对象设置【空闲时间】
这个空闲时间默认为30分钟,如果当前HttpSession对象空闲时间达到30分钟
此时Tomcat认为用户已经放弃了自己的HttpSession,此时Tomcat就会销毁
掉这个HttpSession。
- HttpSession空闲时间的手动设置
在当前网站/web/WEB-INF/web.xml
<session-config> <!--当前网站中最大的空闲时间为5分钟--> <session-timeout>5</session-timeout> </session-config> 复制代码
18.购物车管理系统演示HttpSession接口用法
- 工作原理图
19. HttpServletRequest接口实现数据共享
- 介绍:
- 在同一个网站中,如果两个Servlet之间通过【请求转发】方式进行调用,
彼此之间共享同一个请求协议包。而一个请求协议包只对应一个请求对象,
因此在Servlet之间共享同一个请求对象,此时可以利用这个请求对象在
两个Servlet之间实现数据共享。 - 在请求对象实现Servlet之间数据共享功能时,开发人员将请求对象称为【请求作用域对象】
2. 命令实现:OneServlet通过请求转发申请调用TwoServlet时,需要给TwoServlet提供共享数据
20.Servlet规范扩展 -------- 监听器接口
- 介绍:
- 一组来自于Servlet规范下接口,共有8个。在Tomcat存在servlet-api.jar包
- 监听器接口需要由开发人员亲自实现,Http服务器提供jar包并没有提供对应的实现类
- 监听器接口用于监控【作用域对象声明周期变化时刻】以及【作用域对象共享数据变化时刻】
- 作用域对象:
- 在Servlet规范下,认为在服务端内存中可以在某些条件下为两个Servlet之间提供数据共享方案的对象,被称为【作用域对象】
- Servlet规范下作用域对象:
ServletContext : 全局作用域对象
HttpSession : 会话作用域对象
HttpServletResquest : 请求作用域对象
- 监听器接口实现开发规范:三步
- 根据监听的实际情况,选择对应监听器接口进行实现。
- 重写监听器接口声明【监听事件处理方法】
- 在web,xml文件将监听器接口实现类注册到Http服务器
- ServletContextListener接口:
- 作用:通过这个接口合法的检测全局作用域对象初始化时刻以及被销毁时刻。
- 监听事件处理方法:
publlic void contextInitlized() : 在全局作用域对象被初始化被调用
public void contextDestory() : 在全局作用域对象被Http服务器销毁的时候被触发调用
- ServletContextAttributeListener接口:
- 作用:通过这个接口合法的检测全局作用域对象共享数据变化时刻
- 监听事件处理方法:
publlic void contextAdd() : 在全局作用域对象添加共享数据
publlic void contextReplaced() : 在全局作用域对象更新共享数据
publlic void contextRemove() : 在全局作用域对象删除共享数据
- 全局作用域对象共享数据数据变化时刻:
21. Servlet规范扩展 ----------- Filter(过滤接口)
22.过滤器对拦截的请求进行增强操作
上边的这个图代表的是一个服务端,里边存在100的Servlet。每次在调用任何一个Servlet的时候,都需要使用doPost方法,
在使用doPos方法的时候,必须得对编码方式进行重写,因为doPost的默认编码方式不是utf-8,编译中文的时候会出现乱码
这个时候要对100个Servlet都进行重新编译,很麻烦,此时就可以使用监听器,将100个Servlet都进行过滤,在过滤的时候为
每一个Servlet加上req,setCharacterEncoding(utf-8)的方法,这样就可以一次将100个Servlet进行重新编码处理,极大的节了
开发时间。
23.Filter拦截地址格
- 命令格式:
<filter-mapping> <fileter-name>OneFilter</fileter-name> <url-pattern>拦截地址</url-pattern> </filter-mapping> 复制代码
- 命令作用:
拦截地址通知Tomcat该调用何种资源文件之前需要调用OneFilter过滤进行拦截 - 要求Tomcat在调用某一个具体文件之前,来调用OneFilter拦截(练习使用)
<url-pattern>/img/帅哥.jpg</url-pattern> // 此时拦截的就是img文件夹下的帅哥.jpg 复制代码
- 要求Tomcat在调用某一个文件夹下所有的资源文件之前来调用OneFilter拦截(开发使用)
<url-pattern>/img/*</url-pattern> //此时拦截的是img文件夹下的所有文件 复制代码
- 要求Tomcat在调用任意文件夹下某种类型文件之前,来调用OneFilter拦截(开发使用)
<url-pattern>*.jpg</url-pattern> // 此时拦截的是任意文件夹下的jpg文件 复制代码
- 要求Tomcat调用网站中任意文件,来调用OneFilter拦截
<url-pattern>*</url-pattern> // 此时拦截的是网站中所有的文件 复制代码
24.过滤器防止用户恶意登录行为
令牌机制:相当与双岗机制,当用户在使用账号和密码登录成功之后,第一个岗位也就是登录页面会给用户一个新的令牌,这个令牌用于在调用资源文件前的第二次识别,只有两次都识别通过了,才会将此资源文件返回到用户的浏览器上。
恶意行为:他不会经过第一个岗位,即用户登录页面,拿不到想要的令牌,在第二次识别的时候不会给他分配资源文件。恶意行为跨过的第一道岗位(用户登录岗位),拿不到令牌,在第二道岗位的时候会被拦截。
<!--在判定来访用户身份合法后,通过请求对象向Tomcat申请当前用户申请一个HttpSession--> <!--这个方法相当于在用户登录界面为该用户生成一个私人保险柜,只有在登录界面才能分配这个柜子, 而翻墙过来的黑客没有经过这个登录的页面,所有不会被分配到私人保险柜--> <!--这个是时候采用的这个getSeeion方法没有参数,代表不用判断,直接给用户创建一个新的私人保险 柜--> <!--整的登录过程中只有这一个地方使用的是getSession()不含参数的这个方法,其余的地方都是是使用的getSession(false)这个方法,有保险柜返回保险柜,没有不会新建保险柜,而是返回null--> HttpSession session = request.getSession(); <!--索要当前用户在服务端的HttpSession--> <!--如果当前用户在这个服务端有柜子,返回这个柜子,否则返回NUll--> HttpSession session = request.getSession(false); if(session == null){ response.sendRedirect("/myWeb/login_error.html"); return; }else{ } 复制代码
25.JavaWeb总流程图
26.防止用户恶意登录(令牌机制的实现)
此时在登录页面要显示一些相关的元素,比如登录框、文本框、JS代码等。这些要设置为login,这样做的目的是不用进行任何验证用户就可以看到使用这些元素。也就是直接放行,不进行过滤器的过滤。
与登录页面有关的元素设置为 login ,直接放行。
HttpServletRequest request = (HttpServlrtRequest)servletRequset; HttpSession session = null; // 1.调用请求对象读取请求对象包中的请求行的URI,了解用户的资源文件是谁 // [/网站名/资源文件名] /myWeb/login.html or /myWeb/login String uri = request.getRequestUrI(); // 2.如果本次请求的资源文件与登录相关【login.html 或者 LoginServlet】此时应该无条件放行 // indexOf会返回当前 login 这个字段在 uri这个字符串里边第一次出现的位置 // 如果这个uri中不存在这个字符串将返回 -1,此时说明不能不是与登录相关的资源文件,不能放行 // 如果不等于-1,说明在这个uri字符串里边包含,这个login,此时就代表这个文件是与我们登录相 // 关的文件,进行直接无条件放行。 /*如果用户只写了要访问的网站名,并没有提供要访问的具体文件,此时根据网站默认欢迎文件的规则 他会去web.xml文件里边寻找我们自定义的默认资源文件 login.html(这个文件也是自己写的) 之后进行调用*/ if(uri.indexOf("login") != -1 || "/myWeb/".equals(uri)){ // 将拦截下来的请求对象与响应对象交还给 Tomcat进行放行处理 filterChain.doFilter(servletRequest,ServletResponse); return; } // 3.如果本次请求访问的是其他资源文件,需要得到用户在服务端HttpSession // getSession(false); 如果服务端存在 HttpSession会将其返回,没有会返回null,不会创建 session = request.getSession(false); // 判断用户存不存在HttpSession,如果存在就进行放行,如果不存在不放行(可能是黑客) if(session != null){ // 合法的用户 将拦截下来的请求对象与响应对象交还给 Tomcat进行放行处理 filterChain.doFilter(servletRequest,ServletResponse); return; } // 4.在服务端不存在Httpsession,此时认为是恶意登录,因该拒绝访问 // login_error.htm 这个文件是自己在 Web 目录下文件夹,在里边编写一些不允许访问的说明 request.getRequestDispatcher("/login_error.html").forward(servletRequest,ServletResponse);