Filter学习
1Filter是什么:是过滤器简称
2Filter有什么作用:在filter中可以得到代表用户请求和响应的request、response对象,因此在编程中可以使用Decorator(装饰器)模式对request、response对象进行 包装,再把包装对象传给目标资源,从而实现一些特殊需求。
Example: 举一个不恰当的例子:比如当我们喜欢的人电话给我们,我们想手机提供不一样的铃声,
让我来区分是谁打电话给我,这样我就不用拿出手机出来,才知道谁打电话给我
3Filter运行原理解析
如下图:
3Filter接口的介绍:
①FilterConfig接口:用户在配置filter时,可以使用<init-param>为filter配置一些初始化参数,当web容器实例化Filter对象,调用其init方法时,会把封装了filter初始 化参数的filterConfig对象传递进来。因此开发人员在编写filter时,通过filterConfig对象的方法,就可获得:
String getFilterName():得到filter的名称。
String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
public ServletContext getServletContext():返回Servlet上下文对象的引用。
②FilterChian接口:在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。
web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表 Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain 对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源(就是URL的资源)。
3Filter怎样使用:
使用步骤:
1自定义Filter,并实现内置的Filter接口
2复写doFilter()方法,在里面处理我们需要的逻辑
3若还有其他过滤器就调用FilterChian的doFilter()方法
4若返回页面就是用response
5注册Filter,配置Filter拦截怎样的请求
4JAVAWEB的Filter代码示例
①自定义Filter:
package com.filter.demo; 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; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CharacterEncodingFilter implements Filter{ FilterConfig filterConfig=null; String characterEncoding="UTF-8"; String str; @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { HttpServletRequest request=(HttpServletRequest) arg0; HttpServletResponse response=(HttpServletResponse) arg1; System.out.println("拦截到请求了"); System.out.println("编码为---->"+str); if (str==null) { System.out.println(); str=characterEncoding; } //2设置编码 request.setCharacterEncoding(str); response.setCharacterEncoding(str); request.setAttribute("name", "jere"); System.out.println("执行前--->name="+request.getAttribute("name")); //返回下一个Filter arg2.doFilter(request, response); System.out.println("执行后--->name="+request.getAttribute("name")); } @Override public void init(FilterConfig arg0) throws ServletException { System.out.println(this.getClass().getName()+"过滤器启动了-----"); //获取启动的时的参数 filterConfig=arg0; str=filterConfig.getInitParameter("name"); } }
自定义Servlet:
package com.filter.demo; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.jasper.tagplugins.jstl.core.Out; /** * Servlet implementation class FilterServlet */ public class FilterServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public FilterServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().print("test"); request.setAttribute("name", "jeremy"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } }
③在web.xml文件注册Servlet和Filter
<servlet> <description></description> <display-name>FilterServlet</display-name> <servlet-name>FilterServlet</servlet-name> <servlet-class>com.filter.demo.FilterServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>FilterServlet</servlet-name> <url-pattern>/FilterServlet</url-pattern> </servlet-mapping> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>com.filter.demo.CharacterEncodingFilter</filter-class> <init-param> <param-name>name</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <!-- 也可以使用URL-Pattern --> <servlet-name>FilterServlet</servlet-name> </filter-mapping>
页面测试
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <a href="/FilterDemo/FilterServlet">test Filter</a> </body> </html>
以上就是简单的FIlter示例