Servlet 编写过滤器学习笔记

什么是Servlet过滤器

Servlet 过滤器是 Java Web 应用中一种可重用、可插拔的组件,它可以被用于拦截、检查、转换或处理请求和响应。它通常被用于实现安全验证、日志记录、性能监控、字符编码转换等功能。

过滤器的执行顺序

在 Java Web 应用中,一个请求需要经过多个过滤器(如果有),最后才能到达目标 Servlet。过滤器的执行顺序由它们在 web.xml 配置文件中的顺序决定。先配置的过滤器会先被执行,后配置的过滤器会后被执行。

过滤器实例

以下是一个简单的 Servlet 过滤器,它用于检查请求中是否包含名为“username”的参数,如果没有,则重定向到登录页面。

javaCopy Code
package com.example.filters; 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 UsernameFilter implements Filter { private FilterConfig filterConfig; @Override public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; if (httpRequest.getParameter("username") == null || httpRequest.getParameter("username").isEmpty()) { httpResponse.sendRedirect(httpRequest.getContextPath() + "/login.jsp"); } else { chain.doFilter(request, response); } } @Override public void destroy() { this.filterConfig = null; } }

过滤器的配置

要把一个过滤器应用于 Servlet,需要在 web.xml 配置文件中进行如下配置:

xmlCopy Code
<filter> <filter-name>UsernameFilter</filter-name> <filter-class>com.example.filters.UsernameFilter</filter-class> </filter> <filter-mapping> <filter-name>UsernameFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

这里我们把该过滤器应用于所有 URL 上。也可以通过 <url-pattern> 子元素来指定过滤器应用于哪些 URL。