我正在开发一个网络应用程序,我正在使用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
}
}
答案 0 :(得分:1)
您的映射看起来是正确的。
除了DefaultAnnotationHandlerMapping之外,您可能还定义了其他处理程序映射(这将为您的控制器提供一种通过不同路径调用的方式)?
或许你的上下文文件没有正确部署(是的,这是一个愚蠢的建议,但你会惊讶地发生这种情况:-))
两者的答案都是“否”,我建议你在AbstractHandlerMapping.getHandler()
中加一个断点,然后逐步到达HandlerExecutionChain
的位置并检查它是否包含你的拦截器。 / p>