spring mvc如何给controller 配置指定的interceptor

例如系统中有些controller需要验证是否登录,有些需要验证是否有权限访问,而其他的controller是不需要进行任何验证就可以访问的,这种情况该怎么配置interceptor?










这种方式会让所有配置@Controller的访问都进入这两个拦截器,有没有什么方法能灵活的基于注解的方式指定要不要进入拦截器?

你可以在Controller里面加上字段 private boolean needVerifyLogin;
然后在对应的拦截器里面判断是否有这个字段 例如:
[code="java"]
public class LoginRequiredInterceptorextends HandlerInterceptorAdapter {

@Override
public boolean preHandle(HttpServletRequest request,
        HttpServletResponse response, Object handler) throws Exception {

    Class clazz = handler.getClass();
    Field field = clazz.getDeclaredField("needVerifyLogin");
    if (field != null) {
        field.setAccessible(true);
        if (field.getBoolean(handler)) {
            if (request.getSession(false) == null) {
                // 没有登录
                                    return false;
            }
        }
    }

    return super.preHandle(request, response, handler);
}

}

[/code]

你也可以按zouruixin 说的写个注解, 比如
[code="java"]
@Target(ElementType.TYPE)
public @interface Intercept {

String[] value() default {};

}

Controller里面这样用:
@Controller
@RequestMapping("/email_account.do")
@Intercept({"com.ykxd.web.system.SystemFrontIntercepter"}) // 可以配多个
public class EmailAccountController {
[/code]

然后重写DispatcherServlet的doDispatch
在这边判断:
[code="java"]
HandlerInterceptor[] interceptors = mappedHandler.getInterceptors();
if (interceptors != null) {
for (int i = 0; i < interceptors.length; i++) {
HandlerInterceptor interceptor = interceptors[i];
if (!interceptor.preHandle(processedRequest, response, mappedHandler.getHandler())) {
triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, null);
return;
}
interceptorIndex = i;
}
}
[/code]
具体配了哪个就拦截哪个

重新默认的annotation, 加入自己的需求就可以了

可以自己写一个注解的解析组件来实现,我们的工程目前采用这种方案,就是@NeedLogin
class XXX extends controller

然后写一个filter类,实现BeanFactoryPostProcessor

取得BeanFactory后,遍历所管理的bean,如果该bean实现了@NeedLogin
则判断是否登录

还有一种方式,就是独立配置一个xml,不需要加入interceptors拦截器配置,在总的配置文件中引入这个配置文件就行了,这样就可以达到动态配置的效果,比较方便简单,不需要写什么解析引擎。。