拦截器Interceptor

2年前 (2022) 程序员胖胖胖虎阿
142 0 0

拦截器 是 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我在上面配置了不拦截,所以不会走拦截器)
拦截器Interceptor
拦截器Interceptor
4.上面配置所有路径都走拦截器,所以除了排除的都走拦截器
拦截器Interceptor

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

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

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

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

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

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

版权声明:程序员胖胖胖虎阿 发表于 2022年9月6日 下午12:48。
转载请注明:拦截器Interceptor | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...