首页 > 其他分享 >谈谈过滤器和拦截器的区别

谈谈过滤器和拦截器的区别

时间:2022-11-06 18:56:53浏览次数:57  
标签:拦截器 request Filter 谈谈 过滤器 拦截 response

一、拦截器和过滤器的区别

1、拦截器(Interceptor)只对action请求起作用 即对外访问路径

而过滤器(Filter)则可以对几乎所有的请求都能起作用 包括css js等资源文件

2、拦截器(Interceptor)是在Servlet和Controller控制器之间执行

而过滤器(Filter)是在请求进入Tomcat容器之后 但是在请求进入Servlet之前执行

web.xml加载顺序:context- param -> listener -> filter -> servlet

在请求结束返回时也是一样 是在Servlet处理完之后返回给前端之间执行

 

 

 

二、拦截器和过滤器的代码实现

1、拦截器

首先需要一个拦截器类 并且这个类要实现HandlerInterceptor接口

这个接口里面有三个方法:

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
{
    // 在拦截点(Controller方法处理之前)执行拦截 若返回的是false则中断执行 反之亦然
    return false;
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception
{
    // 在处理过程中(Controller方法处理完之后  DispatcherServlet进行视图的渲染之前)执行拦截
}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception
{
    // 在DispatcherServlet进行视图的渲染后 返回前进行拦截
}

稍微写一下方法:

@Override
 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
 {
     // 在Controller方法处理之前执行拦截 若返回的是false则中断执行 反之亦然
 
     // 判断当前的User是否为空 若不为空则不拦截
     if (request.getSession().getAttribute("USERINFO")!=null)
     {
         return true;
     }
     // 进行拦截 返回登录界面
     response.sendRedirect(request.getContextPath()+"/user/doLogin.do");
     return false;
 }

然后需要去SpringMVC的配置文件中配置拦截器:

<!-- 配置拦截器 -->
<mvc:interceptors>
    <mvc:interceptor>
        <!-- 拦截所有的mvc控制器(Controller) -->
        <mvc:mapping path="/**"/>
        <!-- 放行机制 指定对某个页面不进行拦截 -->
        <!-- 拦截器只对action起作用 因此填入的不是页面路径 而是方法 -->
        <mvc:exclude-mapping path="/user/doLogin.do"/>
        <!-- 指定使用哪个拦截器 -->
        <bean class="net.zjitc.interceptor.LoginInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

如此 当访问的请求不为/user/doLogin.do会被拦截然后重定向到/user/doLogin.do

但是访问其它的页面不会被拦截

想要让页面也被拦截?你需要过滤器!

2、过滤器

同理 需要一个过滤器类 然后实现javax.servlet.Filter接口

注意Filter的路径别导错了 因为有很多同名接口

public class LoginFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException
    {
        // 过滤器初始化
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
    {

    }

    @Override
    public void destroy()
    {
        // 过滤器销毁
    }
}

稍微写一下方法:

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
{
    // ServletRequest是一个接口 而HttpServletRequest是接口的实现
    // 但有些方法是HttpServletRequest独有的 例如getSession()
    // HttpServletRequest接口继承自ServletRequest接口 增加了和Http相关的方法
    // 但是我们可以强制转换
    HttpServletRequest request=(HttpServletRequest)servletRequest;
    HttpServletResponse response=(HttpServletResponse)servletResponse;

    // 若用户没有登录
    if (request.getSession().getAttribute("USERINFO")==null && request.getRequestURI().indexOf("/user/doLogin.do")==-1)
    {
        response.sendRedirect(request.getContextPath()+"/user/doLogin.do");
    }
    // 若用户已经登录 则继续下一个请求(继续访问)
    filterChain.doFilter(request,response);
}

然后需去web.xml中配置过滤器:

<!-- 配置自定义的Filter 实现登录控制 -->
 <filter>
     <filter-name>sessionFilter</filter-name>
     <filter-class>net.zjitc.filter.LoginFilter</filter-class>
 </filter>
 <filter-mapping>
     <filter-name>sessionFilter</filter-name>
     <!-- 拦截所有的页面 /斜杠代表在webapp目录下 -->
     <url-pattern>/pages/*</url-pattern>
     <url-pattern>/css/*</url-pattern>
     <url-pattern>/img/*</url-pattern>
     <url-pattern>/failer.jsp</url-pattern>
 </filter-mapping>

三、总结

拦截器和过滤器其实都是AOP编程思想的实现

都可以体现例如权限的检查 日志的记录等功能

但是有不同之处:

1、使用范围不同
  • 拦截器既可以用在web层 又可以用在Application和Swing程序中
  • 而filter是Servlet规范规定的 只能用于web程序中
2、规范不同
  • 拦截器是在Spring容器内的 是Spring框架支持的
  • 而filter是Servlet规范规定的 是Servlet容器支持的

1、什么是Filter及其作用介绍

(1)概念

Servlet规范中三个技术 Servlet Listener Filter(顺序为L F S)

Filter是sun公司中servlet2.3后增加的一个新功能,在javaEE中定义了一个接口 javax.servlet.Filter来描述过滤器

(2)作用

通过Filter可以拦截访问web资源的请求与响应操作。

WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

(3)举例

在java web中,针对传入的request,或response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符。

2、Filter API介绍

Filter是javax.servlet包下的一个接口主要有以下三个方法

destory()
doFilter(ServletRequest request,ServletResponse response,FilterCjain chain)
init(FilterConfig filterConfig)

3、Filter链与Filter生命周期

(1)Filter链介绍

多个Filter对同一个资源进行了拦截,那么当我们在开始的Filter中执行chain.doFilter(request,response)时,是访问下一下Filter,直到最后一个Filter执行时,它后面没有了Filter,才会访问web资源。

(2)关于多个FIlter的访问顺序问题

如果有多个Filter形成了Filter链,那么它们的执行顺序是怎样确定的?

它们的执行顺序取决于在web.xml文件中配置的先后顺序。

(3)Filter生命周期

  • 当服务器启动,会创建Filter对象,并调用init方法,只调用一次.
  • 当访问资源,路径与Filter的拦截路径匹配,会执行Filter中的doFilter方法,这个方法是真正拦截操作的方法.
  • 当服务器关闭时,会调用Filter的destroy方法来进行销毁操作
  • 过滤器是JavaEE标准,采用函数回调的方式进行。是在请求进入容器之后,还未进入Servlet之前进行预处理,并且在请求结束返回给前端这之间进行后期处理。

四、拦截器

拦截器是spring容器的,是spring支持的

java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。

在面向切面编程AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截,然后在之前或之后加入某些操作。

比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。

五、过滤器和拦截器的区别

  • ①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
  • ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
  • ③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
  • ④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
  • ⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
  • ⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。拦截器可以获取ioc中的service bean实现业务逻辑。

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

Spring MVC中每个控制器中可以定义多个请求处理方法,我们把这种请求处理方法简称为Action

 

 参考地址 https://mp.weixin.qq.com/s/whFsabhYFud4vr3TosCCkw

标签:拦截器,request,Filter,谈谈,过滤器,拦截,response
From: https://www.cnblogs.com/mssrecord/p/16863362.html

相关文章

  • 谈谈什么叫vue实例 vue应用 vue组件
    new一个vue对象就形成一个vue实例//用于挂载vue应用的dom元素 //定义用于挂载vue应用的dom元素<divid="app">//自定义组件<component01></component01>......
  • SpringMvc——拦截器学习
    1、拦截器(Interceptor)是一种动态拦截方法调用的机制作用:在指定的方法调用前后执行预先设定后的的代码阻止原始方法的执行2、拦截器与过滤器区别归属不同:Filter属于Servle......
  • JAVAWeb - Filter(过滤器)
    Filter:过滤器,用来过滤网站数据;处理中文乱码登录验证....过滤器的分析:我们用户在使用web浏览器访问web服务器的时候;以往的过程都是web服务器直接去寻址拿资源(servlet......
  • springboot整合项目-拦截器HandlerInterceptor
    拦截器在SpringMVC中拦截请求是通过处理器拦截器HandlerInterceptor来实现的,它拦截的目标是请求的地址。在SpringMVC中定义一个拦截器,需要实现HandlerInterceptor接口。......
  • 在登录上运用拦截器
    简述:跟着狂神学Java,使用SpringMVC的拦截器,敲的一个小demo,主要理解拦截器的使用。也可以去看看狂神的笔记  https://www.kuangstudy.com/zl/ssm#header3拦截器拦截器......
  • Spring MVC基码整理- 请求参数接收处理、响应、拦截器、上传文件、拦截器、异常处理基
    大家如有疑问和讨论及时留言一、springMVC请求原理图 1.1DispatcherServlet:前端控制器用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServ......
  • SpringBoot笔记:拦截器Interceptor和过滤器Filter
    一、拦截器InterceptorSpringBoot中定义拦截器与MVC中是一样的,区别在于拦截器的配置,MVC是配置在配置文件中的,SpringBoot中则是配置在配置类中的。(SpringBoot中的配置类需......
  • 过滤器设计模式
    过滤器设计模式:按照指定的顺序进行过滤,由一个过滤器链接口,一个起切换作用的过滤器链接口实现类,若干个过滤器链接口实现类,一个过滤器链适配器类组成。过滤器链接口:packag......
  • SpringBoot 过滤器和拦截器
    过滤器实现过滤器需要实现javax.servlet.Filter接口。重写三个方法。其中init()方法在服务启动时执行,destroy()在服务停止之前执行。可用两种方式注册过滤器:使用......
  • .net 6 在异常过滤器中记录post参数 EnableBuffering
    在请求到达过滤器时Steam已经被读取了,此时我们在过滤器中使用EnableBuffering并没有起作用,还需要在中间件里使用EnableBuffering在.net6有一些稍微的不同1.在program......