过滤器与监听器
本文是基于Windows 10系统环境,学习和使用基于java的过滤器与监听器:
- Windows 10
- MyEclipse 10
一、过滤器
(1) 过滤器出现的背景
- 项目开发中,经常会涉及到重复代码的实现,如设置编码
- 涉及到重复判断,如判断用户是否登陆
(2) 过滤器的定义
- java过滤器能够对目标资源的请求和响应进行截取
(3) 过滤器的执行流程
- 用户访问服务器
- servlet的请求先进入过滤器,过滤器进行拦截和处理
- 过滤器处理完后,再放行,此时到达servlet/jsp
- servlet处理
- servlet处理完,再回到过滤器,最后再由Tomcat服务器交给用户
(4) 过滤器的api
interface Filter //过滤器核心接口
void init(filterConfig) //初始化方法,在服务器启动的时候执行
void destroy() //销毁实例之前调用
void doFilter(request,response,filterChain) //过滤器拦截的业务处理方法
interface FilterConfig //获取过滤器在web.xml中配置的初始化参数
interface FilterChain //过滤器链参数,多个过滤器形成一个过滤器链
void doFilter(request,response) //执行下一个过滤器或者放行
(5) 对指定的请求进行过滤
<!--
/* 1.表示过滤所有的请求
-->
<filter-mapping>
<!-- filter内部名称 -->
<filter-name>DemoFilter</filter-name>
<!-- 拦截所有资源 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--
/* 2.表示过滤指定的index.jsp和list.jsp请求
-->
<filter-mapping>
<!-- filter内部名称 -->
<filter-name>DemoFilter2</filter-name>
<!-- 拦截指定资源 -->
<url-pattern>/index.jsp</url-pattern>
<url-pattern>/list.jsp</url-pattern>
</filter-mapping>
<!--
/* 3.表示过滤指定servlet内部名称的请求
-->
<filter-mapping>
<!-- filter内部名称 -->
<filter-name>DemoFilter</filter-name>
<!-- 拦截指定资源 -->
<servlet-name>IndexServlet</servlet-name>
</filter-mapping>
<!--
/* 3.表示过滤指定类型的请求
-->
<filter-mapping>
<!-- filter内部名称 -->
<filter-name>DemoFilter</filter-name>
<!-- 拦截指定类型的资源 -->
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher> //过滤请求
<dispatcher>FORWARD</dispatcher> //过滤转发
<dispatcher>INCLUDE</dispatcher> //过滤包含的页面RequestDispatcher.include(/page.jsp)
<dispatcher>ERROR</dispatcher> //过滤声明式异常信息
</filter-mapping>
(6) 自定义过滤器实例
- 写一个java类,实现Filter接口
/**
* DemoFilter.java
*/
package com.inspur.a_filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
* ClassName: DemoFilter
* Function: TODO ADD FUNCTION
* @author: xuzheng
* date: 2019-5-9 上午9:18:46
*/
public class DemoFilter implements Filter {
public DemoFilter(){
System.out.println("创建过滤器实例");
}
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
System.out.println("执行过滤器初始化方法");
// 获取过滤器在web.xml中配置的参数
String encoding = filterConfig.getInitParameter("encoding");
System.out.println(encoding);
}
/*
* 过滤器业务处理方法,在请求到达servlet之前先进入此方法处理公用的业务逻辑操作
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
System.out.println("执行过滤器业务处理方法");
chain.doFilter(request, response);
System.out.println("servlet处理完成,又回到过滤器");
}
public void destroy() {
// TODO Auto-generated method stub
System.out.println("执行过滤器销毁方法");
}
}
- 写一个servlet类
package com.inspur.a_filter;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* ClassName: IndexServlet
* Function: TODO ADD FUNCTION
* @author: xuzheng
* date: 2019-5-9 上午9:19:54
*/
public class IndexServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("处理用户请求开始。。。");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
- 配置过滤器
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<!-- 过滤器配置 -->
<filter>
<!-- 初始化参数配置 -->
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>path</param-name>
<param-value>c:/..</param-value>
</init-param>
<filter-name>DemoFilter</filter-name>
<filter-class>com.inspur.a_filter.DemoFilter</filter-class>
</filter>
<filter-mapping>
<!-- filter内部名称 -->
<filter-name>DemoFilter</filter-name>
<!-- 拦截所有资源 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 第二个过滤器配置 -->
<filter>
<filter-name>DemoFilter2</filter-name>
<filter-class>com.inspur.a_filter.DemoFilter2</filter-class>
</filter>
<filter-mapping>
<!-- filter内部名称 -->
<filter-name>DemoFilter2</filter-name>
<!-- 拦截所有资源 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>IndexServlet</servlet-name>
<servlet-class>com.inspur.a_filter.IndexServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>IndexServlet</servlet-name>
<url-pattern>/IndexServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
(7) 过滤器:统一编码处理案例
(8) 过滤器:无效数据过滤案例
(9) 过滤器:登入权限判断案例
二、监听器
(1) 监听器的定义
- 监听器主要是用来监听特定对象的创建、销毁以及属性的变化
- 是一个实现特定接口的普通java类
- java代码
(2) servlet中需要监听的类
- request
- session
- servletContext