`

springboot-第六章 深入SpringBoot2.x过滤器和配置实战

 
阅读更多

Ordered 的最高优先级是int的最小值,最低优先级是int的最大值。

package org.springframework.core;

public interface Ordered {
    int HIGHEST_PRECEDENCE = -2147483648;
    int LOWEST_PRECEDENCE = 2147483647;

    int getOrder();
}

 

利用Servlet3.0里的注解里面建立一个filter。再在启动类中增加@ServletComponentScan

 

@WebFilter(urlPatterns = "/a/*",filterName = "loginFilter")
public class LoginFilter implements Filter {
    @Override
public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("init loginfilter");
    }

    @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("doFilter loginfilter");
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        HttpServletResponse response = (HttpServletResponse)servletResponse;

       String userName= request.getParameter("username");
       if(userName.equals("x"))
       {
           //放行
filterChain.doFilter(request,response);
       }
       else
{
           response.sendRedirect("/error.html");
            return;
       }
    }

    @Override
public void destroy() {
        System.out.println("destroy loginfilter");
    }
}

 

用Servlet3.0自定义Servlet

@WebServlet(name = "userServlet",urlPatterns = "/test/user")
public class UserServlet extends HttpServlet {
    @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setAttribute("1",1);
        resp.getWriter().print("userServlet");
        resp.getWriter().flush();
        resp.getWriter().close();
    }

    @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}

 

 

定义拦截器

public class MyIntercepter implements HandlerInterceptor{
    @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyIntercepter preHandle");
        String accessToken = request.getParameter("access_token");
        System.out.println("MyIntercepter preHandle "+accessToken);
        return HandlerInterceptor.super.preHandle(request,response,handler);
    }

    @Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
        System.out.println("MyIntercepter postHandle");
        HandlerInterceptor.super.postHandle(request,response,handler,modelAndView);
    }

    @Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
        System.out.println("MyIntercepter afterCompletion");
        HandlerInterceptor.super.afterCompletion(request,response,handler,ex);
    }
}

 

注册拦截器

@Configuration
public class CustomerWebMvcConfigurer implements WebMvcConfigurer{
    @Override
public void addInterceptors(InterceptorRegistry registry) {
        MyIntercepter intercepter = new MyIntercepter();
        MyIntercepterTwo intercepter2 = new MyIntercepterTwo();
        ///e/*/** 是拦截所有
registry.addInterceptor(intercepter).addPathPatterns("/e/*").excludePathPatterns("/e/c");//不拦截/e/c
registry.addInterceptor(intercepter2).addPathPatterns("/e/*");
        WebMvcConfigurer.super.addInterceptors(registry);
    }
}

输出:

MyIntercepter preHandle

MyIntercepter preHandle 1

MyIntercepterTwo preHandle

MyIntercepterTwo preHandle 1

MyIntercepterTwo postHandle

MyIntercepter postHandle

MyIntercepter afterCompletion

MyIntercepter afterCompletion

MyListener requestDestroyed

 

filter和interceptor的区别

 

 

Filter是基于函数回调 doFilter(),而Interceptor则是基于AOP思想

Filter在只在Servlet前后起作用,而Interceptor够深入到方法前后、异常抛出前后等

依赖于Servlet容器即web应用中,而Interceptor不依赖于Servlet容器所以可以运行在多种环境。

在接口调用的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。

Filter和Interceptor的执行顺序

     

过滤前->拦截前->action执行->拦截后->过滤后

 

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics