servlet之filter过滤器

时间:2023-03-09 19:09:46
servlet之filter过滤器

1、Servlet 过滤器有以下目的

  1. 在客户端的请求访问后端资源之前,拦截这些请求。
  2. 在服务器的响应发送回客户端之前,处理这些响应。

2、Filter接口

  1.每一个过滤器都需直接或间接继承Filter接口

  2.Filter的创建

    在web服务器启动时会将配置在web.xml中的过滤器保存至内存中。

  3.Filter的方法

    init():在Filter的生命周期中执行一次,在Filter创建的时候执行,可用于初始化参数、修改参数等操作。

    doFilter():做拦截操作的时候执行

    destroy():在Filter的生命中执行一次,在卸载Filter容器前被调用,用于回收Filter所占用的资源。

3、Filter的配置 

<!--过滤器测试-->
<filter>
<filter-name>TestFilter</filter-name>
<filter-class>com.controller.TestFilter</filter-class>
<init-param>
<param-name>oneLink</param-name>
<param-value>/test1</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>TestFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>ERROR</dispatcher>
</filter-mapping>

  在web.xml中添加如上配置。其中com.controller.TestFilter为自己实现的过滤器,其代码如下:

package com.controller;

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 TestFilter implements Filter { private String oneLink;
private String[] linkArr; public void init(FilterConfig filterConfig) throws ServletException {
oneLink = filterConfig.getInitParameter("oneLink");
if (!isNull(oneLink)) {
linkArr = oneLink.split(",");
}
return;
} public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
boolean isEqual = false;
for (String link : linkArr) {
String str = ((HttpServletRequest) servletRequest).getServletPath();
if(((HttpServletRequest) servletRequest).getServletPath().equals(link)){
isEqual = true;
break;
}
} if (isEqual) {
filterChain.doFilter(servletRequest, servletResponse);
} else {
httpResponse.sendRedirect("/test2");
filterChain.doFilter(servletRequest, servletResponse);
}
} public void destroy() {
} private boolean isNull(Object obj){
return obj == null || obj.equals("") ? true : false;
} }

  这样一个简单的过滤器就配置完成。

4、Filter配置参数介绍

<filter>
<filter-name>TestFilter</filter-name>
<filter-class>com.controller.TestFilter</filter-class>
<init-param>
<param-name>oneLink</param-name>
<param-value>/test1</param-value>
</init-param>
</filter>
<filter-name>:配置过滤器名称
<filter-class>com.controller.TestFilter</filter-class>:配置过滤器的实现类

<init-param>:配置需要出示化的一些参数名、参数值
注:其中<init-param>中配置的参数在web服务启动时可通过Filter中的init方法获取,如filterConfig.getInitParameter("oneLink")
<filter-mapping>
<filter-name>TestFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<url-pattern>:配置过滤请求规则
<dispatcher>:配置过滤规则,请参考web.xml里<filter-mapping>中的<dispatcher>作用