1.过滤器
过滤器Filter是Servlet的规范。(jarkata.servlet.Filter)
默认情况下,在服务器启动的时候会新建Filter对象。
1.1过滤器的方法
init方法:在Filter对象第一次被创建之后调用,并且只调用一次
doFilter方法:只要用户发送一次请求,则执行一次。发送N次请求,则执行N次。在这个方法中编写过滤规则。
destroy方法:在Filter对象被释放/销毁之前调用,并且只调用一次。
1.2过滤器的生命周期,过滤器链的执行顺序
Filter的生命周期和Servlet生命周期类似,唯一不同的是Filter默认在服务器启动的时候创建。
过滤器链的执行顺序:
通过web.xml配置文件配置,则从上到下执行;
通过注解配置,则根据字典的顺序执行。
1.3如何使用过滤器?
@WebFilter("/user/list")
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
String filterName = filterConfig.getFilterName();
ServletContext servletContext = filterConfig.getServletContext();
String parameter = filterConfig.getInitParameter("xxx");
Enumeration<String> initParameterNames = filterConfig.getInitParameterNames();
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 请求前过滤规则,request
// 这个方法:执行下一个过滤器,如果下面没有过滤器了,执行最终的Servlet
chain.doFilter(request,response);
// 请求完成后的过滤,response
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
2.监听器
监听器Listener也是Servlet的规范。
所有监听器中的方法都是不需要javaweb程序员调用的,由服务器来负责调用:当某个特殊的事件发生之后,被web服务器自动调用。
2.1Servlet规范中提供了哪些监听器?
jakarta.servlet包下:
- ServletContextListener
- ServletContextAttributeListener
- ServletRequestListener
- ServletRequestAttributeListener
jakarta.servlet.http包下:
-
HttpSessionListener
-
HttpSessionAttributeListener
该监听器需要使用@WebListener注解进行标注。
该监听器监听的是什么?是session域中数据的变化。只要数据变化,则执行相应的方法。主要监测点在session域对象上。 -
HttpSessionBindingListener
该监听器不需要使用@WebListener进行标注。
假设User类实现了该监听器,那么User对象在被放入session的时候触发bind事件,User对象从session中删除的时候,触发unbind事件。
假设Customer类没有实现该监听器,那么Customer对象放入session或者从session删除的时候,不会触发bind和unbind事件。 -
HttpSessionIdListener:session的id发生改变的时候,监听器中的唯一一个方法就会被调用。
-
HttpSessionActivationListener
1:监听session对象的钝化和活化的。
2:钝化:session对象从内存存储到硬盘文件。
3:活化:从硬盘文件把session恢复到内存。
3.拦截器
拦截器Intercepter是springMVC的规范。
Spring MVC的拦截器作用是在请求到达控制器之前或之后进行拦截,可以对请求和响应进行一些特定的处理。
3.1拦截器使用场景
- 登录验证:对于需要登录才能访问的网址,使用拦截器可以判断用户是否已登录,如果未登录则跳转到登录页面。
- 权限校验:根据用户权限对部分请求地址进行访问控制,拒绝未经授权的用户访问。
- 请求日志:记录请求信息,例如请求地址、请求参数、请求时间等,用于排查问题和性能优化。
- 更改响应:可以对响应的内容进行修改,例如添加头信息、调整响应内容格式等。
3.2拦截器和过滤器的区别
- 过滤器更注重在请求和响应的流程中进行处理,可以修改请求和响应的内容,例如设置编码和字符集、请求头、状态码等。
- 拦截器则更加侧重于对控制器进行前置或后置处理,在请求到达控制器之前或之后进行特定的操作,例如打印日志、权限验证等。
3.3如何使用拦截器
实现org.springframework.web.servlet.HandlerInterceptor接口,共有三个方法可以进行选择性的实现:
@Component
public class MyIntercepter implements HandlerInterceptor {
// 处理器方法调用之前执行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;// 返回值:true放行,false拦截
}
// 处理器方法调用之后执行
@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 {
}
}