拦截器
增加一个类UserConfig实现接口HandlerInterceptor。
>@Component
public class UserConfig implements HandlerInterceptor {
@Autowired
private UserDao userDao;
@Override
/*该方法将在请求处理之前进行调用,
只有该方法返回true,
才会继续执行后续的Interceptor和Controller,
当返回值为true 时就会继续调用下一个Interceptor的preHandle 方法,
如果已经是最后一个Interceptor的时候就会是调用当前请求的Controller方法;*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("自定义拦截器");
String ipAddr = IpUtils.getIpAddr(request);
userDao.insertIp(new IpAddress(UUIDUtil.getUUID(),ipAddr,request.getRequestURI()));
System.out.println("IP地址="+ipAddr);
System.out.println("浏览位置="+request.getRequestURI());
return true;
}
@Override
/*该方法将在请求处理之后,DispatcherServlet进行视图返回渲染之前进行调用,
可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。*/
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作");
}
@Override
/*该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行,
该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。
用于进行资源清理。*/
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("我是afterCompletion方法");
}
}
同时增加一个配置SessionConfiguration,相当于传统项目的mvc拦截配置。这里注意拦截的页面和不拦截的页面要区分开,登录页面和登录操作都是不能被拦截的。
>@Configuration
public class MySpringMVCConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
InterceptorRegistration registration = registry.addInterceptor(userConfigMvc());
registration.addPathPatterns("/**");
registration.excludePathPatterns("/auth/**","/");
}
/**
* 解决拦截器中不能依赖注入的问题
*
* @return
*/
@Bean
public UserConfig userConfigMvc() {
return new UserConfig();
}
}
# 值得注意的是想要在拦截器中使用@Autowired注入实例,会出现问题,
# 拦截器的是在SpringContext前执行的,因此无法通过注解去识别@Autowired注入的信息
想要注入的方法有很多,可以参考上面的案例,这么做就是将我们自定义的拦截器UserConfig(继承自HandlerInterceptor)
使用@Bean在SpringContext执行之后,又重新注入一遍。
浙公网安备 33010602011771号