Servlet过滤器
Servlet过滤器是一个对象,可以拦截针对Web应用程序的HTTP请求。
servlet过滤器可以拦截对servlet,JSP,HTML文件或者其他静态内容的请求
为了创建一个servlet过滤器,我们必须实现javax.servlet.Filter
接口。这是一个示例servlet过滤器实现:
import javax.servlet.*; import java.io.IOException; /** */ public class SimpleServletFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { } public void destroy() { } }
首次加载servlet过滤器时,将调用servlet的init()
方法,就像servlet一样。
当HTTP请求到达过滤器拦截的Web应用程序时,过滤器可以检查请求URI,请求参数和请求标头,并基于此决定是否要阻止请求或者将请求转发到目标Servlet JSP。等等。
执行拦截的是doFilter()
方法。这是一个示例实现:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { String myParam = request.getParameter("myParam"); if(!"blockTheRequest".equals(myParam)){ filterChain.doFilter(request, response); } }
注意,doFilter()方法如何检查请求参数myParam,看它是否等于字符串" blockTheRequest"。如果不是,则通过调用filterChain.doFilter()方法将请求转发到请求的目标。如果未调用此方法,则不转发请求,而只是阻止该请求。
如果请求参数" myParam"等于" blockTheRequest",则上面的servlet过滤器只会忽略该请求。我们还可以将不同的响应写回到浏览器。就像使用Servlet一样,只需使用ServletResponse对象即可。
我们可能必须将ServletResponse强制转换为HttpResponse才能从中获取PrintWriter。否则,我们只能通过getOutputStream()
获得OutputStream
。
这是一个例子:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { String myParam = request.getParameter("myParam"); if(!"blockTheRequest".equals(myParam)){ filterChain.doFilter(request, response); return; } HttpResponse httpResponse = (HttpResponse) httpResponse; httpResponse.getWriter().write("a different response... e.g in HTML"); }
在web.xml中配置Servlet过滤器
在工作之前,我们需要在Web应用程序的web.xml文件中配置servlet过滤器。这是操作方式:
<filter> <filter-name>myFilter</filter-name> <filter-class>servlets.SimpleServletFilter</filter-class> </filter> <filter-mapping> <filter-name>myFilter</filter-name> <url-pattern>*.simple</url-pattern> </filter-mapping>
通过这种配置,所有以URL结尾的请求都以.simple
结尾的请求将被servlet过滤器拦截。所有其他都将保持不变。