wangxl_eric
2011-08-21 19:42 阅读 367
已采纳

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

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










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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

4条回答 默认 最新

  • 已采纳
    ylf0716 ylf0716 2011-08-22 12:05

    你可以在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]
    具体配了哪个就拦截哪个

    点赞 评论 复制链接分享
  • blueram blueram 2011-08-21 21:59

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

    点赞 评论 复制链接分享
  • zouruixin zouruixin 2011-08-22 00:35

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

    然后写一个filter类,实现BeanFactoryPostProcessor

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

    点赞 评论 复制链接分享
  • linwilliam 枫中畅游 2011-08-22 17:36

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

    点赞 评论 复制链接分享

相关推荐