三大器:过滤器、监听器、拦截器
过滤器
过滤器属于servlet规范。
责任链模式设计。
在请求进入servlet前调用。
package javax.servlet;
public interface Filter {
public void init(FilterConfig filterConfig) throws ServletException;
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException;
public void destroy();
}
监听器
监听器也属于servlet规范
重点关注三个监听器即可:
- ServletContextListener
public interface ServletContextListener extends EventListener {
public void contextInitialized(ServletContextEvent sce);
public void contextDestroyed(ServletContextEvent sce);
}
在ServletContext创建和销毁时被调用。
spring就是通过实现这个监听器来触发容器创建操作的。
- HttpSessionListener
public interface HttpSessionListener extends EventListener {
public void sessionCreated(HttpSessionEvent se);
public void sessionDestroyed(HttpSessionEvent se);
}
在HttpSession创建和销毁时被调用。
- ServletRequestListener
public interface ServletRequestListener extends EventListener {
public void requestDestroyed(ServletRequestEvent sre);
public void requestInitialized(ServletRequestEvent sre);
}
在ServletRequest创建和销毁时被调用。
拦截器
在spring mvc中定义的。
基于动态代理实现。
在请求进入Controller前执行preHandle方法,在请求离开Controller后执行postHandle方法,在请求离开DispatcherServlet前执行afterCompletion方法。
package org.springframework.web.servlet.handler;
public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor {
/**
* This implementation always returns {@code true}.
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
/**
* This implementation is empty.
*/
@Override
public void postHandle(
HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception {
}
/**
* This implementation is empty.
*/
@Override
public void afterCompletion(
HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
/**
* This implementation is empty.
*/
@Override
public void afterConcurrentHandlingStarted(
HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
}
}
三大域:context、session、request
可以理解为共享在不同域范围内的全局变量。
context共享在web应用存在期间。一个web应用有一个context。
session共享在会话存在期间。一个会话有一个session。同一个浏览器与服务器的一段活跃交互称为一个会话,一般在没有交互后的30分钟session会被销毁。会话期间可以有多个请求和响应。
request共享在一次请求期间。
三者的关系是,一个context可以包含多个session,一个session可以包含多个request。
ServletContext、HttpSession和ServletRequest都提供了
public Object getAttribute(String name);
public void setAttribute(String name, Object o);
public void removeAttribute(String name);
来存取和删除数据。
HttpServletRequest(继承自ServletRequest)可以通过getSession方法拿到当前request所在的session,通过getServletContext方法拿到当前request所在的context。
同样的,HttpSession也可以通过getServletContext方法拿到当前session所在的context。
总结:context可以实现web应用的跨浏览器数据共享,session可以实现同一浏览器的跨请求数据共享。
网友评论