SpringMVC中拦截器的配置

关于拦截器的配置

在Spring的配置文件中,可以对拦截器所映射的路径进行详细配置,在每一个<mvc:interceptor>节点中,都可以添加若干个<mvc:mapping>节点,以配置若干个需要被拦截的路径,例如:

<mvc:interceptors>
		<mvc:interceptor>
			<!-- 可以配置若干个需要被拦截的路径 -->
			<mvc:mapping path="/main/index.do"/>
      <mvc:mapping path="/user/password.do"/>
      <mvc:mapping path="/user/info.do"/>
      <mvc:mapping path="/blog/addnew.do"/>
      <mvc:mapping path="/blog/edit.do"/>
      <mvc:mapping path="/blog/delete.do"/>
			<!-- 拦截器 -->
			<bean class="cn.tedu.spring.LoginInterceptor"/>
		</mvc:interceptor>
</mvc:interceptors>

在配置映射路径时,还可以使用星号(*)作为通配符,表示匹配任意资源,例如,以上配置就可以改为:

<mvc:interceptors>
		<mvc:interceptor>
			<!-- 可以配置若干个需要被拦截的路径 -->
			<mvc:mapping path="/main/index.do"/>
      <mvc:mapping path="/user/*"/>
      <mvc:mapping path="/blog/*"/>
			<!-- 拦截器 -->
			<bean class="cn.tedu.spring.LoginInterceptor"/>
		</mvc:interceptor>
</mvc:interceptors>

但是,在SpringMVC的拦截器配置中,1个星号只能表示某个资源,并不能通配多层级的路径,例如/blog/*可以表示/blog/addnew.do/blog/delete.do等,却不可以匹配到/blog/2020/list.do,也就是,路径中间的层级不同时,是无法匹配的!如果一定要通配多层级路径的任意资源,需要使用2个星号(**),以上代码就可以改为:

<mvc:interceptors>
		<mvc:interceptor>
			<!-- 可以配置若干个需要被拦截的路径 -->
			<mvc:mapping path="/main/index.do"/>
      <mvc:mapping path="/user/**"/>
      <mvc:mapping path="/blog/**"/>
			<!-- 拦截器 -->
			<bean class="cn.tedu.spring.LoginInterceptor"/>
		</mvc:interceptor>
</mvc:interceptors>

当使用了通配符之后,可能会出现匹配范围过大的问题,例如,以上配置了/user/**,则修改密码/user/password.do、查看资料/user/info.do都是可以被拦截,但是,用户注册/user/reg.do、用户登录/user/login.do也会被拦截,如果是应用于“验证登录的拦截器中”,则表现为“打开注册/登录页面也是要求事先已经登录的”!很显然是不合理的!

为了解决匹配范围过大的问题,在SpringMVC中配置拦截器时,还可以添加<mvc:exclude-mapping>节点,用于添加“例外”(“排除”)清单,例如:

<mvc:interceptors>
		<mvc:interceptor>
			<!-- 可以配置若干个需要被拦截的路径 -->
			<mvc:mapping path="/main/index.do"/>
      <mvc:mapping path="/user/**"/>
      <mvc:mapping path="/blog/**"/>
      <!-- 配置若干个排除的路径,即拦截器不予处理的路径 -->
      <mvc:exclude-mapping path="/user/reg.do" />
      <mvc:exclude-mapping path="/user/register.do" />
      <mvc:exclude-mapping path="/user/handle_reg.do" />
      <mvc:exclude-mapping path="/user/login.do" />
      <mvc:exclude-mapping path="/user/handle_login.do" />
			<!-- 拦截器 -->
			<bean class="cn.tedu.spring.LoginInterceptor"/>
		</mvc:interceptor>
</mvc:interceptors>

在以上<mvc:interceptor>的配置中,必须先配置<mvc:mapping>节点,再配置<mvc:exclude-mapping>节点,最后配置<bean>节点!

所以,可以把<mvc:mapping>配置的路径理解为“黑名单”,就是需要拦截的路径,而<mvc:exclude-mapping>配置的路径理解为“白名单”,不予处理的路径。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值