一、定义:
- 是一种特殊的Servlet,可以用来对请求进行过滤,多个过滤器可以形成过滤链;
- 当请求发送到servlet之前,可以用过滤器截获和处理请求,在servlet结束工作之后,在响应发回给客户之前,可以用过滤器处理响应。
- 实现javax.servlet.Filter接口里面的 init,doFilter、destroy等抽象方法,是过滤器的生命周期。
- 过滤器的工作原理:
二、Web.xml中的配置声明
- 根据servlet2.3规范,filter执行是按照 filter-mapping 先后顺序进行执行;
- 第一段代码:声明过滤器名;第二段代码:将过滤器映射到你想过滤的web 资源 声明对应URL模式的过滤器映射
<filter> <filter-name> 文件名 </filter-name> <filter-class> 包名. 文件名 </filter-class> <init-param>{可选} <param-name>变量名 </param-name> <param-value> 变量 </param-value> </init-param> </filter>
<filter-mapping> <filter-name>文件名</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
- 若与servlet有联系,需插入下一段代码:
<servlet>
<servlet-name>Demo1</servlet-name>
<servlet-class>servlet.Demo1</servlet-class>
</servlet>
三、与servlet联系的例子——解决中文问题
1、创建新的javaweb工程TestFL,在filter包下创建CharacterEncoderFilter.java——
public class CharacterEncoderFilter implements Filter{ private FilterConfig filterConfig=null; public void destroy() { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { String charset=filterConfig.getInitParameter("charset"); req.setCharacterEncoding(charset); resp.setCharacterEncoding(charset); resp.setContentType("text/html;charset="+charset); chain.doFilter(req, resp); } public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig=filterConfig; } }
2、servlet包下的Demo2.java——
public class Demo2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username=request.getParameter("username"); System.out.println(username); response.getWriter().write("中文"); } }
3、在web.xml中要再声明一次filter文件名、变量名和servlet文件 :
(注意此处的/*是代表网址不需要写文件名,只需要写 http://localhost:8080/TestFL/,
若为/abc/*,则要写为 http://localhost:8080/TestFL/abc/ 才能运行)
<filter> <filter-name>CharacterEncoderFilter</filter-name> <filter-class>filter.CharacterEncoderFilter</filter-class> <init-param> <param-name>charset</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncoderFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>Demo1</servlet-name> <servlet-class>servlet.Demo1</servlet-class> </servlet> <servlet-mapping> <servlet-name>Demo1</servlet-name> <url-pattern>/Demo1</url-pattern> </servlet-mapping>
3、在jsp文件中设计个简单form:(记得将pageEncoding改为utf-8)
<form action="/TestFL/Demo2" method="post"> 用户名:<input name="username"/> <input type="submit" value="提交" /> </form>
4、打开tomcat服务,Redeploy部署文件,在浏览器上运行http://localhost:8080/TestFL/,提交后如图所示:(所有页面的请求都要经过该过滤器先行过滤 )