-
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