перехватчики весной MVC - PullRequest
2 голосов
/ 28 ноября 2011

Я пытаюсь выучить перехватчики весной, но не могу этого понять.Я попробовал пример, но безуспешно.Я создал простой перехватчик, такой как

@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 и как я могу проверитьих до реализации.Это может быть потому, что я новичок в весне, и я не могу понять это полностью.Было бы очень полезно, если бы вы предложили какую-нибудь хорошую ссылку для чтения, которая показывает несколько примеров.

Заранее спасибо

Отредактировано: теперь я вижу свой sysout commnet, когда я вызываю свою страницу входа, но онапоказывать это 16 раз, почему это так?

Ответы [ 2 ]

11 голосов
/ 28 ноября 2011

Сначала взгляните на интерфейс 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");
   }
 }

В конце вы заметите (я неНа 100% уверен), что этот перехватчик не вызывается для весеннего запроса входа в систему безопасности (j_spring_security_check) или выхода из системы.Потому что это обрабатывается в весеннем фильтре безопасности, который применяется до вызова любого HandlerInterceptor.


(комментарий) Теперь я могу видеть свой комментарий sysout, когда я вызываю свою страницу входа, но он отображаетэто 16 раз, почему это так?

Возможно, потому что вы загружаете некоторые ресурсы (изображения, css, js) через контроллер.

1 голос
/ 28 ноября 2011

Почему бы не попробовать добавить атрибут name в запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...