springmvc过滤器和拦截器的区别_拦截器和过滤器的区别面试

springmvc过滤器和拦截器的区别_拦截器和过滤器的区别面试SpringMVC中的过滤器和拦截器文章目录SpringMVC中的过滤器和拦截器一、过滤器二、拦截器三、小结一、过滤器​ 过滤器Filter是通过实现java.servlet.filter接口实现过滤器功能,作用是用于对传入的request和响应的response进行一些处理,比如对请求参数进行校验,或者设置、检验头部信息,再或者对一些非法行为进行校验。由实现的接口可知,过滤器是依赖于servlet容器。所以由于过滤器不依赖于spring容器,它也就无法获取到容器中的对象。创建一个过滤器类继承j

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

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

SpringMVC中的过滤器和拦截器

一、过滤器

​ 过滤器Filter是通过实现java.servlet.filter接口实现过滤器功能,作用是用于对传入的request和响应的response进行一些处理,比如对请求参数进行校验,或者设置、检验头部信息,再或者对一些非法行为进行校验。由实现的接口可知,过滤器是依赖于servlet容器。所以由于过滤器不依赖于spring容器,它也就无法获取到容器中的对象。

创建一个过滤器类继承java.servlet.filter接口,实现filter中的拦截方法。

package com.example.demo.modules.filter;

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

/** * @Description: * @date : 2020/6/9 */
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 { 
   
		// 过滤器的具体执行方法
	}

	@Override
	public void destroy() { 
   

	}
}
  1. 把创建的过滤器类加入过滤器链中
package com.example.demo.modules.filter;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.Filter;

/** * 创建两个过滤器myFilter和myFilter2,并且分别添加到FilterRegistrationBean * @Description: * @date : 2020/6/9 */
@Configuration
public class ConfigBean { 
   

	@Bean
	public FilterRegistrationBean filterRegistrationBean(){ 
   
		FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
		filterRegistrationBean.setFilter(myFilter());
		filterRegistrationBean.setName("myFilter");
		filterRegistrationBean.addUrlPatterns("/*");
		filterRegistrationBean.setOrder(1);
		return filterRegistrationBean;
	}

	@Bean
	public FilterRegistrationBean filter2RegistrationBean(){ 
   
		FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
		filterRegistrationBean.setFilter(myFilter2());
		filterRegistrationBean.setName("myFilter2");
		filterRegistrationBean.addUrlPatterns("/*");
		filterRegistrationBean.setOrder(2);
		return filterRegistrationBean;
	}

	@Bean
	public Filter myFilter(){ 
   
		return new MyFilter();
	}

	@Bean
	public Filter myFilter2(){ 
   
		return new MyFilter();
	}
}

二、拦截器

拦截器Interceptor是通过实现org.springframework.web.servlet包的HandlerInterceptor接口实现,这个接口是spring容器的接口,所以它是依赖于spring容器的。主要作用是AOP的思想,可以对某一个方法进行横切,做一些业务逻辑。

1.编写自定义拦截器类

package com.example.demo.modules.interceptor;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

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

/** * @Description: * @date : 2020/6/9 */
@Slf4j
public class CustomHandlerInterceptor implements HandlerInterceptor { 
   

	@Override
	public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { 
   
		log.info("请求调用之前");
		return false;
	}

	@Override
	public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { 
   
		log.info("请求调用之后");
	}

	@Override
	public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { 
   
		log.info("afterCompletion:请求调用完成后回调方法,即在视图渲染完成后回调");
	}
}

2.注册自定义拦截器

package com.example.demo.modules.interceptor;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/** * 在spring2.0中WebMvcConfigurerAdapter已经过时,这里只是为了演示效果, * 有兴趣可以看下spring2.0中的WebMvcConfigurer * @Description: * @date : 2020/6/9 */
@Configuration
public class WebMvcConfigurer extends WebMvcConfigurerAdapter { 
   

	@Override
	public void addInterceptors(InterceptorRegistry registry) { 
   
		//super.addInterceptors(registry);
		registry.addInterceptor(getHandlerInterceptor()).addPathPatterns("/*");
	}

	@Bean
	public static HandlerInterceptor getHandlerInterceptor(){ 
   
		return new CustomHandlerInterceptor();
	}
}

过滤器和拦截器执行过程图

​ 在请求到达容器前,进入Filter过滤器链,执行完过滤器链上每个Filter#doFilter()方法后,进入Servlet#service()方法,然后由dispatcher分发器将请求方法给对应映射成功的处理器controller,在进入controller具体方法之前,会被先进入Interceptor#preHandler()方法,然后再进入controller的具体返回,执行之后进入Interceptor#postHandler()这里主要是拦截了controller方法执行之后到返回的数据模型到达视图解析器之前,接着进入Interceptor#afterCompletion()方法,主要可以操作返回客户端之前的逻辑,最后返回到过滤链中各个Filter的调用点,可以处理返回到客户端的跳转等逻辑。

springmvc过滤器和拦截器的区别_拦截器和过滤器的区别面试

三、小结

​ 过滤器是servlet中的接口,主要可以用于在请求进入到servlet之前拦截请求HttpServletRequest并根据需要进行一些检查等逻辑操作,也可以在HttpServletResponse返回到客户端之前进行一些逻辑操作。

​ 拦截器是spring中的接口,所以它可以获取到spring中的一些bean和其他的一些资源,在面向切面编程中应用比较广,拦截其实就是一种AOP策略。

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

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

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


相关推荐

  • mysql 修改隔离级别_设置mysql隔离级别

    mysql 修改隔离级别_设置mysql隔离级别1.查看当前会话隔离级别select@@tx_isolation;2.查看系统当前隔离级别select@@global.tx_isolation;3.设置当前会话隔离级别setsessiontransactionisolatinlevelrepeatableread;4.设置系统当前隔离级别setglobaltransactionisolationlevelrepeata…

    2022年6月15日
    436
  • n8n打造属于你的开源自动化工作流平台(完整指南)

    n8n打造属于你的开源自动化工作流平台(完整指南)

    2026年3月15日
    2
  • EasyPlayer实现视频的局部缩放、平移功能(类似快手视频)「建议收藏」

    EasyPlayer实现视频的局部缩放、平移功能(类似快手视频)「建议收藏」EasyPlayer实现视频的局部缩放、平移功能(类似快手视频)在预览图片的时候,利用手势控制图片的缩放、平移,已经是智能手机时代最基本的操作。而对于视频,很少有播放器支持这样的操作。实际上,在观看视频的时候,我们可能会想观看某个区域的局部细节,需要把该区域放大来观看,EasyPlayer播放器基于这样的需求,提供了局部放大的功能。感谢github上开源库PhotoView,它在ImageView

    2022年6月29日
    80
  • 列举出linux文件和目录常用的命令_查看centos根目录下有哪些内容

    列举出linux文件和目录常用的命令_查看centos根目录下有哪些内容目录命令总览ls(英文全拼:listfiles):列出目录及文件名cd(英文全拼:changedirectory):切换目录pwd(英文全拼:printworkdirectory):显

    2022年7月30日
    13
  • 如何删除带有密码的赛门铁克企业版客户端?

    如何删除带有密码的赛门铁克企业版客户端?如何删除带有密码的赛门铁克企业版客户端?NortonAntiVirus的客户或赛门铁克防病毒客户尤其是企业版客户端可以安装作为管理网络安装类型由赛门铁克防病毒服务器。当赛门铁克防病毒客户端的管理,系统会提示输入密码时,卸载客户端通过在本地计算机上控制面板添加或删除程序Applet的。如果您不知道或忘记密码,客户端是无法卸载或删除。客户端卸载的密码是不同的从服务器组密码,可以…

    2022年5月7日
    102
  • 大数据与云计算和物联网之间的关系是什么_大数据信息主要安全问题不包括

    大数据与云计算和物联网之间的关系是什么_大数据信息主要安全问题不包括大数据时代的到来,是全球知名咨询公司麦肯锡最早提出的,麦肯锡称:“数据,已经渗透到当今每一个行业和业务职能领域,成为重要的生产因素。人们对于海量数据的挖掘和运用,预示着新一波生产率增长和消费者盈余浪潮的到来。”《互联网进化论》一书中提出“互联网的未来功能和结构将于人类大脑高度相似,也将具备互联网虚拟感觉,虚拟运动,虚拟中枢,虚拟记忆神经系统”,并绘制…

    2026年4月17日
    7

发表回复

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

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