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 matlab实现基于主成分变换的图像融合。
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥100 Jenkins自动化部署—悬赏100元