亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

string boot 與 自定義interceptor的實例講解

2024-07-13 10:15:24
字體:
來源:轉載
供稿:網友

前面學習過過濾器, 但是過濾器是針對servlet的, 用在springmvc和spring boot里面, 功能上, 感覺并不是很好用.

那這里來學習一下攔截器.

一. 攔截器的執行順序

1. 目錄

string,boot,自定義,interceptor

2. 攔截器

攔截器里面, 我加了三個(First,Two,Third), 但是內容都差不多.

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 返回true, 才會繼續下面的執行.

攔截器注冊:

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

為了驗證執行順序, 這里使用了 thymeleaf, 然后在前臺訪問了我后臺傳過去的屬性, 在訪問的時候, 就會打印信息到控制臺

package org.elvin.boot.pojo;public class Book {  private String name ;  public String getName() {    System.out.println("view : Book'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";  }}

View:

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

在訪問 localhost:8080/first/index 的時候, 就會在控制臺輸出響應的信息.

string,boot,自定義,interceptor

這樣, 就能看出單個攔截器的執行順序.

1. 在控制器方法執行之前, 執行的 preHandle 方法

2. 執行控制器的action方法

3. 執行完action, 解析view之前(如果有的話), 執行攔截器的 posthandle 方法

4. 解析view

5. 解析完之后, 執行 afterCompletion 方法

當注冊多個攔截器的時候, 執行順序, 如圖上所示了.

二. 攔截器實現權限驗證

同樣的, 先加入權限攔截器

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 {  }}

然后注冊權限攔截器

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;@Configurationpublic class RegisterInterceptor extends WebMvcConfigurerAdapter {  @Override  public void addInterceptors(InterceptorRegistry registry) {    registry.addInterceptor(new LoginInterceptor());    super.addInterceptors(registry);  }}

在控制器中加入登錄控制器, 提供登錄頁面和注銷方法

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

這里我做了一個免登錄注解, 可以加在Controller上, 也可以加在 action 上.

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 {}

注解里面, 并不需要任何內容.

登錄頁面(這里登錄頁面只是為了注銷用的, 所以訪問過這個頁面之后, 就表示登錄成功了).

<!DOCTYPE html><html xmlns:th="http://www.thymeleaf.org"><head>  <meta charset="UTF-8"/>  <title>Title</title></head><body><div class="container">  <input type="button" value="注銷" 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("注銷成功");          }        }      });    });  });</script></body></html>

結果演示方式:

在瀏覽器中, 先打開 http://localhost:8080/login/index 頁面, 然后在新標簽中訪問 http://localhost:8080/first/index 頁面.

你會發現訪問 first/index 的時候, 是可以訪問的.

此時, 在login/index頁面中, 點擊注銷按鈕之后, 再刷新 first/index 頁面, 就會直接跳去登錄頁面.

以上這篇string boot 與 自定義interceptor的實例講解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美与黑人午夜性猛交久久久| 日韩电视剧免费观看网站| 日韩男女性生活视频| 色综合导航网站| 成人在线激情视频| 久久精品在线播放| 日韩视频一区在线| 欧美亚洲另类激情另类| www.亚洲一二| 91免费在线视频网站| 日日噜噜噜夜夜爽亚洲精品| 日韩免费视频在线观看| 欧美激情亚洲综合一区| 搡老女人一区二区三区视频tv| 日韩中文字幕在线视频播放| 91亚洲精品在线观看| 亚洲成人免费在线视频| 久久久久久久电影一区| 国产精品国产福利国产秒拍| 姬川优奈aav一区二区| 亚洲日本aⅴ片在线观看香蕉| 国产精品亚洲激情| 欧日韩不卡在线视频| 亚洲天堂av综合网| 亚洲综合精品伊人久久| 国产福利成人在线| 91香蕉嫩草神马影院在线观看| 97视频人免费观看| 国产成人精品优优av| 精品久久久久久| 亚洲电影免费观看| 欧美日韩中国免费专区在线看| 91av视频在线免费观看| 红桃av永久久久| 亚洲国产小视频在线观看| 亚洲福利在线视频| 成人美女av在线直播| 国产精品日韩欧美综合| 亚洲国产私拍精品国模在线观看| 亚洲欧美激情另类校园| www.亚洲成人| 欧美区在线播放| 2018国产精品视频| 成人av电影天堂| 韩国精品久久久999| 一级做a爰片久久毛片美女图片| 夜夜嗨av色一区二区不卡| 久久深夜福利免费观看| 国产一区二区三区在线播放免费观看| 中文字幕日韩欧美在线| 亚洲国产日韩欧美在线动漫| 午夜精品久久久99热福利| 欧美精品情趣视频| 欧美中文字幕在线视频| 国产精品老牛影院在线观看| 国产美女精品视频| 日韩最新av在线| 亚洲福利视频久久| 亚洲精品自拍视频| 欧美一二三视频| 97超碰国产精品女人人人爽| 欧美最顶级丰满的aⅴ艳星| 欧美一级视频免费在线观看| 亚洲精品久久久久久久久久久久久| 国产亚洲精品va在线观看| 色综合久综合久久综合久鬼88| 国内精品模特av私拍在线观看| 国产精品免费久久久久久| 久久在线免费观看视频| 国产精品久久综合av爱欲tv| 亚洲国产精品美女| 亚洲色无码播放| 国产欧美一区二区三区四区| 精品亚洲精品福利线在观看| 中文亚洲视频在线| x99av成人免费| 亚洲欧美激情精品一区二区| 欧美激情视频一区二区| 激情久久av一区av二区av三区| 日日噜噜噜夜夜爽亚洲精品| zzijzzij亚洲日本成熟少妇| 激情成人在线视频| 在线观看亚洲区| 91国产精品电影| 国产精品69精品一区二区三区| 欧美日韩一区二区在线| 久久精品国产欧美亚洲人人爽| 亚洲欧美日韩天堂| 国产亚洲精品久久| 久久久久久999| 国产成人精品视| 欧美成人精品一区二区三区| 亚洲老司机av| 日韩精品免费一线在线观看| 国产精品高清免费在线观看| 伊人男人综合视频网| 亚洲一区二区三区四区在线播放| 国产婷婷成人久久av免费高清| 欧美日韩在线视频首页| 午夜美女久久久久爽久久| 91久久精品国产| 91沈先生在线观看| 国产成人亚洲综合91| 精品久久久久久中文字幕| 亚洲福利视频网站| 亚洲在线免费视频| 国产视频丨精品|在线观看| 在线视频精品一| 国产精品视频专区| 亚洲精品成人网| 国产精品久久综合av爱欲tv| 亚洲成人性视频| 欧亚精品在线观看| 98视频在线噜噜噜国产| 成人免费网站在线| 欧美日韩在线视频一区二区| 日韩专区在线播放| 亚洲偷熟乱区亚洲香蕉av| 亚洲精品97久久| 97在线观看免费| 欧美中文在线字幕| 66m—66摸成人免费视频| 日韩精品久久久久久福利| 美女精品视频一区| 亚洲少妇激情视频| 国产亚洲欧美日韩一区二区| 国产91露脸中文字幕在线| 久久国产精品久久国产精品| 日韩国产在线播放| 中文字幕亚洲综合| 亚洲高清久久久久久| 国产精品电影网站| 国产精品电影网| 色综合色综合网色综合| 亚洲最大的网站| 久久伊人免费视频| 亚洲欧美日韩久久久久久| 国产免费一区视频观看免费| 欧美日本啪啪无遮挡网站| 国产精品视频中文字幕91| 久久久国产在线视频| 国产99视频精品免视看7| 亚洲天堂精品在线| 国产97在线亚洲| 国产欧美一区二区三区在线看| 亚洲欧美综合另类中字| 7777免费精品视频| www.99久久热国产日韩欧美.com| 黑人巨大精品欧美一区二区三区| 伊人av综合网| 中文字幕日韩欧美在线视频| 青草青草久热精品视频在线网站| 欧美国产日韩xxxxx| 国产精品黄页免费高清在线观看| 青青久久av北条麻妃黑人| 久久91超碰青草是什么| 91精品中文在线| 亚洲天堂网在线观看| 欧美性猛交xxxx免费看漫画| 26uuu亚洲伊人春色| 国产亚洲日本欧美韩国| 欧美精品激情在线| 国产在线98福利播放视频| 久久精品国产精品|