English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Beispiel zur Erklärung von Spring Boot und Custom Interceptor

前面学习过过滤器,但是过滤器是针对servlet的,用在springmvc和spring boot里面,功能上,感觉并不是很好用。

那么这里来学习一下拦截器。

1. 拦截器的执行顺序

1. Inhaltsverzeichnis

2. Interceptor

In den Interceptor wurden drei (First, Two, Third) hinzugefügt, aber der Inhalt ist ähnlich.

package org.elvin.boot.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FirstInterceptor implements HandlerInterceptor {
  @Override
  public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
    System.out.println("FirstInterceptor preHandle");
    return true;
  }
  @Override
  public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
    System.out.println("FirstInterceptor postHandle");
  }
  @Override
  public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
    System.out.println("FirstInterceptor afterCompletion");
  }
}

preHandle gibt true zurück, um die weitere Ausführung fortzusetzen.

Interceptor-Registrierung:

package org.elvin.boot.interceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class RegisterInterceptor extends WebMvcConfigurerAdapter {
  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new FirstInterceptor());
    registry.addInterceptor(new TwoInterceptor());
    registry.addInterceptor(new ThirdInterceptor());
    super.addInterceptors(registry);
  }
}

Um die Ausführungsreihenfolge zu überprüfen, wurde hier thymeleaf verwendet, und auf der Oberfläche wurde auf das vom Backend übermittelte Attribut zugegriffen. Beim Zugriff wird die Information auf die Konsole ausgegeben.

package org.elvin.boot.pojo;
public class Book {
  private String name ;
  public String getName() {
    System.out.println("view : Book's name is ") + name);
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
}

Controller:

package org.elvin.boot.Controller;
import org.elvin.boot.pojo.Book;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("first")
public class FirstController {
  private String controllerPath = "first"/";
  @GetMapping("index")
  public String index(Model model){
    System.out.println("controller : FirstController index doing...");
    Book book = new Book();
    book.setName("spring boot");
    model.addAttribute("book", book);
    return controllerPath + "index";
  }
}

Ansicht:

!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">-8" />
  <title>Title</title>
</head>
<body>
  <h1 th:text="${book.name}"</h1>
</body>
</html>

Beim Zugriff auf localhost:8080/first/Wenn Sie auf "index" zugreifen, werden die Antworten auf der Konsole ausgegeben.

So können Sie die Ausführungsreihenfolge eines einzelnen Interceptors erkennen.

1. Die Methode preHandle wird vor der Ausführung der Controller-Methode ausgeführt

2. Ausführung der Action-Methode des Controllers

3. Nach der Ausführung des Actions und vor der Analyse der Ansicht (falls vorhanden) wird die Methode posthandle des Interceptors ausgeführt

4. Analyse der Ansicht

5. Nach der Analyse wird die Methode afterCompletion ausgeführt

Wenn mehrere Interceptor registriert sind, ist die Ausführungsreihenfolge wie im Diagramm gezeigt.

2. Implementierung des Interceptors zur Berechtigungsprüfung

Gleichermaßen, fügen Sie zunächst den Berechtigungs-Interceptor hinzu.

package org.elvin.boot.interceptor;
import org.elvin.boot.annotation.NoLogin;
import org.springframework.util.StringUtils;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginInterceptor implements HandlerInterceptor {
  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handle) throws Exception {
    HandlerMethod method = (HandlerMethod ) handle;
    Class<?> controllerType = method.getBeanType();
    if(method.getMethodAnnotation(NoLogin.class) != null || controllerType.getAnnotation(NoLogin.class) != null){
      return true;
    }
    HttpSession session = request.getSession();
    String token = (String)session.getAttribute("token");
    if(!StringUtils.isEmpty(token)){
      return true;
    }
    response.sendRedirect("/login/index");
    return false;
  }
  @Override
  public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
  }
  @Override
  public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
  }
}

Dann wird der Berechtigungs-Interceptor registriert;

package org.elvin.boot.interceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class RegisterInterceptor extends WebMvcConfigurerAdapter {
  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new LoginInterceptor());
    super.addInterceptors(registry);
  }
}

Fügen Sie im Controller den LoginController hinzu, um die Login-Seite und die Abmeldemethode bereitzustellen.

package org.elvin.boot.Controller;
import org.elvin.boot.annotation.NoLogin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@NoLogin
@Controller
@RequestMapping("login")
public class LoginController {
  @Autowired
  private HttpServletRequest request;
  @Autowired
  private HttpServletResponse response;
  private String controllerPath = "login"/";
  //@NoLogin
  @GetMapping("index")
  public String index(){
    HttpSession session = request.getSession();
    session.setAttribute("token", "token");
    return controllerPath + "index";
  }
  //@NoLogin
  @PostMapping("checkOut")
  @ResponseBody
  public String checkOut(){
    HttpSession session = request.getSession();
    session.setAttribute("token", null);
    return "ok";
  }
}

Hier habe ich einen NoLogin-Annotation erstellt, die auf Controller oder action angewendet werden kann.

package org.elvin.boot.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface NoLogin {
}

In den Anmerkungen ist kein Inhalt erforderlich.

Anmelde-Seite (diese Anmelde-Seite dient nur zur Abmeldung, daher bedeutet ein Besuch dieser Seite, dass die Anmeldung erfolgreich war).

!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">-8"/>
  <title>Title</title>
</head>
<body>
<div class="container">
  <input type="button" value="Abmelden" id="checkOut"/>
</div>
<script th:src="@{/js/jquery-1.11.1.js}</script>
<script th:inline="javascript">
  $(function () {
    $(".container").delegate("#checkOut", "click", function () {
      $.ajax({
        url: [[@{/login/checkOut}]],
        type: 'post',
        data: {},
        success: function (res) {
          if (res == "ok") {
            alert("Abmeldung erfolgreich");
          }
        }
      });
    });
  });
</script>
</body>
</html>

Art der Ergebnisse:

Öffnen Sie zunächst http: im Browser.//localhost:8080/login/index-Seite, und besuchen Sie http: in einem neuen Tab.//localhost:8080/first/index-Seite.

Sie werden feststellen, dass der Zugriff auf first/wenn index, ist zugänglich.

In diesem Moment, in login/Nachdem Sie auf die Abmeldetaste auf der index-Seite geklickt haben, aktualisieren Sie first/Wenn Sie auf die index-Seite gehen, wird direkt zur Anmeldeseite weitergeleitet.

Dieser Artikel über das Beispiel von string boot und dem CustomInterceptor ist alles, was der Redakteur weitergegeben hat. Ich hoffe, es kann Ihnen als Referenz dienen und hoffe, dass alle mehr Unterstützung für das Anlaut-Tutorial leisten.

Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet übernommen und gehört dem Urheberrechtsinhaber. Der Inhalt wurde von Internetbenutzern freiwillig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht von Hand bearbeitet. Diese Website übernimmt keine Haftung für rechtliche Verpflichtungen. Wenn Sie Inhalte finden, die möglicherweise urheberrechtlich geschützt sind, sind Sie herzlich eingeladen, eine E-Mail an notice#w zu senden:3codebox.com (Bitte ersetzen Sie # durch @, wenn Sie eine Beschwerde einreichen, und fügen Sie relevante Beweise bei. Sobald die Anschuldigung bestätigt wird, wird diese Website den涉嫌侵权的Inhalt sofort löschen.)

Dir gefällt bestimmt