1 spring mvc 流程
前端发送请求到前端控制器(DispacherServlet);
前端控制器根据url请求处理映射器找到对应的handler,返回一个执行链;
前端控制器再请求处理器适配器调用相应的handler进行处理并返回给前端控制器一个modelAndView;
前端控制器再请求视图解析器对返回的逻辑视图进行解析,最后前端控制器将返回的视图进行渲染并把数据装入到request域,返回给用户.
2.过滤器
public class ParamFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("参数拦截器初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("参数拦截器进入拦截");
filterChain.doFilter(servletRequest,servletResponse);
log.info("参数拦截器返回拦截");
}
@Override
public void destroy() {
log.info("参数拦截器销毁");
}
}
进行配置到springmvc中
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean registration(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new ParamFilter());
filterRegistrationBean.addUrlPatterns("/test","/exception"); //配置哪些请求需要进行拦截
filterRegistrationBean.setName("paramFilter");
filterRegistrationBean.setOrder(1);
return filterRegistrationBean;
}
}
3. 拦截器
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
/**
* 处理请求之前被调用
* @param request
* @param response
* @param handler
* @return
* @throws Exception
* 该方法的返回值是布尔值Boolean 类型的,
* 当它返回为false 时,表示请求结束,后续的Interceptor 和Controller 都不会再执行;
* 当返回值为true 时就会继续调用下一个Interceptor 的preHandle 方法,
* 如果已经是最后一个Interceptor 的时候就会是调用当前请求的Controller 方法
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("过滤器请求之前调取");
return true;
}
/**
*请求进行处理之后
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
* 被调用的方向跟preHandle 是相反的,也就是说先声明的Interceptor 的postHandle 方法反而会后执行
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("过滤器请求之后调取");
}
/**
* 义,该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。
* 这个方法的主要作用是用于进行资源清理工作的
* @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("过滤器请求结束后调取");
}
}
拦截器配置到springmvc中
@Configuration
public class InecrceptorConfig extends WebMvcConfigurationSupport {
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
//添加需要验证登录用户操作权限的请求
.addPathPatterns("/**")
//这里add为“/**”,下面的exclude才起作用,且不管controller层是否有匹配客户端请求,拦截器都起作用拦截
// .addPathPatterns("/hello")
//如果add为具体的匹配如“/hello”,下面的exclude不起作用,且controller层不匹配客户端请求时拦截器不起作用
//排除不需要验证登录用户操作权限的请求
.excludePathPatterns("/wang")
.excludePathPatterns("/css/**")
.excludePathPatterns("/js/**")
.excludePathPatterns("/images/**");
//这里可以用registry.addInterceptor添加多个拦截器实例,后面加上匹配模式
super.addInterceptors(registry);//最后将register往这里塞进去就可以了
}
}
前后顺序
2021-02-19 16:51:15.328 INFO 16252 --- [nio-8081-exec-5] com.mvc.filter.ParamFilter : 参数拦截器进入拦截
2021-02-19 16:51:18.412 INFO 16252 --- [nio-8081-exec-5] com.mvc.Interceptor.LoginInterceptor : 过滤器请求之前调取
2021-02-19 16:51:21.091 INFO 16252 --- [nio-8081-exec-5] com.mvc.Interceptor.LoginInterceptor : 过滤器请求之后调取
2021-02-19 16:51:23.694 INFO 16252 --- [nio-8081-exec-5] com.mvc.Interceptor.LoginInterceptor : 过滤器请求结束后调取
2021-02-19 16:51:46.822 INFO 16252 --- [nio-8081-exec-5] com.mvc.filter.ParamFilter : 参数拦截器返回拦截
原文:https://www.cnblogs.com/jljg/p/14416930.html