Servlet的扩展工具及应用
文章目录
1.监听器接口(Listener)
(1).监听器的概述:
简介:
①来自Servlet规范中,存在共8个接口;
②需要开发人员自行去实现,并无现成的实现类;
作用:
用于监控
【作用域对象生命周期变化时刻】
或者【作用域对象共享数据变化时刻】
。
(2).作用域对象:
概念:
Servlet中,服务器内存中可存在某些条件下为两个Servlet间提供数据共享的对象,叫作
作用域对象
。
分类:
Ⅰ.ServletContext:全局作用域对象;
Ⅱ.HttpSession:会话作用域对象;
Ⅲ. HttpServletRequest:请求作用域对象;
监听器接口实现类开发规范:
Ⅰ.根据实际情况,选择适当的作用域对象;
Ⅱ.重写监听器接口声明【监听事件处理方法】;
Ⅲ.在web.xml文件将监听器接口实现对象注册到Http中。
web.xml文件的注册语法:
<listener>
<listener-class>(接口实现src下的地址+类名)</listener-class>
</listener>
(3).监听器接口详解:
a.ServletContextListener接口:
作用:
合法的检测【全局作用域对象】被初始化销毁时刻;
语法规则:
//【全局作用域对象】被初始化时被调用
public void contextInitialized();
//【全局作用域对象】被销毁时被调用
public void contextDestroyed();
b.ServletContextAttributeListener接口:
作用:
合法监测全局作用域对象共享数据变化时刻。
语法规则:
//在【全局作用域对象】中添加数据时被调用
public void attributeAdded();
//在【全局作用域对象】中更新数据时被调用
public void attributeReplaced();
//在【全局作用域对象】中删除数据时被调用
public void attributeRemoved();
修改数据的案例:
//拿到【全局作用域对象】
ServletContext application = request.getServletContext();
//增添数据
application.setAttribute("key1",100);
//修改数据
application.setAttribute("key1",200);
//删除数据
application.removeAttribute("key1");
2.过滤器接口(Filter)
(1).过滤器的概述:
简介:
Ⅰ.来自Servlet规范,存在与servlet-api.jar包下;
Ⅱ.需开发人员自行实现,无现成实现类;
作用:
Ⅰ.用于服务器调用资源以前,进行拦截;
Ⅱ.拦截Http服务器,检测当前请求的合法性;
Ⅲ.拦截Http服务器,对当前请求进行增强操作;
(2).使用规范:
Ⅰ.创建一个类,实现Filter接口;
Ⅱ.实现doFilter()方法;
Ⅲ.在web.xml中注册到Http服务器中;
在web.xml中的注册语法:
需被拦截文件名处的三种泛指:
(假设img目录下存储图片ice.jpg)
Ⅰ./img/ice.jpg
Ⅱ.*.jpg
Ⅲ./img/*
<filter>
<filter-name>(类名)</filter-name>
<filter-class>(src下地址)</filter-class>
</filter>
<filter-mapping>
<filter-name>(类名)</filter-name>
<url-pattern>(需被拦截的文件名)</url-pattern>
</filter-mapping>
(3).使用语法:
//当条件符合时,将【请求对象】和【响应对象】返还给服务器
filterChain.doFilter(request,response);
//过滤器做增强操作
//改变请求体的编码方式
request.setCharacterEncoding("utf-8");
(4).过滤器的应用(防止用户恶意登录)
概述:
用户恶意登录指不经过登陆步骤,直接通过地址栏访问登录后的页面。
令牌机制解决恶意登录:
使用过滤器之前:
Ⅰ.在登录界面给予用户会话作用域对象;
HttpSession session = request.getSession();
Ⅱ.在资源文件内添加检测机制:
if(session != null){}
缺点:
Ⅰ.无法对静态文件进行保护;
Ⅱ.如果网站资源较多,增加了开发难度。
使用过滤器之后:
Ⅰ.在登录界面给予用户会话作用域对象;
HttpSession session = request.getSession();
Ⅱ.书写过滤器的实现类并重写doFilter()方法:
Ⅲ.在web.xml下配置文件。
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
/*由于servletRequest中没有getSession方法,必须将其转为其子接口HttpSession才能
调出getSession方法,response同理*/
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpSession session = null;
//通过【请求对象】获取到请求行中的uri
String uri = request.getRequestURI();
//如果登录信息出现login相关的,过滤器无条件通过
if (uri.indexOf("login")!=-1 || "/myWeb/".equals(uri)){
filterChain.doFilter(servletRequest, servletResponse);
return;
}
//如果访问其他资源文件,则需验证用户的session
session = request.getSession(false);
if (session != null){
filterChain.doFilter(servletRequest, servletResponse);
return;
}
request.getRequestDispatcher("login_error.html").forward(servletRequest, servletResponse);
}