Servlet过滤器(Filter)
Servlet过滤器(Filter)是Java Servlet技术中的一种重要组件,它允许开发者在请求进入目标资源(如Servlet或JSP页面)之前或之后执行某些预处理或后处理任务。过滤器主要用于实现如日志记录、权限检查、字符编码转换、压缩响应数据等通用功能。
以下是一个Servlet过滤器的基本使用案例:
创建一个Servlet过滤器类:
java
import javax.servlet.*;
import java.io.IOException;
/**
* @author liwei
*/
public class LoggingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 这里可以初始化过滤器所需资源
// 例如,从web.xml或注解中读取配置信息
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
long startTime = System.currentTimeMillis();
// 在请求到达目标资源前执行的操作
//比如校验用户是否登录等
if(user == null){
// response 响应未登录的提示
}else{
chain.doFilter(request, response); // 执行过滤链,继续处理请求
}
long endTime = System.currentTimeMillis();
// 在请求离开目标资源后执行的操作
ServletResponseWrapper responseWrapper = (ServletResponseWrapper) response;
String requestedUrl = ((HttpServletRequest) request).getRequestURI();
System.out.println("Time spent processing request for " + requestedUrl + " was " +
(endTime - startTime) + " milliseconds.");
// 这里可以添加更多后处理操作,如修改响应内容等
}
@Override
public void destroy() {
// 在Web应用关闭时执行的清理工作
}
}
配置过滤器:
在传统的web.xml配置方式下,你需要在部署描述符中声明并配置过滤器:
xml
<filter>
<filter-name>loggingFilter</filter-name>
<filter-class>com.example.LoggingFilter</filter-class>
<!-- 可以在这里添加初始化参数 -->
</filter>
<filter-mapping>
<filter-name>loggingFilter</filter-name>
<url-pattern>/*</url-pattern> <!-- 这表示过滤所有请求 -->
</filter-mapping>
或者使用注解方式进行配置:
kotlin
import javax.servlet.annotation.WebFilter;
@WebFilter(filterName = "loggingFilter", urlPatterns = "/*")
public class LoggingFilter implements Filter { ... }
urlPatterns = "/*"
是在Servlet或Servlet过滤器的配置中使用的通配符模式,用于指定过滤器或Servlet应该处理哪些URL请求。这里的*
是一个通配符,代表任意字符串。
在Servlet或过滤器的配置上下文中,urlPatterns
属性指定了该组件应当响应的URL路径列表。当值设置为 "/*"
时,意味着这个过滤器或Servlet将匹配所有的请求,无论请求的URL是什么,只要它们属于该Web应用的上下文根路径下。
例如,假设Web应用的上下文路径是 /myApp
,那么配置 urlPatterns = "/*"
的过滤器或Servlet将会处理以下所有类型的请求:
/myApp/home
/myApp/about
/myApp/login
/myApp/service/api
/myApp/assets/images/logo.png
"/*"
表示该过滤器或Servlet将拦截并处理该Web应用下的所有URL请求。
也可以配置为:
/myApp/service/*
表示该过滤器或Servlet将拦截并处理该Web应用下的/myApp/service/
URL请求。