关于拦截器的配置
在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>
配置的路径理解为“白名单”,不予处理的路径。