拦截器应用
如何自定义拦截器?
一句话:自定义类实现HandlerInterceptor并重写其抽象方法.
具体代码如下所示:
1:先定义一个拦截器,MyInterceptor ,MyInterceptor2,MyInterceptor3
这里给出一个实例
public class MyInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("进入拦截器1...............");
return true;//true 放行
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("进入拦截器之后调用...............");
}
}
2:自定义一个配置类
@Configuration
public class MyWebConfig extends WebMvcConfigurerAdapter {
@Bean
public MyInterceptor getMyInterceptor() {
return new MyInterceptor();
}
@Bean
public MyInterceptor2 getMyInterceptor2() {
return new MyInterceptor2();
}
@Bean
public MyInterceptor3 getMyInterceptor3() {
return new MyInterceptor3();
}
/**
*
* 配置拦截器
* 配置多个... 谁在上边谁先执行
* 如下配置:执行顺序 3--1---2
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
//拦截器3
InterceptorRegistration interceptor3 = registry.addInterceptor(getMyInterceptor3());
interceptor3.addPathPatterns("/**");//拦截所有路径
interceptor3.excludePathPatterns("/index");//不拦截的路径
//拦截器1
InterceptorRegistration interceptor = registry.addInterceptor(getMyInterceptor());
interceptor.addPathPatterns("/**");//拦截所有路径
interceptor.excludePathPatterns("/index");//不拦截的路径
//拦截器2
InterceptorRegistration interceptor2 = registry.addInterceptor(getMyInterceptor2());
interceptor2.addPathPatterns("/**");//拦截所有路径
interceptor2.excludePathPatterns("/index");//不拦截的路径
}
}
到这里在spring boot中使用拦截器就成功了.
这里赘述一点.我们在使用拦截器的额时候.没必要直接自定义类实现HandlerInterceptor并重写其抽象方法
由继承关系:
HandlerInterceptorAdapter—>AsyncHandlerInterceptor–>HandlerInterceptor
可知:直接继承HandlerInterceptorAdapter(拦截器适配器),这样需要用哪个就重写哪个方法,即可
public class MyInterceptor2 extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("进入拦截器2...............");
return super.preHandle(request, response, handler);
}
}
说道适配器模式,这里,举个简单的栗子:
适配器就是向电源,像usb插头.
假如:现在一个工厂需要出厂三种手机,iphone,xiaomi,huawei
这时候,我们一般是约定手机功能.这里一般使用接口来定义
public interface PhoneFactory {
String call();
void message();
void play();
}
这时候需求是:
华为可以玩游戏可以发短信.
xiaomi 可以打电话可以玩游戏
iphone只能玩游戏.
这个时候,如果我们直接自定义类实现PhoneFactory 接口,这样就要重写全部抽象方法.代码就冗余
public class Huawei implements PhoneFactory {
@Override
public String call() {
// TODO Auto-generated method stub
return null;
}
@Override
public void message() {
// TODO Auto-generated method stub
}
@Override
public void play() {
// TODO Auto-generated method stub
}
}
改进思路: 我们自定义抽象类phoneAdapter实现PhoneFactory 接口,对其中的方法进行空实现
public class phoneAdapter implements PhoneFactory {
@Override
public String call() {
// TODO Auto-generated method stub
return null;
}
@Override
public void message() {
// TODO Auto-generated method stub
}
@Override
public void play() {
// TODO Auto-generated method stub
}
}
此时再自定义类继承其phoneAdapter抽象类.这样需要哪个就直接重写哪个即可
public class Huawei extends phoneAdapter {
@Override
public void message() {
System.out.println("发短信");
}
@Override
public void play() {
System.out.println("玩游戏");
}
}
这就是适配器模式.