spring中过滤器和拦截器_springboot拦截器顺序

spring中过滤器和拦截器_springboot拦截器顺序拦截器与过滤器的区别:1、过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。如下图:2、拦截器可以获取IOC容器中的各个bean,而过滤器就不行,因为拦截器是spring提供并管理的,spring的功能可以被拦截器使用,在拦截器里注入一个service,可以调用业务逻辑…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

拦截器与过滤器的区别:

拦截器与过滤器的区别

1、过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。
如下图:
这里写图片描述
2、拦截器可以获取IOC容器中的各个bean,而过滤器就不行,因为拦截器是spring提供并管理的,spring的功能可以被拦截器使用,在拦截器里注入一个service,可以调用业务逻辑。而过滤器是JavaEE标准,只需依赖servlet api ,不需要依赖spring。

过滤器拦截器运行先后步骤:
这里写图片描述
其中第2步,SpringMVC的机制是由DispaterServlet来分发请求给不同的Controller,其实这一步是在Servlet的service()方法中执行的.

3、过滤器的实现基于回调函数。而拦截器(代理模式)的实现基于反射,代理分静态代理和动态代理,动态代理是拦截器的简单实现。

何时使用拦截器?何时使用过滤器?

  • 如果是非spring项目,那么拦截器不能用,只能使用过滤器。
  • 如果是处理controller前后,既可以使用拦截器也可以使用过滤器。
  • 如果是处理dispaterServlet前后,只能使用过滤器。

spring boot 使用过滤器

两种方式:
1、使用spring boot提供的FilterRegistrationBean注册Filter
2、使用原生servlet注解定义Filter
两种方式的本质都是一样的,都是去FilterRegistrationBean注册自定义Filter

方式一:
①、先定义Filter:

package com.hwm.filter;

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

public class MyFilter implements Filter { 
   
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // do something 处理request 或response
        System.out.println("filter1");
        // 调用filter链中的下一个filter
        filterChain.doFilter(servletRequest,servletResponse);
    }
    @Override
    public void destroy() {

    }
}

②、注册自定义Filter

@Configuration
public class FilterConfig { 
   

    @Bean
    public FilterRegistrationBean registrationBean() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new MyFilter());
        filterRegistrationBean.addUrlPatterns("/*");
        return filterRegistrationBean;
    }
}

方式二:

// 注入spring容器
@Component
// 定义filterName 和过滤的url
@WebFilter(filterName = "my2Filter" ,urlPatterns = "/*")
public class My2Filter implements Filter { 
   
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("filter2");
    }
    @Override
    public void destroy() {

    }
}

Spring boot拦截器的使用:

①、定义拦截器:

public class MyInterceptor implements HandlerInterceptor { 
   

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
        System.out.println("afterCompletion");
    }
}

②、配置拦截器:

@Configuration
public class InterceptorConfig implements WebMvcConfigurer { 
   

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor());
    }
}

③Controller演示:

@RestController
public class UController {

    @GetMapping("/home")
    public String home(){
        System.out.println("home");
        return "myhome";
    }## 标题 ##
}

输出:
preHandle
home
postHandle
afterCompletion

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/172382.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月23日 上午9:46
下一篇 2022年8月23日 上午10:00


相关推荐

  • JS ajax 例子「建议收藏」

    JS ajax 例子「建议收藏」用js,jQuery编写ajax的样式,三种写法,例子://用js原生写法functionsendGet(url){xhr.onreadystatechange=function(){ if(xhr.readyState==4&&xhr.status==200){ //获取服务器响应 document…

    2022年7月13日
    18
  • 泰勒级数_泰勒公式常用

    泰勒级数_泰勒公式常用泰勒公式(TaylorSeries)能把大多数的函数展开成幂级数,即$f(x)=\displaystyle{\sum_{n=0}^{\infty}A_nx^n}$式子当中只有加法与乘法

    2022年8月2日
    10
  • 完美解决:不能为虚拟电脑打开一个新任务的问题

    完美解决:不能为虚拟电脑打开一个新任务的问题安装最新版 VirtualBox 后出现的问题在百度上百度了一下 试了好几种方法都解决不了 然后照着百度经验上讲解的方法试了一次 结果成功咯 后面又将软件卸载重新安装 可是都失败了 最后问了一位老师 她讲解的方法就是将 virtualbox 软件以管理员的方式运行 结果就是可以成功启动虚拟机解决方法 将虚拟机设置为以管理员方式运行 1 鼠标右键打开 virtualbox 软件的属性 2 先选择兼容性 然后在选择更改所有用户的设置 3 勾选以管理员身份运行此程序 4 最后点击确定即可 然后在重新运行 virtualbo

    2026年3月19日
    2
  • Docker 通过watchtower对registry私有库的容器的自动更新

    Docker 通过watchtower对registry私有库的容器的自动更新小白防忘 首先得准备好两个虚拟机 我自己用的是 Ubuntu 镜像 并且两台虚拟机能够 ping 通 不能通信就不能进行镜像的拉取之类的操作了 方便实现更新 registry 仓库以及通过 watchtower 实现容器的自动更新 后面会有解释为什么使用两台虚拟机 registry 和 watchtower 可以在任意一个准备的虚拟机上运行 以下所有命令都是使用 root 账户进行操作 1 配置 registry 自己的私有库为了安全考虑是需要实现登录认证的 我自己用的是一种最简单的方式 通过 htpasswd 实现登录认证

    2026年3月17日
    1
  • POJ 2533-Longest Ordered Subsequence(DP)

    POJ 2533-Longest Ordered Subsequence(DP)

    2022年1月18日
    47

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号