springboot+拦截器(六)
1.如何实现拦截器
1.实现拦截器,需要写拦截器配置类(这个配置类也可以叫注册器)
- @Configuration 类注解,加到配置类上,表示该类是配置类。
- 该配置类需要继承WebMvcConfigurerAdapter
- 重写WebMvcConfigurerAdapter中的addInterceptors方法,用于添加适配器需要拦截的url
- 注册拦截器。(假设,拦截器类的具体实现,应该已经实现了)
具体的配置类实现如下:
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个拦截器,一个拦截器不拦截,也就是放行,一个拦截器实现拦截功能
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;
}
}
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类,验证一下拦截器的放行成功否
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,验证一下拦截器的拦截能力
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
这样实现,
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.被第一个拦截器拦截了,第二个拦截器就不执行了,框架是通过什么机制知道不需要执行第二个拦截器了的?
浙公网安备 33010602011771号