您的位置:首页 > 教育 > 锐评 > 杭州科技公司排名_兰州seo培训_八爪鱼磁力搜索引擎_商业推广

杭州科技公司排名_兰州seo培训_八爪鱼磁力搜索引擎_商业推广

2025/4/26 22:01:37 来源:https://blog.csdn.net/m0_74124657/article/details/147512936  浏览:    关键词:杭州科技公司排名_兰州seo培训_八爪鱼磁力搜索引擎_商业推广
杭州科技公司排名_兰州seo培训_八爪鱼磁力搜索引擎_商业推广

目录

一,拦截器的职责

二,拦截器的应用场景

三,拦截器的工作原理

拦截器在Spring MVC请求处理流程中的位置:

四,使用拦截器

一 ,编写拦截类,实现HandlerInterceptor接口,重写方法

二 ,编写拦截器配置类用于配置拦截器的执行位置。

三,springmvc配置类加载拦截配置类所在包,并且把拦截类纳入spring扫描的范围内

五 案例(验证  preHandle方法返回值不同对被访问方法产生的影响)

preHandle方法返回值:true 放行

preHandle方法返回值:false 拦截,不进行到下一步


一,拦截器的职责

  • 拦截,访问controller控制层的映射路径

二,拦截器的应用场景

  • 权限验证:
  • 当你浏览某一界面,想要点击去看,发现 你没有登录,就会跳转到登录界面

三,拦截器的工作原理

拦截器在Spring MVC请求处理流程中的位置:

客户端请求 → DispatcherServlet → 拦截器preHandle → 控制器 → 拦截器postHandle → 视图渲染 → 拦截器afterCompletion → 响应客户端

四,使用拦截器

准备工作:添加web起步依赖


一 ,编写拦截类,实现HandlerInterceptor接口,重写方法

作用:制定拦截规则,当拦截到指定的映射路径

重写三个方法【preHandle、postHandle、afterCompletion】)。该类要交给spring容器管理(把注解@Component写在类上)

package interpector;import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
// 交给 spring 容器管理
@Component
// 拦截器
public class Userlnterpector implements HandlerInterceptor {//  preHandle 方法在 客户端发送请求到达DispatcherServlet之前执行。@Overridepublic boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {System.out.println("before controller doing");// 返回false 表示拦截,返回true 表示放行return true;}
//     afterCompletion 方法在 controller类中被访问方法执行之后,还未被 客户端 响应之前执行。@Overridepublic void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afer controller doing........");}
//     postHandle 方法controller类中被访问方法执行时候执行。@Overridepublic void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("doing controller......");}
}

二 ,编写拦截器配置类用于配置拦截器的执行位置。

作用:将自定义拦截类注册和添加拦截路径

该类继承WebMvcConfigurationSupport类,重写addInterceptors方法,在此方法的实现中添加拦截路径)

package config;
import interpector.Userlnterpector;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
// 拦截器配置类
@Configuration
// 继承WebMvcConfigurationSupport
public class InterpectorConfig extends WebMvcConfigurationSupport {// 注入拦截器对象@Autowiredprivate Userlnterpector userInterpector;@Overrideprotected void addInterceptors(InterceptorRegistry registry) {// 拦截器注册,添加拦截路径/user/**,给静态资源放行/static/** registry.addInterceptor(userInterpector).addPathPatterns("/user/**").excludePathPatterns("/static/**");}
}

三,springmvc配置类加载拦截配置类所在包,并且把拦截类纳入spring扫描的范围内

springmvc配置类

package config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@ComponentScan({"controller","interpector","config"})
@Configuration
public class springmvcConfig  {}

五 案例(验证  preHandle方法返回值不同对被访问方法产生的影响)

preHandle方法返回值:true 放行

按照以下顺序,执行

客户端请求 → DispatcherServlet → 拦截器preHandle → 控制器 → 拦截器postHandle → 视图渲染 → 拦截器afterCompletion → 响应客户端


案例

自定义拦截类代码:

package interpector;import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
// 交给 spring 容器管理
@Component
// 拦截器
public class Userlnterpector implements HandlerInterceptor {//  preHandle 方法在 客户端发送请求到达DispatcherServlet之前执行。@Overridepublic boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {System.out.println("before controller doing");// 返回false 表示拦截,返回true 表示放行return true;}
//     afterCompletion 方法在 controller类中被访问方法执行之后,还未被 客户端 响应之前执行。@Overridepublic void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afer controller doing........");}
//     postHandle 方法controller类中被访问方法执行时候执行。@Overridepublic void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("doing controller......");}
}

拦截配置类

package config;
import interpector.Userlnterpector;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
// 拦截器配置类
@Configuration
// 继承WebMvcConfigurationSupport
public class InterpectorConfig extends WebMvcConfigurationSupport {// 注入拦截器对象@Autowiredprivate Userlnterpector userInterpector;@Overrideprotected void addInterceptors(InterceptorRegistry registry) {// 拦截器注册,添加拦截路径/user/**registry.addInterceptor(userInterpector).addPathPatterns("/user/**");}
}

springmvc加载 拦截配置类和扫描拦截类所在的包

package config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@ComponentScan({"controller","interpector","config"})
@Configuration
public class springmvcConfig  {}

controller类被访问的方法

package controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class userController {@RequestMapping("/login")public String login(){System.out.println("rwrwr");System.out.println("login11111111111111");return "ok";}
}

测试

比较:【客户端请求 → DispatcherServlet → 拦截器preHandle → 控制器 → 拦截器postHandle → 视图渲染 → 拦截器afterCompletion → 响应客户端】


preHandle方法返回值:false 拦截,不进行到下一步

测试

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com