springboot拦截器拦截提示_springboot中使用拦截器、监听器、过滤器

?拦截器、过滤器、监听器在web项目中很常见,这里对springboot中怎么去使用做一个总结.

1. 拦截器(Interceptor)

??我们需要对一个类实现HandlerInterceptor接口, 默认会实现其中的三个方法,preHandle,postHandle ,afterCompletion,其中preHandle实在Controller方法调用之前执行,postHandle是在请求处理之后进行调用,但是在视图渲染之前,即Controller方法调用之后执行,afterCompletion方法是在整个请求结束之后被调用,也是在DispatcherServlet渲染了对应识图之后执行,主要用于资源清理工作。

importorg.springframework.web.servlet.HandlerInterceptor;importorg.springframework.web.servlet.ModelAndView;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/*** 需要config配置类配合,看config目录

* 路径只有走DispatcherServlet,才会被拦截,默认静态资源不会被拦截

*@authorjared*/

public class MyInterceptor implementsHandlerInterceptor{

@Overridepublic boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throwsException {//controller方法调用之前

System.out.println("我没进controller");return true;

}

@Overridepublic void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throwsException {//请求处理之后进行调用,但是在视图被渲染之前,即Controller方法调用之后

System.out.println("我进拦截器了");

}

@Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throwsException {//在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行,主要是用于进行资源清理工作

}

}

路径只有走DispacherServlet,才会被拦截,默认静态资源不会被拦截,拦截器需要注册,一般需要在config中注册该拦截器,才能在项目中使用。

importcom.aits.interceptor.MyInterceptor;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.servlet.config.annotation.InterceptorRegistry;importorg.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configurationpublic class MyWebAppConfigurer extendsWebMvcConfigurerAdapter{/*** 添加拦截器

*@paramregistry*/@Overridepublic voidaddInterceptors(InterceptorRegistry registry) {

registry.addInterceptor(new MyInterceptor()).addPathPatterns("/*");super.addInterceptors(registry);

}

}

2. 过滤器

??过滤器需要实现ServletContextListener,需要springboot主方法类加入@ServletComponentScan注解。

importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;import javax.servlet.*;importjavax.servlet.annotation.WebFilter;importjavax.servlet.http.HttpServletRequest;importjava.io.IOException;/*** 会过滤到地址栏为以下参数的请求

* 需要主类加入@ServletComponentScan*/@WebFilter(filterName= "firstFilter",urlPatterns ={"/test/*","/hello/*"})public class FirstFilter implementsFilter {private static Logger LOG= LoggerFactory.getLogger(FirstFilter.class);

@Overridepublic void init(FilterConfig filterConfig) throwsServletException {

}

@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throwsIOException, ServletException {

HttpServletRequest req=(HttpServletRequest) servletRequest;

String requestURI=req.getRequestURI();

LOG.info("过滤到的请求-->"+requestURI);

}

@Overridepublic voiddestroy() {

}

}

@SpringBootApplication//开启servlet注解

@ServletComponentScanpublic classJaredMain {public static voidmain(String[] args) {

SpringApplication.run(JaredMain.class, args);

}

}

3. 监听器

importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importjavax.servlet.ServletContextEvent;importjavax.servlet.ServletContextListener;importjavax.servlet.annotation.WebListener;/*** 需要主类加入

* @ServletComponentScan*/@WebListenerpublic class FirstListener implementsServletContextListener{private static Logger LOG= LoggerFactory.getLogger(FirstListener.class);

@Overridepublic voidcontextInitialized(ServletContextEvent servletContextEvent) {

LOG.info("firstListener 初始化...");

}

@Overridepublic voidcontextDestroyed(ServletContextEvent servletContextEvent) {

LOG.info("FirstListener 销毁...");

}

}

区别

拦截器是基于java的反射机制的,而过滤器是基于函数回调

过滤器依赖与servlet容器,而拦截器不依赖与servlet容器

拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用

拦截器可以访问action上下文、值栈里的对象,而过滤器不能

在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

用途

过滤器,主要的用途是过滤字符编码、做一些业务逻辑判断等。

监听器,做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等

拦截器,在面向切面编程中应用的,就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法。是基于JAVA的反射机制

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值