wangxl_eric 2011-08-21 19:42
浏览 425
已采纳

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

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










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

  • 写回答

4条回答 默认 最新

  • 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]
    具体配了哪个就拦截哪个

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题