Spring MVC中的拦截器

发布于 2021-02-02 11:27:07

我正在尝试在spring学习拦截器,但无法理解。我尝试了一个示例示例,但没有成功。我创建了一个简单的拦截器,例如

@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;
}

}

在我的spring-servlet.xml中,我有

<context:component-scan base-package="com.test.interceptor" />
 <mvc:interceptors>
            <bean class="com.test.interceptors.testInterceptor " />  
</mvc:interceptors>

在登录页面上,我在$ {name}处写上

因此,我什至都看不到$ {name}的值或sysout。

我什至无法理解何时将调用postHandler或afterCompletion方法,以及在实现之前如何测试它们。这可能是因为我对spring也很陌生,但我无法完全理解。如果您建议阅读一个很好的链接(其中显示了一些示例),那将对您有很大的帮助。

提前致谢

编辑:现在,当我调用登录页面时,我可以看到我的sysout commnet,但是它将显示16次,为什么呢?

关注者
0
被浏览
88
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    首先看一下HandlerInterceptor它的接口文档!(HandlerInterceptorAdapter仅是一个子类,如果您不想实现所有3个方法,则只能为您提供帮助)。

    然后,您会注意到有3种方法,每种方法都属于“处理”链中的一个步骤。

    然后您会注意到您使用了错误的方法:use 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");
       }
     }
    

    最后,您会注意到(我不是100%确信)未针对Spring安全性登录请求(j_spring_security_check)或注销调用此拦截器。因为这是在调用任何HandlerInterceptor之前应用的spring安全过滤器中处理的。


    (评论)现在,当我调用登录页面时,我可以看到我的sysout评论,但它显示了16次,为什么呢?

    可能是因为您正在通过控制器加载一些资源(图像,css,js)。



推荐阅读
知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看