关于java:聊聊面试中的过滤器与拦截器

60次阅读

共计 3098 个字符,预计需要花费 8 分钟才能阅读完成。

背景

做过 JavaWeb 开发的对过滤器和拦截器必定不会生疏,而且也会纯熟的应用,然而对于过滤器和拦截器具体的区别和差别可能不是特地的理解,这篇文章就跟大家介绍下过滤器和拦截器的区别。

过滤器 Filter

首先介绍下什么是过滤器,过滤器英文叫 Filter,是 JavaEE 的规范,依赖于 Servlet 容器,应用的时候是配置在 web.xml 文件中的,能够配置多个,执行的程序是依据配置程序从上到下。罕用来配置申请编码以及过滤一些非法参数,垃圾信息或者是网站登录验证码。

    <!-- filter -->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- filter end -->

参考实现

public class CaptchaFilter implements Filter {public void init(FilterConfig config) throws ServletException { }

    public void destroy() {}

    public void doFilter(ServletRequest servletRequest,
            ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        String servletPath = request.getServletPath();
        // 获取验证码
        if(servletPath.matches("/captcha.jpg")) {response.setContentType("image/jpeg");
            // 禁止图像缓存。response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expires", 0);
            // 参数:宽、高、字符数、烦扰量
            CaptchaProductor vCode = new CaptchaProductor(70,30,4,75);

            // 依据 token 保留验证码内容
            CaptchaBean bean = new CaptchaBean();
            bean.setCaptcha(vCode.getCode());
            bean.setCreateTime(new Date());
            HttpSessionUtils.setSessionValue(request, "sessionCaptcha", bean);
            vCode.write(response.getOutputStream());
            return;
        }
    }
}

过滤器的实现能够通过实现 Filter 接口或者继承 Spring 的 org.springframework.web.filter.OncePerRequestFilter 来实现。

拦截器 Interceptor

拦截器 Interceptor 不依赖 Servlet 容器,依赖 Spring 等 Web 框架,在 SpringMVC 框架中是配置在 SpringMVC 的配置文件中,在 SpringBoot 我的项目中也能够采纳注解的模式实现。拦截器是 AOP 的一种利用,底层采纳 Java 的反射机制来实现的。与过滤器一个很大的区别是在拦截器中能够注入 Spring 的 Bean,可能获取到各种须要的 Service 来解决业务逻辑,而过滤器则不行。

    <!-- 拦截器 -->
    <mvc:interceptors>
        <!-- 多个拦截器, 程序执行 -->
        <bean class="com.test.admin.interceptor.AuthInterceptor"/>
    </mvc:interceptors>

参考实现

public class AuthInterceptor extends HandlerInterceptorAdapter {

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        //todo
        super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //todo 
        return super.preHandle(request, response, handler);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}}

拦截器的实现能够通过继承 org.springframework.web.servlet.handler.HandlerInterceptorAdapter; 来实现。

执行程序

因为咱们的过滤器和拦截器都能够配置多个,那么对于各自的执行程序是什么样子的呢?

过滤器的执行程序首先跟在 web.xml 中配置的程序无关,先配置的先执行,然而并不是说是等上一个过滤器执行完结了再执行下一个,它们之间是通过链来执行的,具体的过滤器和拦截器的执行过程我画了个图,能够看下。

小结

明天简略的给大家介绍了过滤器和拦截器的区别和应用,心愿对大家有帮忙。平时的工作中可能这些货色都是组长或者架构师搭建好的,本人只关注业务逻辑,然而很多时候咱们还是要知其然知其所以然,多理解一些对本人是很有帮忙的。

598)]

小结

明天简略的给大家介绍了过滤器和拦截器的区别和应用,心愿对大家有帮忙。平时的工作中可能这些货色都是组长或者架构师搭建好的,本人只关注业务逻辑,然而很多时候咱们还是要知其然知其所以然,多理解一些对本人是很有帮忙的。

对于过滤器与拦截器,你学废了么?


正文完
 0