java学习之SpringMVC拦截器开发

打印 上一主题 下一主题

主题 894|帖子 894|积分 2682

0x00前言

springmvc的拦截器类似于Selvet的Filter,但是所属的操作又不一样
Spring MVC 提供了 Interceptor 拦截器机制,用于请求的预处理和后处理,也就是增强方法,它主要用于拦截用户的请求并做相应的处理,通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上。
0x01基础使用

拦截器需要实实现HandlerInterceptor
  1. @Component
  2. //定义拦截器类,实现HandlerInterceptor接口
  3. //注意当前类必须受Spring容器控制
  4. public class ProjectInterceptor implements HandlerInterceptor {
  5.     @Override
  6.     //原始方法调用前执行的内容
  7.     //返回值类型可以拦截控制的执行,true放行,false终止
  8.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  9.         String contentType = request.getHeader("Content-Type");
  10.         HandlerMethod hm = (HandlerMethod)handler;
  11.         System.out.println("preHandle..."+contentType);
  12.         return true;
  13.     }
  14.     @Override
  15.     //原始方法调用后执行的内容
  16.     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  17.         System.out.println("postHandle...");
  18.     }
  19.     @Override
  20.     //原始方法调用完成后执行的内容
  21.     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  22.         System.out.println("afterCompletion...");
  23.     }
  24. }
复制代码
有三个方法

  • 原始方法调用前执行的内容
    返回值类型可以拦截控制的执行,true放行,false终止
    public boolean preHandle
  • 原始方法调用后执行的内容
    public void postHandle
  • 原始方法调用完成后执行的内容
    public void afterCompletion
  • 方法中参数都是可以用的,如postHandle中的requst,response那些都是可以进行配置的
写配置需要继承WebMvcConfigurationSupport类实现addInterceptors方法
  1. @Configuration
  2. public class SpringMvcSupport extends WebMvcConfigurationSupport {
  3.     @Autowired
  4.     private ProjectInterceptor projectInterceptor;
  5. @Override
  6. protected void addResourceHandlers(ResourceHandlerRegistry registry) {
  7.     registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");//配置访问静态资源
  8. }
  9. @Override
  10. protected void addInterceptors(InterceptorRegistry registry) {
  11.     //配置拦截器
  12.     registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");
  13. }
  14. }
复制代码
0x02简化配置

经典前面白学
  1. @Configuration
  2. @ComponentScan({"com.itheima.controller"})
  3. @EnableWebMvc
  4. //实现WebMvcConfigurer接口可以简化开发,但具有一定的侵入性
  5. public class SpringMvcConfig implements WebMvcConfigurer {
  6.     @Autowired
  7.     private ProjectInterceptor projectInterceptor;
  8.     @Autowired
  9.     private ProjectInterceptor2 projectInterceptor2;
  10.     @Override
  11.     public void addInterceptors(InterceptorRegistry registry) {
  12.         //配置多拦截器
  13.         registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");
  14.         registry.addInterceptor(projectInterceptor2).addPathPatterns("/books","/books/*");
  15.     }
  16. }
复制代码
直接在核心配置类里面配置拦截器
0x03拦截链

拦截链,执行的顺序是先执行1的preHandle执行2的preHandle,后面的方法是从2开始执行因为preHandle过了就是原始方法,原始方法过了就是类似于,人从门里往外面走先过第二道门。
这里直接引用一张上课的PPT
<img alt="image-20220706151922820" loading="lazy">
只要pre执行了对呀的after就会执行。只要一个pre出错误了post就都不会执行。
0x04xml配置

按照前面的方法配置好拦截器然后在xml文件中加入一系列mvc的标签
  1. <mvc:interceptors>
  2.         <mvc:interceptor>
  3.             <mvc:mapping path="/book/*"/>
  4.             <bean />
  5.         </mvc:interceptor>
  6.     </mvc:interceptors>
复制代码
  1. @Configuration
  2. public class SpringMvcSupport extends WebMvcConfigurationSupport {
  3.     @Autowired
  4.     private ProjectInterceptor projectInterceptor;
  5. @Override
  6. protected void addResourceHandlers(ResourceHandlerRegistry registry) {
  7.     registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");//配置访问静态资源
  8. }
  9. @Override
  10. protected void addInterceptors(InterceptorRegistry registry) {
  11.     //配置拦截器
  12.     registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");
  13. }
  14. }
复制代码
0x05总结

这两篇的mvc都是一些开发多的注解呀和一些配置的问题,只需要记住一些该有的注解,它们的使用跟Servlet是十分相似的,还有ssm整合和springboot了,整体来说我写的代码都很少很多都是直接抄的代码,主要是要去了解这些控件,始终要记得的是ioc开发模式很多东西都是属于是bean

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

吴旭华

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表