总结:java中过滤器和拦截器的区别?

【扩展】 过滤器:Filter

概念:对目标资源的请求和响应进行过滤截取。在请求到达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()为核心方法,这里定义过滤拦截规则。

【扩展】listener监听器

概念:
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
    

【扩展】interceptor拦截器

概念:
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




如下图,容器是Tomcat,拦截器,过滤器,他们的关系结构
总结:java中过滤器和拦截器的区别?_第1张图片

Java web项目的加载顺序。
web项目部署在服务器上,由客户端发起请求到部署服务器的监听端口,通过监听端口进入服务器,然后再有服务器将请求信息发送给web项目,加载web项目首先要读取web.xml文件,【web.xml中标签的读取顺序是:
““☞”“☞”“☞””,这里注意,跟这几个标签写的前后顺序没有太大的关系】,首先读取到的是和两个节点。

总结:java中过滤器和拦截器的区别?_第2张图片

过滤器和拦截器的区别?

①:拦截器是基于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为基础的构架的程序中,优先使用拦截器。

你可能感兴趣的:(【面试】)