Servlet、过滤器(Filter)、拦截器(Interceptor,通常指Spring MVC中的拦截器)、监听器(Listener)是Java Web开发中不可或缺的几个组件,它们各自扮演着不同的角色,共同协作以实现复杂的Web应用逻辑。下面,我将通过一个简单的案例来阐述这四者的基本概念、作用及如何配合使用。
案例背景
假设我们正在开发一个博客系统,其中有一个需求:在用户访问文章详情页面时,需要检查用户是否登录。如果用户未登录,则重定向到登录页面;若已登录,则继续访问并记录用户的访问行为。此外,我们还想在每次请求前后记录日志,以便监控和分析。
Servlet:处理请求与响应
Servlet是Java EE规范的一部分,用于接收客户端的请求并返回响应。在我们的案例中,文章详情页面的Servlet可能看起来像这样:
java
@WebServlet("/article/details")
public class ArticleDetailsServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 检查用户是否登录,此处省略
// 假设用户已登录,渲染文章详情页面
response.getWriter().println("显示文章详情内容...");
}
}
过滤器:请求预处理与后处理
过滤器可以在请求到达Servlet之前或响应发送给客户端之后执行代码。我们可以使用过滤器来检查用户是否登录,并据此进行重定向:
java
@WebFilter("/article/*")
public class LoginFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
if (!httpRequest.getSession().getAttribute("user") != null) {
httpResponse.sendRedirect("/login");
} else {
chain.doFilter(request, response); // 继续执行后续的Servlet或过滤器
}
}
// 其他方法...
}
拦截器:Spring MVC中的请求拦截
在Spring MVC应用中,拦截器通常用于更细粒度的请求控制,比如权限检查、日志记录等。拦截器与Servlet过滤器类似,但更加灵活,因为它与Spring MVC框架紧密集成:
java
@Component
public class LoggingInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 请求前日志记录
System.out.println("Pre-processing request for URL: " + request.getRequestURL());
return true; // 继续处理请求
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 请求处理后(视图渲染前)
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 请求处理完成后(视图渲染后)
System.out.println("Completed processing request for URL: " + request.getRequestURL());
}
}
监听器:监听Web应用事件
监听器用于监听Web应用中的事件,如ServletContext的创建与销毁、会话的创建与销毁等。我们可以使用监听器来记录用户登录、注销等行为:
java
@WebListener
public class SessionListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent se) {
System.out.println("Session created: " + se.getSession().getId());
}
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("Session destroyed: " + se.getSession().getId());
}
}
总结
在这个案例中,Servlet负责处理具体的业务逻辑(如显示文章详情),过滤器用于请求预处理(如检查登录状态),拦截器在Spring MVC中提供了更细粒度的请求控制(如日志记录),而监听器则用于监听并响应Web应用中的事件(如会话的创建与销毁)。这四者相互协作,共同构建了一个功能丰富、结构清晰的Web应用。