思路:通过全局参数,选择性的跳过拦截器逻辑。
web.xml中配置:
<!-- 拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 对所有的请求拦截使用/** ,对某个模块下的请求拦截使用:/myPath/* -->
<mvc:mapping path="/**" />
<ref bean="userAccessInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
<bean id="userAccessInterceptor"
class="com.kye.interceptor.UserAccessApiInterceptor">
<span style="color:#FF0000;"><property name="unUAInterLists" >
<list>
<value>/S/*</value>
</list>
</property></span>
</bean>
<!-- 解密拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 对登录的请求拦截 /Login-->
<mvc:mapping path="/S/*" />
<ref bean="userSecurity" />
</mvc:interceptor>
</mvc:interceptors>
<bean id="userSecurity"
class="com.kye.interceptor.UserSecurity">
</bean>
在原始拦截器中增加实体类的全局参数;对例外的路径增加拦截器。
UserAccessApiInterceptor类中增加例外的跳出逻辑:
public class UserAccessApiInterceptor extends HandlerInterceptorAdapter{
private Logger log = Logger.getLogger(this.getClass());
/**
* 免登入 免检查地址
*/
private List<String> unUAInterLists;
public List<String> getUnUAInterLists() {
return unUAInterLists;
}
public void setUnUAInterLists(List<String> unUAInterLists) {
this.unUAInterLists = unUAInterLists;
}
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
// 20160511 增加例外地址,例外地址跳出
String servletPath = request.getRequestURI();
for (String string : unUAInterLists) {
// 如果存在 后方的通配符,那么匹配地址的前部分
int beginId = string.indexOf(SecurityUtil.WIL_CHAR);
if (beginId >= 0 && servletPath.startsWith(request.getContextPath() + string.substring(0, beginId))) {
return true;
}
}
/**
拦截逻辑
*/
return true;
}
}
例外链接的拦截器正常逻辑即可。