Heim  >  Artikel  >  Java  >  Detaillierte Erläuterung von Beispielen für Abfangjäger in Java

Detaillierte Erläuterung von Beispielen für Abfangjäger in Java

Y2J
Y2JOriginal
2017-05-10 10:32:582732Durchsuche

In diesem Artikel wird hauptsächlich der einfache Verwendungsbeispielcode des Spring Boot Interceptors vorgestellt.

1 Der Standard-Spring Boot Interceptor ist:

HandlerInterceptorAdapter
AbstractHandlerMapping
UserRoleAuthorizationInterceptor
LocaleChangeInterceptor
ThemeChangeInterceptor

LocaleChangeInterceptor und ThemeChangeInterceptor werden häufiger verwendet.

2. Die Implementierung eines benutzerdefinierten Interceptors erfordert nur 3 Schritte:

1), erstellen Sie unsere eigene Interceptor-Klasse und implementieren Sie HandlerInterceptor Interface .

2), erstellen Sie eine Java-Klasse erben Sie WebMvcConfigurerAdapter und überschreiben Sie die Methode addInterceptors.

3), instanziieren Sie unseren benutzerdefinierten Interceptor und fügen Sie dann das Objekt manuell zur Interceptor-Kette hinzu (hinzugefügt in der Methode addInterceptors).

3. Codebeispiel

IndexInterceptor.java-Klassencode:

package com.example.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class IndexInterceptor implements HandlerInterceptor{
  @Override
  public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
      throws Exception {
    System.out.println(">>>IndexInterceptor>>>>>>>在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)");
  }
  @Override
  public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
      throws Exception {
    System.out.println(">>>IndexInterceptor>>>>>>>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)");
  }
  @Override
  public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
     System.out.println(">>>IndexInterceptor>>>>>>>在请求处理之前进行调用(Controller方法调用之前)");
     // 只有返回true才会继续向下执行,返回false取消当前请求
     return true;
  }
}

IndexInterceptor2.java-Klassencode:

package com.example.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class IndexInterceptor2 implements HandlerInterceptor{
  @Override
  public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
      throws Exception {
    System.out.println(">>>IndexInterceptor2>>>>>>>在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)");
  }
  @Override
  public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
      throws Exception {
    System.out.println(">>>IndexInterceptor2>>>>>>>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)");
  }
  @Override
  public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
     System.out.println(">>>IndexInterceptor2>>>>>>>在请求处理之前进行调用(Controller方法调用之前)");
     // 只有返回true才会继续向下执行,返回false取消当前请求
     return false;
  }
}

SimpleWebAppConfigurer.java-Klassencode:

package com.example.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import com.example.interceptor.IndexInterceptor;
import com.example.interceptor.IndexInterceptor2;
//只要能被springboot扫描到即可
@Configuration
public class SimpleWebAppConfigurer extends WebMvcConfigurerAdapter{
  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    // 多个拦截器组成一个拦截器链
    // addPathPatterns 用于添加拦截规则
    // excludePathPatterns 用户排除拦截
    registry.addInterceptor(new IndexInterceptor()).addPathPatterns("/**");
    registry.addInterceptor(new IndexInterceptor2()).addPathPatterns("/**");
    super.addInterceptors(registry);
  }
}

4. Interceptor-Parsing-Anweisungen

preHandle** : Vorverarbeitungsrückrufmethode zum Implementieren der Prozessorvorverarbeitung (z. B. Anmeldeprüfung). Der dritte Parameter ist der Antwortprozessor (z. B. unsere Controller-Implementierung im vorherigen Kapitel).

Rückgabewert: true bedeutet, den Prozess fortzusetzen (z. B. Aufruf). Der nächste Interceptor oder Prozessor);

false zeigt an, dass der Prozess unterbrochen ist (z. B. ein Fehler bei der Anmeldeprüfung) und keine weiteren Interceptoren oder Prozessoren mehr aufrufen. Zu diesem Zeitpunkt müssen wir eine Antwort generieren ;

postHandle**: Nachbearbeitungs-Rückrufmethode zur Implementierung der Nachbearbeitung des Prozessors (jedoch vor dem Rendern der Ansicht). Zu diesem Zeitpunkt können wir modelAndView (Model und ViewObjekt ) verarbeitet Modelldaten oder Ansichten modelAndView kann auch null sein.

afterCompletion**: Rückrufmethode, nachdem die gesamte Anforderung verarbeitet wurde, dh beim Rendern der Ansicht zurückgerufen wird. Bei der Leistungsüberwachung können wir beispielsweise die Endzeit aufzeichnen und die Verbrauchszeit hier ausgeben. und kann auch eine Ressourcenbereinigung durchführen, ähnlich wie „finally“ in „try-catch-finally“, ruft jedoch nur „afterCompletion**“ des Interceptors auf, dessen „preHandle“ in der Prozessorausführungskette „true“ zurückgibt.

[Verwandte Empfehlungen]

1.

Kostenlose Java-Video-Tutorials

2. Umfassende Analyse von Java-Annotationen

3.

FastJson Tutorial-Handbuch

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung von Beispielen für Abfangjäger in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn