过滤器与拦截器的区别

一、拦截器与过滤器的区别:

过滤器拦截器
基于函数回调基于java反射
依赖于servlet容器依赖于spring容器
请求进入容器后,进入servlet前进行预处理请求进入servlet后,进入controller前进行预处理
过滤器包裹servletservlet包裹拦截器
过滤器可作用于所有请求拦截器会因@ResponseBody,@RequestBody而失效

在这里插入图片描述

二、过滤器实现:

自定义过滤器需要实现Filter接口,并重写接口中的init()、doFilter()、destroy()三个方法。三者的执行情况为:

init():启动服务器时执行一次
doFilter():每调用一次过滤地址,就触发一次
destroy():关闭服务器时执行一次

controller类:

package com.nys.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @author nysheng
 */
@Controller
@RequestMapping("/test")
public class MyController {
    @GetMapping("/hello")
    @ResponseBody
    public String get(){
        System.out.println("hello");
        return "hello world";
    }
}

  1. 自定义过滤器——注解方式(@WebFilter)
package com.nys.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

/**
 * @author nysheng
 */
@WebFilter("/test/*")
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("MyFilter---->init...");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("MyFilter---->doFilter1...");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("MyFilter---->doFilter2...");
    }

    @Override
    public void destroy() {
        System.out.println("MyFilter---->destroy...");
    }
}

  1. 自定义过滤器——web.xml配置方式(即删除注解@WebFilter("/test/*")后在web.xml中加入以下内容)
  <filter>
    <filter-name>myFilter</filter-name>
    <filter-class>com.nys.filter.MyFilter</filter-class>
  </filter>
    <filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>/test/*</url-pattern>
  </filter-mapping>

注:注解方式与web.xml方式的区别

  1. 使用@WebFilter("/test/*")定义多个过滤器时,不能指定过滤器的执行顺序,其执行顺序默认为字典顺序(即过滤器AFilter.class和BFilter.class的执行顺序为AFilter.class---->BFilter.class)
  2. web.xml中配置的过滤器满足先配置先调用的规则

三、拦截器实现:

自定义拦截器的实现常用方式为实现接口HandlerInterceptor或继承其实现类HandlerInterceptorAdapter,并重写preHandle()、postHandle()、afterCompletion()三个方法。三者的执行情况为:

preHandle():controller方法执行之前执行
postHandle():controller方法返回前执行(DispatcherServlet进行视图的渲染之前)
afterCompletion():DispatcherServlet进行视图的渲染之后

  1. MyInterceptor
package com.nys.interceptor;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author nysheng
 */
public class MyInterceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        System.out.println("MyInterceptor--->preHandle...");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor--->postHandle...");
    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        System.out.println("MyInterceptor--->afterCompletion...");
    }
}

  1. springMvc-config.xml中添加配置
<mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/test/*"/>
            <bean class="com.nys.interceptor.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

相关:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值