springmvc拦截器使用,springmvc实现拦截器两种方式
00-1010 1.什么是截击机2。自定义拦截器执行流程图3。自定义拦截器应用程序示例1。快速入门2。注释和细节3。调试执行流程4。多截击机1。多拦截器执行流程示意图2。应用示例3。主要事项和细节
00-1010描述
Spring MVC也可以使用拦截器来拦截请求,用户可以自定义拦截器来实现特定的功能。自定义拦截器必须实现HandlerInterceptor接口自定义拦截器的三个方法
Pre-handle():该方法在业务处理器处理请求之前被调用,用户请求请求在该方法中被处理。PostHandle():该方法在目标方法处理请求后执行after completion();该方法在请求被完全处理后被调用,并且一些资源清理操作可以在该方法中执行。
目录
自定义拦截器执行过程描述
如果preHandle方法返回false,则不会执行目标方法。您可以在这里指定在执行目标方法之后执行返回页面postHandle。您可以在方法中访问目标方法返回的ModelAndView对象。如果preHandle返回true,则在呈现视图后执行afterCompletion方法。如果preHandle返回false,则不会调用afterCompletion方法。在配置拦截器时,您可以指定拦截器对哪些请求有效,哪些请求无效。如果不进行配置,默认情况下,它将对所有请求生效。
1.什么是拦截器
00-1010 应用示例要求
完成一个定制的拦截器,并学习如何配置拦截器及其运行过程。
应用示例-代码实现
1.定制拦截器
/* * *自定义拦截器*/@ ComponentPublicClass my Interceptor 01实现sHandler拦截器{/* * 1。预处理方法在目标方法执行之前执行* 2。如果返回fasle,将不执行目标方法* @ param request * @ param response * @ param handler * @ return * @ throws Exception */@ Override public boolean pre handle(http servlet request请求,HttpServletResponse响应,对象处理程序)throws Exception { system . out . println( my interceptor 01-pre handle));返回true} /** * 1.目标方法执行后,postHandle * 2。此方法可以获取目标方法,返回的ModelAndView对象* @ param request * @ param response * @ param handler * @ parammodelandview * @ throwsexception */@ Override public void post handle(http servlet request,HttpServletResponse response,Object handler,ModelAndView modelAndView)抛出异常{ system . out . println( my interceptor 01-post handle));} /** *1.视图渲染后执行afterCompletion(),可以在这里进行资源清理* @ param request * @ param response * @ param handler * @ paramex * @ throws Exception */@ Override public void after completion(http servlet request,HttpServletResponse,Object handler,Exception ex)抛出异常{ system . out . println( my interceptor 01-after completion));}}2.配置块
截器
拦截配置有三种方式
(1)不指定拦截规则,默认拦截所有
<!--配置自定义拦截器-spring配置文件--><mvc:interceptors> <!--第一种方式,不指定拦截规则默认拦截所有请求--> <ref bean="myInterceptor01"></ref></mvc:interceptors>
(2)指定明确的拦截路径
<!--配置自定义拦截器-spring配置文件--><mvc:interceptors> <!--第一种方式,不指定拦截规则默认拦截所有请求--> <!--<ref bean="myInterceptor01"></ref>--> <!--第二种指定拦截路径--> <mvc:interceptor> <mvc:mapping path="/hi"/> <ref bean="myInterceptor01"/> </mvc:interceptor></mvc:interceptors>
(3)通配符方式,也可用于指定不拦截路径
<!--配置自定义拦截器-spring配置文件--> <mvc:interceptors> <!--第一种方式,不指定拦截规则默认拦截所有请求--> <!--<ref bean="myInterceptor01"></ref>--> <!--第二种指定拦截路径--> <!-- <mvc:interceptor> <mvc:mapping path="/hi"/> <ref bean="myInterceptor01"/> </mvc:interceptor>--> <mvc:interceptor> <!--通配符方式 表示拦截 /h 打头的路径--> <mvc:mapping path="/h*"/> <!--/hello不拦截--> <mvc:exclude-mapping path="/hello"/> <!--指定对哪个拦截器配置--> <ref bean="myInterceptor01"/> </mvc:interceptor> </mvc:interceptors>
3.创建FurnHandler.java
@Controllerpublic class FurnHandler { @RequestMapping(value = "/hi") public String hi(User user) { System.out.println("---FurnHandler--hi()---"); return "success"; } @RequestMapping(value = "/hello") public String hello() { System.out.println("---FurnHandler--hello()---"); return "success"; } @RequestMapping(value = "/ok") public String ok() { System.out.println("---FurnHandler--ok()---"); return "success"; }}
4.interceptor.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>测试自定义拦截器</title></head><body><h1>测试自定义拦截器</h1><a href="<%=request.getContextPath()%>/hi" rel="external nofollow" >测试自定义拦截器-hi</a><br><br><a href="<%=request.getContextPath()%>/hello" rel="external nofollow" >测试自定义拦截器-hello</a><br/><br/><a href="<%=request.getContextPath()%>/ok" rel="external nofollow" >测试自定义拦截器-ok</a><br><br></body></html>
5.测试
2.注意事项和细节
1、默认配置是都所有的目标方法都进行拦截, 也可以指定拦截目标方法, 比如只是拦截 hi
<mvc:interceptor> <mvc:mapping path="/hi"/> <ref bean="myInterceptor01"/> </mvc:interceptor>
2、mvc:mapping 支持通配符, 同时指定不对哪些目标方法进行拦截
<mvc:interceptor> <mvc:mapping path="/h*"/> <mvc:exclude-mapping path="/hello"/> <ref bean="myInterceptor01"/> </mvc:interceptor>
3、拦截器需要配置才生效,不配置是不生效的.
4、如果 preHandler() 方法返回了 false, 就不会执行目标方法(前提是你的目标方法被拦截 了), 程序员可以在这里根据业务需要指定跳转页面.
3.Debug执行流程
4.多个拦截器
1.多个拦截器执行流程示意图
执行流程可以参考filter过滤器,执行顺序根据配置的先后顺序
2.应用实例
代码实现
新增拦截器
@Componentpublic class MyInterceptor02 implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("MyInterceptor02-preHandle"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("MyInterceptor02-postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("MyInterceptor02-afterCompletion"); }}
配置拦截器
<!--配置自定义拦截器-spring配置文件--> <mvc:interceptors> <!--第一种方式,不指定拦截规则默认拦截所有请求--> <!--<ref bean="myInterceptor01"></ref>--> <!--第二种指定拦截路径--><!-- <mvc:interceptor> <mvc:mapping path="/hi"/> <ref bean="myInterceptor01"/> </mvc:interceptor>--> <mvc:interceptor> <!--通配符方式 表示拦截 /h 打头的路径--> <mvc:mapping path="/h*"/> <!--/hello不拦截--> <mvc:exclude-mapping path="/hello"/> <!--指定对哪个拦截器配置--> <ref bean="myInterceptor01"/> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/hi"/> <ref bean="myInterceptor02"/> </mvc:interceptor> </mvc:interceptors>
这里我们定义了两个拦截器myInterceptor01和myInterceptor02,两个拦截器都会对ip:port/工程路径/hi的请求进行拦截,执行结果如下图所示:
执行流程说明:拦截器的执行先后顺序根据配置的先后顺序执行
3.主要事项和细节
如果第 1 个拦截器的 preHandle() 返回 false , 后面都不在执行如果第2个 拦 截 器 的 preHandle() 返 回 false , 就 直 接 执 行 第1个 拦 截 器 的 afterCompletion()方法, 如果拦截器更多,规则类似说明: 前面说的规则,都是目标方法被拦截的前提在实际开发中我们常用拦截器对登录进行验证
到此这篇关于SpringMVC超详细介绍自定义拦截器的文章就介绍到这了,更多相关SpringMVC拦截器内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。