在基于注释的Spring Web应用程序中进入控制器之前拦截请求

时间:2009-08-12 19:27:58

标签: java spring spring-mvc

我正在开发一个网络应用程序,我正在使用Spring框架。事实上,我从来没有正确地学会使用Spring,而且我在这一切中都有点迷失。

但是,使用基于注释的控制器,我能够创建我的大部分应用程序!

现在,问题是我需要能够在发送到控制器之前拦截请求(我需要它以便我可以验证用户是否可以访问他请求的页面)。我只花了大约5个小时搜索有关这方面的信息,我实际上发现了很多,没有一个按预期工作,我从来没有能够使我的拦截器显示简单的“Hello World”。

这是我在* -servlet.xml中的内容(当然我还有其他的bean定义):

<!-- this should be the class that contains the "hello world" -->
<bean id="myInterceptor" class="com.ibm.brmt.srb.admin.web.controller.TimeBasedAccessInterceptor"/>

<!-- this should "map" my interceptor no? -->
<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="interceptors">
        <list>
            <ref bean="myInterceptor"/>
        </list>
    </property>
</bean> 

这是我的TimeBasedAccessInterceptor类(名称不相关,可能会更改)

package web.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;



public class TimeBasedAccessInterceptor extends HandlerInterceptorAdapter{

    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception {
        System.out.println("-------------------------------------------------------------------------------------------");      
        }

    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception {
        System.out.println("-------------------------------------------------------------------------------------------");      
        }

    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
        System.out.println("-------------------------------------------------------------------------------------------");      
        return false;
    }
}

代码编译并运行但是从不调用TimeBasedAccessInterceptor类中的内容(我甚至使用了断点)。有人能帮助我吗?

根据要求,这是我在* -servlet.xml中实现控制器的方式的“预览”

<bean id="controllerName" class="web.controller.controllerNameController">  
    <property name="property1" ref="beanRef" />
    <property name="property1" ref="beanRef2"/>
</bean>

并在controllerNameController.java中:

  package web.controller;

    @Controller
    public class controllerNameController{

        @RequestMapping
        public void find(String[] enabledLvlCodes, String reset, String readRuleId, Filter filter, Errors errors,
                Model model, HttpSession session) {

       //Code goes here
       }
}

1 个答案:

答案 0 :(得分:1)

您的映射看起来是正确的。

除了DefaultAnnotationHandlerMapping之外,您可能还定义了其他处理程序映射(这将为您的控制器提供一种通过不同路径调用的方式)?

或许你的上下文文件没有正确部署(是的,这是一个愚蠢的建议,但你会惊讶地发生这种情况:-))

两者的答案都是“否”,我建议你在AbstractHandlerMapping.getHandler()中加一个断点,然后逐步到达HandlerExecutionChain的位置并检查它是否包含你的拦截器。 / p>