VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > Java教程 >
  • springboot+拦截器(六)

正文

回到顶部

1.如何实现拦截器

1.实现拦截器,需要写拦截器配置类(这个配置类也可以叫注册器)

  • @Configuration 类注解,加到配置类上,表示该类是配置类。
  • 该配置类需要继承WebMvcConfigurerAdapter
  • 重写WebMvcConfigurerAdapter中的addInterceptors方法,用于添加适配器需要拦截的url
  • 注册拦截器。(假设,拦截器类的具体实现,应该已经实现了)

具体的配置类实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.anson2021b.config;
 
import com.anson2021b.controller.interceptor.OneInterceptor;
import com.anson2021b.controller.interceptor.TwoInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;;
 
@Configuration//1.加注解,表示该类是配置类
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {//2.同时该配置类需要继承WebMvcConfigurerAdapter
    @Override//3.重写addInterceptors方法,用于添加适配器需要拦截的url
    public void addInterceptors(InterceptorRegistry registry){
        /*
           4.注册拦截器。注意,拦截起需要按顺序执行
         */
        registry.addInterceptor(new OneInterceptor()).addPathPatterns("/one/**");
        registry.addInterceptor(new TwoInterceptor()).addPathPatterns("/two/**");
        super.addInterceptors(registry);
    }
}

2.实现具体的拦截器逻辑

这里实现2个拦截器,一个拦截器不拦截,也就是放行,一个拦截器实现拦截功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.anson2021b.controller.interceptor;
 
import org.springframework.web.servlet.HandlerInterceptor;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class OneInterceptor implements HandlerInterceptor {
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("被one 拦截,放行");
        return true;
    }
}

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.anson2021b.controller.interceptor;
 
import org.springframework.web.servlet.HandlerInterceptor;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class TwoInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("被two 拦截...");
        return false;
    }
}

可以看到 return false的话,就是拦截了,return true的话,就是放行。

回到顶部

2.拦截器的验证

写1个controller类,验证一下拦截器的放行成功否

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.anson2021b.controller.interceptor;
 
import org.springframework.web.servlet.HandlerInterceptor;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class TwoInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("被two 拦截...");
        return false;
    }
}

  

浏览器访问:

http://127.0.0.1:8080/one/test,返回{"status":200,"msg":"ok","data":"one"},同时,控制台打印拦截器内部的打印语句“被one 拦截,放行”,可见放行成功

再写一个controller,验证一下拦截器的拦截能力

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.anson2021b.controller.interceptor;
 
import org.springframework.web.servlet.HandlerInterceptor;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class OneInterceptor implements HandlerInterceptor {
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("被one 拦截,放行");
        return true;
    }
}

  

浏览器访问:

http://127.0.0.1:8080/two/test,无返回,同时,控制台打印拦截器内部的打印语句“被two 拦截...”,可见拦截成功

回到顶部

3.拦截器配置类的玩儿法 

上面的注册器,可以看到,注册了2个拦截器,先单独注册one,再单独注册了two。可以看到,第一个controller被第一个拦截器拦截,第二个controller被第二个拦截器拦截了。

1.如果说,我的controller既希望被第一个拦截器拦截,又希望被第二个拦截器拦截,怎么办呢?那就在另外一个拦截器后面继续加希望拦截的url

这样实现,

1
2
3
registry.addInterceptor(new OneInterceptor()).addPathPatterns("/one/**");
registry.addInterceptor(new TwoInterceptor()).addPathPatterns("/two/**")
                                             .addPathPatterns("/one/**");

 

这样的话,OneInterceptorController内的/one/**请求就可以被拦截器OneInterceptor首先拦截,然后又被拦截器TwoInterceptor拦截了。

浏览器访问一下 http://127.0.0.1:8080/one/test,可以发现,由于最终被拦截了,所以没有返回任何信息。

控制台打印“被one 拦截,放行”,“被two 拦截...”2个拦截器的内部打印语句,这里验证了2个结论:

1.拦截器的执行顺序就是注册器的注册顺序

2.由于第一个拦截器没有做拦截,所以第二个拦截器才有机会执行。

回到顶部

4.拦截器的执行顺序

在深入学习拦截器的时候,再看。先将疑问放在这里

1.被拦截器拦截的请求,最后都怎么结束执行?接口应该返回什么状态字?

2.被第一个拦截器拦截了,第二个拦截器就不执行了,框架是通过什么机制知道不需要执行第二个拦截器了的?

原文:https://www.cnblogs.com/ansonwan/p/15490048.html


相关教程