我正在尝试在春天学习拦截器但不能理解它.我尝试了一个示例,但没有成功.我创建了一个简单的拦截器
@Component("testInterceptor")
public class testInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){
//I suppose this method will be called when I open my login page so just write something here
System.out.println("Inside Interceptor...");
ModelAndView mv = new ModelAndView();
mv.addObject("name", "test name");
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
在我的spring-servlet.xml中,我有
Run Code Online (Sandbox Code Playgroud)<context:component-scan base-package="com.test.interceptor" /> <mvc:interceptors> <bean class="com.test.interceptors.testInterceptor " /> </mvc:interceptors>
在我的登录页面上,我写了$ {name}
所以我甚至无法在任何地方看到$ {name}值或sysout.
我甚至无法理解何时调用postHandler或afterCompletion方法以及如何在实现之前测试它们.这可能是因为我也是新手,而且我无法完全理解它.如果你建议阅读一些好的链接,那将会很有帮助.
提前致谢
编辑:现在我可以看到我的sysout通讯网,当我调用我的登录页面,但它显示它16次为什么这样?
Ral*_*lph 12
首先看看界面,HandlerInterceptor
它有很好的记录!(HandlerInterceptorAdapter
如果您不想实现所有3种方法,它只是一个可以帮助您的子类).
然后你会注意到有3种方法,每种方法属于"处理"链中的一步.
然后你会注意到你使用了错误的方法:使用postHandle
而不是preHandle
.
然后你会注意到你在过滤器中创建的模型图ModelAndView mv = new ModelAndView();
没有连接到某个东西,因此它无法工作!但幸运的是postHandle
有一个ModelAndView modelAndView
参数.并且您必须使用它而不是创建未连接的模型映射.
也许以后您会注意到您创建了两次过滤器.一次通过组件扫描,一次通过xml声明.(在这种情况下,我建议删除@Compnent
注释)
所以最后你的课程看起来像:
public class testInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView){
modelAndView.addObject("name", "test name");
}
}
Run Code Online (Sandbox Code Playgroud)
最后你会注意到(我不是100%确定)没有为spring security login request(j_spring_security_check)或logout调用这个拦截器.因为这是在调用任何HandlerInterceptor之前应用的spring安全过滤器中处理的.
(评论)现在,当我打电话给我的登录页面时,我可以看到我的sysout注释,但它显示了16次,为什么会这样?
也许是因为你正在通过控制器加载一些资源(图像,css,js).
归档时间: |
|
查看次数: |
12844 次 |
最近记录: |