是 SpringMVC 定制设计框架自己的,定制设计只有使用了 SpringMVC 定制设计框架的工程才能用。
作用:定制设计可以构成拦截器栈,定制设计完成特定功能。定制设计比如日志记录、登录判断、定制设计权限检查等作用。
好处:定制设计拦截器也可以让你将通定制设计用的代码模块化并作为定制设计可重用的类。
拦截器的应用:、需要有一些业务逻辑(需要注入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;@Componentpublic 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"); }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
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;@Configurationpublic 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"); }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
3、访问路径看是否拦截(login我在上面配置了不拦截,所以不会走拦截器)
4.上面配置所有路径都走拦截器,所以除了排除的都走拦截器
这个走了拦截器!!!!
这里我是通过Bean的方式创建拦截器的,还有注解的方式,期待下一期哈,加油!
搜集了拦截器和过滤器的区别
1、过滤器基于函数回调、拦截器基于反射;
2、过滤器几乎对所有请求起作用,拦截器只对目标执行方法起作用;
3、过滤器对请求进行预处理、再交给Servlet处理并且生成响应,最后Filter再对服务器响应进行后处理;
拦截器可以在方法执行前调用(preHandle),方法执行后调用(postHandle),视图页面渲染后调用(afterCompletion)。