创建springboot项目,添加spring-boot-starter-web依赖。
拦截器
在这里,拦截器是在controller代码执行之前执行的程序,它主要是用于拦截用户请求并作相应的处理,比如说可以判断用户是否登录,进行校验之类的工作。
大致流程
SpringBoot中的拦截器实现和spring mvc 中是一样的,它的大致流程是先自己创建一个拦截器类,让它实现HandlerInterceptor接口。然后定义配置类进行拦截器的配置,实现WebMvcConfigurer接口,实现接口中的addInterceptors方法。
自定义拦截器
package com.example.frame.interceptor;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("进入拦截器了");
//中间写逻辑代码,比如判断是否登录成功,失败则返回false
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("controller执行完了");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("获取到的返回结果" + response);
System.out.println("请求结束了");
}
}
注意说明:
- 重写的三个方法,在实际实现上,也可以只实现一个最重要的preHandle方法
2.preHandle()
此方法进入controller层之前拦截请求
返回值:表示是否将当前的请求拦截下来
false:拦截请求,请求将终止。true:请求不被拦截,继续执行
3.postHandle()
此方法将在controller执行之后执行,但是视图还没有解析,即处理请求完成后视图渲染之前的处理操作,可通过ModelAndView参数改变显示的视图,或发往视图的方法,或添加数据
4.afterCompletion()
此方法会在整个请求结束(请求结束,但是并未返回结果给客户端)之后执行, 可获取响应数据及异常信息。
配置拦截器
package com.example.frame.interceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/LoginController/login");
}
}
注意说明:
1.重写addInterceptors方法,addInterceptor方法是将拦截器注入到适配器中。
2.addPathPatterns方法是设置一个需要拦截的路径,可以是多个字符串或者是直接传入一个数组。
/** 拦截所有的路径
3.excludePathPatterns是配置不需要拦截的路径。
4.需要加上configuration注解说明这是一个配置类,在项目启动的时候自动执行。
controller测试
创建一个登陆测试,这个接口不会被拦截。
package com.example.frame.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/LoginController")
public class UserLoginController {
@RequestMapping("/login")
public String login(){
System.out.println("controller开始执行");
return "login success";
}
}
创建一个拦截的controller
package com.example.frame.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(){
System.out.println("经过拦截的controller代码执行完毕");
return "hello";
}
}
测试
拦截器中的方法将按preHandle->Controller->postHandle->afterCompletion的顺序执行。注意,只有preHandle方法返回true时后边的方法才会执行,返回false的话,就在拦截器的preHandle方法中了