Filter 简介:
Filter是过滤器,是javaWeb的三大组件(Servlet, Filter, Listener)之一。
Filter的功能是当用户访问某个servlet时,先执行Filter,放行后才能执行servlet,
通俗讲就是可以拦截一些请求。
Filter可以有多级,执行的先后顺序按照web.xml中的排列顺序执行。
目录
- Filter配置
- Filter编写结构
1、Filter的配置
<filter>
/* MyFilter01是创建过滤器的名字,filter.MyFilter01是具体类 */
<filter-name>MyFilter01</filter-name>
<filter-class>filter.MyFilter01</filter-class>
</filter>
/* * /MyServlet 表示过滤器将对访问Myservlet这个servlet的请求进行过滤
* 可以使用通配符/* 表示对本服务器下所有servlet进行过滤
*/
<filter-mapping>
<filter-name>MyFilter01</filter-name>
<url-pattern>/MyServlet</url-pattern>
</filter-mapping>
2、filter编写结构
例子:
public class MyFilter01 implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 过滤器也可以给出响应,但不是处理业务,它只是准备的需要
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
// 让客户端也可以看到过滤效果,相当于是把核心内容包装成了一个HTML页【HTML标签首】
out.write("<html>"
+ "<head><title>Filter and Servlet</title></head>"
+ "<body>");
out.write("这里是过滤器01工作中开始...模拟的是一号过滤器<br />");
// 但核心业务仍然得放行,交给相应的Servlet去处理,项目中,职责要清晰
chain.doFilter(request, response);
// 【HTML标签尾】
out.write("<br />这里是过滤器01工作中结束...<br />");
out.write("</body></html>");
}
}
第二个Filter:
public class MyFilter02 implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 过滤器在这里做的工作,与之前对比,仅只是想在客户端,即浏览器中也可以看到它的存在
PrintWriter out = response.getWriter();
out.write("这里是过滤器02工作中开始...模拟的是二号过滤器<br />");
// 放行后,核心业务仍然走Servlet处理
chain.doFilter(request, response);
out.write("<br />这里是过滤器02工作中结束...<br />");
}
}
编写号web.xml后运行如下servlet:
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 用servlet来模拟核心业务动作
*/
public class MyServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1这里不用再设置编码和处理中文乱码问题,因为过滤器已经预设过了
// 2这里只需要处理核心业务
PrintWriter out = response.getWriter();
out.write("这里是Servlet的输出,Servlet工作中...模拟的是核心业务");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
运行结果: