概念:对目标资源的请求和响应进行过滤截取。在请求到达servlet之前,进行逻辑判断,判断是否放行到servlet;也可以在一个响应response到达客户端之前进行过滤,判断是否允许返回客户端。
场景:
(用户授权的过滤器:判断用户是否有权限请求界面)
(日志信息的过滤器:过滤用户在网站的所有请求,记录轨迹 )
(负责解码的过滤器:规定请求的解码方式)
备注:过滤器依赖于servlet,一个过滤器可以加在多个servlet上,(多个过滤器也可以加在一个servlet上)
使用Filter:
(1)实现Javax.serlvet.Filter接口(对应servlet-api.jar)
package java.filter;
import javax.servlet.*;
import java.io.IOException;
/**
* @explain:定义过滤器
* @author:jimmy
* @date:2018/12/13
* @create by Intellij Idea
*/
public class MyFilter implements Filter {
/**
* 初始化
* @param filterConfig
* @throws ServletException
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
/**
* 过滤器拦截
* @param servletRequest
* @param servletResponse
* @param filterChain
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
/**
* 销毁
*/
@Override
public void destroy() {
}
}
(2)配置web.xml文件(配置文件中主要有两个点:1是定义你的filter,2是定义filter拦截的地址)
myFilter
java.filter.MyFilter
myFilter
/*
doFilter()为核心方法,这里定义过滤拦截规则。
概念:
JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。
监听ServletContext对象的创建和销毁?
实现:ServletContextListener 接口,根据要求重写创建和销毁的方法。
具体代码:
package java.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* @explain:监听ServletContent对象的创建和销毁
* @author:jimmy
* @date:2018/12/13
* @create by Intellij Idea
*/
public class MyServletContextListener implements ServletContextListener {
/**
* 对象创建
* @param sce
*/
public void contextInitialized(ServletContextEvent sce) {
}
/**
* 对象销毁
* @param sce
*/
public void contextDestroyed(ServletContextEvent sce) {
}
}
web.xml中的配置
java.listener.MyServletContextListener
HttpSession对象的创建和销毁的监听:
具体代码:实现HttpSessionListener ,重写对应方法
package java.listener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* @explain:HttpSeesion对象的创建和销毁监听
* @author:jimmy
* @date:2018/12/13
* @create by Intellij Idea
*/
public class MyHttpSessionListener implements HttpSessionListener {
/**
* 对象创建
* @param sessionEvent
*/
@Override
public void sessionCreated(HttpSessionEvent sessionEvent){
}
/**
* 对象销毁
* @param sessionEvent
*/
@Override
public void sessionDestroyed(HttpSessionEvent sessionEvent){
}
}
web.xml中的配置:
java.listener.MyHttpSessionListener
1
ServletRequest对象的创建和销毁监听?
package java.listener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
/**
* @explain:ServletRequest对象的创建和销毁监听
* @author:jimmy
* @date:2018/12/13
* @create by Intellij Idea
*/
public class MyServletRequestListener implements ServletRequestListener {
public void requestDestroyed(ServletRequestEvent sre) {
}
public void requestInitialized(ServletRequestEvent sre) {
}
}
web.xml配置:
java.listener.MyServletRequestListener
概念:
java中的拦截器是动态拦截action调用的对象。依赖于web框架,在springmvc中依赖于SpringMVC框架,在实现上基于Java的反射机制,属于AOP的一种应用,作用类似于过滤器,但是拦截器只能对Controller请求进行拦截,对其他的直接访问静态资源的请求无法拦截处理。
拦截器的使用
具体实现:实现HandlerInterceptor接口
package java.Interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
/**
* @explain:定义拦截器
* @author:jimmy
* @date:2018/12/13
* @create by Intellij Idea
*/
public class MyInterceptor implements HandlerInterceptor {
//实现HandlerInterceptor中的默认方法
}
【HandlerInterceptor接口】
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package org.springframework.web.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.ModelAndView;
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
Spring 相关配置文件中配置拦截器:
mvc:interceptors
mvc:interceptor
Java web项目的加载顺序。
web项目部署在服务器上,由客户端发起请求到部署服务器的监听端口,通过监听端口进入服务器,然后再有服务器将请求信息发送给web项目,加载web项目首先要读取web.xml文件,【web.xml中标签的读取顺序是:
““☞”“☞”“☞””,这里注意,跟这几个标签写的前后顺序没有太大的关系】,首先读取到的是和两个节点。
①:拦截器是基于java的反射机制,而过滤器基于函数回调。
②:过滤器依赖于servlet容器,拦截器不依赖于servlet容器。
③:拦截器只能对action请求起作用,而过滤器几乎对所有的请求都起作用。
④:拦截器可以访问action上下文,值栈里的对象,而过滤器不能。
⑤:在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
⑥:拦截器可以获取IOC容器中的各个bean,而过滤器就不行,(在拦截器里注入一个service,可以调用业务逻辑)。
⑦:过滤器是在请求进入容器后,但进入servlert前进行预处理的。响应请求也是,在servlet处理结束后,返回给客户端前触发。而拦截器提供了三个方法支持(1)preHandle:预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器(如我们上一章的Controller实现); 返回值:true表示继续流程(如调用下一个拦截器或处理器);false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;postHandle:后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。
afterCompletion:整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器的afterCompletion。
书中的关于过滤器和拦截器的区别?
(1)使用范围不同:Filter是Servlet规范规定的,只能用于web程序中。而拦截器既可以用于web程序,也可以用于Application、swing程序中。
(2)规范不同:Filter是在servlet规范中定义的,是Servlet容器支持的,而拦截器是在spring容器内的,是spring框架支持的。
(3)使用的资源不同:同其他的代码块一样,拦截器也是一个spring的组件,归spring管理,配置在spring文件中,因此能使用spring里的任何资源,独享。例如service对象、数据源、事务管理等,通过IOC注入到拦截器即可;而Filter不能。
(4)深度不同:Filter只在Servlet前后起作用。而拦截器能深入到方法前后、异常抛出前后等。因此拦截器的使用灵活性更大。所以在Spring为基础的构架的程序中,优先使用拦截器。