拦截器 是 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)。