天天看点

拦截器Interceptor

作者:杂文论

拦截器 是 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能用。

作用:可以构成拦截器栈,完成特定功能。比如日志记录、登录判断、权限检查等作用。

好处:拦截器也可以让你将通用的代码模块化并作为可重用的类。

拦截器的应用:AOP、需要有一些业务逻辑(需要注入Bean等)

理解:

拦截器可以说相当于是个过滤器:就是把不想要的或不想显示的内容给过滤掉。拦截器可以抽象出一部分代码可以用来完善原来的方法。同时可以减轻代码冗余,提高重用率。

比如在登入一个页面时,如果要求用户密码、权限等的验证,就可以用自定义的拦截器进行密码验证和权限限制。对符合的登入者才跳转到正确页面。这样如果有新增权限的话,不用在action里修改任何代码,直接在interceptor里修改就行了。

拦截器执行流程:

(1)、程序先执行preHandle()方法,如果该方法的返回值为true,则程序会继续向下执行处理器中的方法,否则将不再向下执行;

(2)、在业务处理器(即控制器Controller类)处理完请求后,会执行postHandle()方法,然后会通过DispatcherServlet向客户端返回响应;

(3)、在DispatcherServlet处理完请求后,才会执行afterCompletion()方法。

配置

1.声明一个自定义拦截器实现HandlerInterceptor 接口

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.stereotype.Component;

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

@Component

public class HelloIntercepter implements HandlerInterceptor {

Logger log = LoggerFactory.getLogger(HelloIntercepter.class);

/**

* 进入controller方法之前

* @param request

* @param response

* @param handler

* @return

* @throws Exception

*/

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response,

Object handler) throws Exception {

log.info("拦截器------------------prehandle");

//业务处理判断拦截

//true放行

//false不放行

return true;

}

/**

* 方法内部处理完成,页面渲染之前

* @param request

* @param response

* @param handler

* @param modelAndView

* @throws Exception

*/

@Override

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,

ModelAndView modelAndView) throws Exception {

log.info("postHandle");

}

/**

* 页面渲染之后

* @param request

* @param response

* @param handler

* @param ex

* @throws Exception

*/

@Override

public void afterCompletion(HttpServletRequest request, HttpServletResponse response,

Object handler, Exception ex) throws Exception {

log.info("afterCompletion");

}

}

2.创建一个Config去实现WebMvcConfigurer,注册自定义拦截器

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.annotation.Configuration;

import org.springframework.web.servlet.config.annotation.InterceptorRegistration;

import org.springframework.web.servlet.config.annotation.InterceptorRegistry;

import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;

import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration

public class ConfigOne implements WebMvcConfigurer {

@Autowired

private HelloIntercepter loginInterceptor;

// 这个方法是用来配置静态资源的,比如html,js,css等等

@Override

public void addResourceHandlers(ResourceHandlerRegistry registry) {

}

// 这个方法用来注册拦截器,我们自己写好的拦截器需要通过这里添加注册才能生效

@Override

public void addInterceptors(InterceptorRegistry registry) {

//注册拦截器

InterceptorRegistration ir=registry.addInterceptor(new HelloIntercepter());

//配置拦截路径

ir.addPathPatterns("/**");//加拦截路径才会走配置的拦截器(进行相关业务判断)

//配置不拦截路径

ir.excludePathPatterns("/login");

}

}

3、访问路径看是否拦截(login我在上面配置了不拦截,所以不会走拦截器)

4.上面配置所有路径都走拦截器,所以除了排除的都走拦截器

这个走了拦截器!!!!

这里我是通过Bean的方式创建拦截器的,还有注解的方式,期待下一期哈,加油!

搜集了拦截器和过滤器的区别

1、过滤器基于函数回调、拦截器基于反射;

2、过滤器几乎对所有请求起作用,拦截器只对目标执行方法起作用;

3、过滤器对请求进行预处理、再交给Servlet处理并且生成响应,最后Filter再对服务器响应进行后处理;

拦截器可以在方法执行前调用(preHandle),方法执行后调用(postHandle),视图页面渲染后调用(afterCompletion)。

继续阅读