㈠ 什么是过滤器?
servlet规范当中定义的一种特殊的组件,可以拦截servlet容器调用的过程并进行相应的处理。
㈡ 如何写一个过滤器?
step1,写一个java类,实现Filter接口。
step2, 在doFilter方法里面,编写拦截处理逻辑。
step3, 配置过滤器(web.xml,告诉容器哪一些请求需要拦截<url-pattern>必须相同才能拦截)。
㈢ 过滤器的优先级
如果有多个过滤器都满足过滤的条件,则容器依据<filter-mapping>的先后顺序来调用过滤器。
㈣ 初始化参数
step1,使用<init-param>为过滤器添加初始化参数。
<filter>
<filter-name>......</filter-name>
<filter-class>......</filter-class>
<init-param>
<param-name>illegalStr</param-name>
<param-value>cat</param-value>
</init-param>
<filter>
step2,使用FilterConfig对象的getInitParameter方法来读取
比如:config.getInitParameter("illegalStr");
代码示例:
public class CommentFilter1 implements Filter{
private FilterConfig config;
public CommentFilter1(){
System.out.println("Filter1's constructor...");
}
/**
* 容器在删除过滤器之前,会调用
* destroy方法。
*/
public void destroy() {
System.out.println("Filter1's destroy...");
}
/**
* 容器会调用doFilter方法来处理请求。
* 容器会将request对象和response对象作为
* 参数传给doFilter方法。
* FilterChain对象有一个doFilter方法,如果该
* 方法调用了,表示让容器继续向后调用后续的
* 过滤器或者servlet。
*/
public void doFilter(ServletRequest arg0,
ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {
System.out.println("Filter1's doFilter begin...");
HttpServletRequest request = (HttpServletRequest)arg0;
HttpServletResponse response = (HttpServletResponse)arg1;
request.setCharacterEncoding("utf-8");
String content = request.getParameter("content");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//读过滤器的初始化参数
String illegalStr = config.getInitParameter("illegalStr");
if(content.indexOf(illegalStr) != -1){
out.println("评论当中包含了敏感字");
}else{
//调用后续的过滤器或者servlet
arg2.doFilter(arg0, arg1);
}
System.out.println("Filter1's doFilter end.");
}
/**
* 容器启动之后,会立即创建过滤器对象,
* 接下来,会调用init方法。在调用init方法之前,
* 容器会先创建好一个符合FilterConfig接口要求
* 的对象,该对象可以用来访问过滤器的初始
* 化参数(getInitParameter(String paraname))。
*/
public void init(FilterConfig arg0) throws ServletException {
System.out.println("Filter1's init...");
config = arg0;
}
}
web.xml配置
<filter>
<filter-name>filter1</filter-name>
<filter-class>web.CommentFilter1</filter-class>
<!-- 初始化参数 -->
<init-param>
<param-name>illegalStr</param-name>
<param-value>cat</param-value>
</init-param>
</filter>
<filter>
<filter-name>filter2</filter-name>
<filter-class>web.CommentFilter2</filter-class>
</filter>
<filter-mapping>
<filter-name>filter2</filter-name>
<url-pattern>/comment</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>filter1</filter-name>
<url-pattern>/comment</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>CommentServlet</servlet-name>
<servlet-class>web.CommentServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CommentServlet</servlet-name>
<url-pattern>/comment</url-pattern>
</servlet-mapping>