自己怎么优化我网站关键词,微信crm系统如何添加,国内app开发公司排名汇总,外贸建站优化文章目录 前言1、创建过滤器2、修改 web.xml3、运行项目并查看结果 前言
在一个 Web 应用程序中可以注册多个 Filter 程序#xff0c;每个 Filter 程序都可以针对某一个 URL 进行拦截。如果多个 Filter 程序都对同一个 URL 进行拦截#xff0c;那么这些 Filter 就会组成一个… 文章目录 前言1、创建过滤器2、修改 web.xml3、运行项目并查看结果 前言
在一个 Web 应用程序中可以注册多个 Filter 程序每个 Filter 程序都可以针对某一个 URL 进行拦截。如果多个 Filter 程序都对同一个 URL 进行拦截那么这些 Filter 就会组成一个Filter 链也称过滤器链。
Filter 链用 FilterChain 对象表示FilterChain 对象中有一个 doFilter() 方法该方法的作用是让 Filter 链上的当前过滤器放行使请求进入下一个 Filter。
Filter 链的拦截过程如图 1 所示。 图 1 Filter链
在图 1 中当浏览器访问 Web 服务器中的资源时需要经过两个过滤器 Filter1 和 Filter2。首先 Filter1 会对这个请求进行拦截在 Filter1 中处理完请求后通过调用 Filter1 的 doFilter() 方法将请求传递给 Filter2Filter2 处理用户请求后同样调用 doFilter() 方法最终将请求发送给目标资源。当 Web 服务器对这个请求做出响应时也会被过滤器拦截但这个拦截顺序与之前相反最终将响应结果发送给客户端浏览器。
为了便于读者理解 Filter 链的拦截过程以及掌握 Filter 链的使用下面通过案例演示如何使用 Filter 链拦截 MyServlet 的同一个请求。
1、创建过滤器
在 filterDemo01 项目的 com.mengma.filter 包中新建两个过滤器 MyFilter01 和 MyFilter02如 MyFilter01 和 MyFilter02 所示。
① MyFilter01
package com.mengma.filter;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MyFilter01 implements Filter {
public void init(FilterConfig fConfig) throws ServletException {
// 过滤器对象在初始化时调用可以配置一些初始化参数
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 用于拦截用户的请求如果和当前过滤器的拦截路径匹配则该方法会被调用
PrintWriter out response.getWriter();
out.write(MyFilter01br/);
chain.doFilter(request, response);
}
public void destroy() {
// 过滤器对象在销毁时自动调用释放资源
}
}② MyFilter02
package com.mengma.filter;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MyFilter02 implements Filter {
public void init(FilterConfig fConfig) throws ServletException {
// 过滤器对象在初始化时调用可以配置一些初始化参数
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 用于拦截用户的请求如果和当前过滤器的拦截路径匹配则该方法会被调用
PrintWriter out response.getWriter();
out.write(MyFilter02 Beforebr/);
chain.doFilter(request, response);
out.write(br/MyFilter02 Afterbr/);
}
public void destroy() {
// 过滤器对象在销毁时自动调用释放资源
}
}2、修改 web.xml
为了防止其他过滤器影响此次 Filter 链的演示效果需要先将 web.xml 文件中的其他过滤器的配置信息注释掉然后将 MyFilter01 和 MyFilter02 过滤器的映射信息配置在 MyServlet 配置信息前面具体如下所示。
?xml version1.0 encodingUTF-8?
web-app xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance
xmlnshttp://java.sun.com/xml/ns/javaee xmlns:webhttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd
xsi:schemaLocationhttp://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd
version3.0
filter
filter-nameMyFilter01/filter-name
filter-classcom.mengma.filter.MyFilter01/filter-class
/filter
filter-mapping
filter-nameMyFilter01/filter-name
url-pattern/MyServlet/url-pattern
/filter-mapping
filter
filter-nameMyFilter02/filter-name
filter-classcom.mengma.filter.MyFilter02/filter-class
/filter
filter-mapping
filter-nameMyFilter02/filter-name
url-pattern/MyServlet/url-pattern
/filter-mapping
servlet
servlet-nameMyServlet/servlet-name
servlet-classcom.mengma.filter.MyServlet/servlet-class
/servlet
servlet-mapping
servlet-nameMyServlet/servlet-name
url-pattern/MyServlet/url-pattern
/servlet-mapping
/web-app3、运行项目并查看结果
启动 Tomcat 服务器在浏览器的地址栏中输入 http://localhost:8080/filterDemo01/MyServlet此时浏览器窗口中的显示结果如图 2 所示。 图 2 运行结果
从图 2 中可以看出MyServlet 首先被 MyFilter01 拦截了显示出 MyFilter01 中的内容然后被 MyFilter02 拦截直到 MyServlet 被 MyFilter02 放行后浏览器才显示出 MyServlet 中的输出内容。
需要注意的是Filter 链中各个 Filter 的拦截顺序与它们在 web.xml 文件中 filter-mapping 元素的映射顺序一致由于 MyFilter01 的 filter-mapping 元素位于 MyFilter02 的 filter-mapping 元素前面因此用户的访问请求首先会被 MyFilter01 拦截然后再被 MyFilter02 拦截。