过滤器
一、基本概念(3W1H: why, what, where,how)
1、为什么需用到过滤器?
项目开发中,经常会涉及到重复代码的实现!
注册 —- Servlet 【1. 设置编码】 —- JSP
修改 —-Servlet 【1. 设置编码】 — JSP
其他
如判断用户是否登陆,只有登陆才能有操作权限!
涉及到重复判断: 获取session,取出session数据,判断是否为空,为空说明没有登陆,不能操作; 只有登陆后,才能操作!
2、如何解决:
1)抽取重复代码,封装。
2)每个用到重复代码的地方,手动的调用。
有什么更好的方法没有,可以自动调用?——引入过滤器!
二、过滤器,设计执行流程:
1、用户访问服务器
2、过滤器: 对Servlet请求进行拦截
3、先进入过滤器, 过滤器处理
4、过滤器处理完后, 再放行, 此时,请求到达Servlet/JSP
5、Servlet处理
6、Servlet处理完后,再回到过滤器, 最后在由tomcat服务器响应用户;
三、简单实现一个过滤器HelloWorld,并了解下带有过滤器的Servlet项目的执行顺序。
Javax.servlet.*;
|– interface Filter 及过滤器
1、开发步骤:
1)写一个普通java类,实现Filter接口
2)配置过滤器
2、执行顺序:
1)HelloFilter.java
package sram.filter;
import java.io.IOException;
/*
* Filter来自servlet所以说Filter也是Servlet
*/
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import com.sun.net.httpserver.Filter.Chain;
public class HelloFilter implements Filter{
public HelloFilter(){
System.out.println("1.过滤器对象被创建了!");
}
public void init(FilterConfig filterconfig) throws ServletException {
System.out.println("2.执行过滤器初始化方法!");
}
// 过滤器业务处理方法: 在请求到达servlet之前先进入此方法处理公用的业务逻辑操作
public void doFilter(ServletRequest servletrequest,
ServletResponse servletresponse, FilterChain filterchain)
throws IOException, ServletException {
System.out.println("3.执行过滤器业务处理方法!");
//放行 (去到Servlet)
filterchain.doFilter(servletrequest,servletresponse);
System.out.println("5. Servlet处理完成,又回到过滤器");
}
public void destroy() {
System.out.println("6.销毁过滤器!");
}
}
2)HelloServlet.java
package sram.servlet;
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;
public class HelloServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("4.执行Servlet中程序");
}
}
3)web.xml
<!--过滤器配置 -->
<filter>
<!--内部名称 -->
<filter-name>HelloFilter</filter-name>
<!--过滤器类的全名 -->
<filter-class>sram.filter.HelloFilter</filter-class>
</filter>
<filter-mapping>
<!--filter内部名称 -->
<filter-name>HelloFilter</filter-name>
<!--拦截所有资源 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>sram.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/HelloServlet</url-pattern>
</servlet-mapping>
4)执行过程:
四、多个过滤器的执行情况:
五、过滤器执行的时序图:
OOAD(面向对象的分析与设计),可以使用RationRose 画出时序图分析: