最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2017年12月23日 21:15:53   作者:Sniper_ZL  
下面小編就為大家分享一篇string boot 與 自定義interceptor的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

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

一. 攔截器的執(zhí)行順序

1. 目錄

2. 攔截器

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

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, 才會繼續(xù)下面的執(zhí)行.

攔截器注冊:

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

為了驗證執(zhí)行順序, 這里使用了 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 的時候, 就會在控制臺輸出響應的信息.

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

1. 在控制器方法執(zhí)行之前, 執(zhí)行的 preHandle 方法

2. 執(zhí)行控制器的action方法

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

4. 解析view

5. 解析完之后, 執(zhí)行 afterCompletion 方法

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

二. 攔截器實現(xiàn)權(quán)限驗證

同樣的, 先加入權(quán)限攔截器

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

然后注冊權(quán)限攔截器

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

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

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

注解里面, 并不需要任何內(nèi)容.

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

<!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>

結(jié)果演示方式:

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

你會發(fā)現(xiàn)訪問 first/index 的時候, 是可以訪問的.

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

以上這篇string boot 與 自定義interceptor的實例講解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于SpringMVC攔截器實現(xiàn)接口耗時監(jiān)控功能

    基于SpringMVC攔截器實現(xiàn)接口耗時監(jiān)控功能

    本文呢主要介紹了基于SpringMVC攔截器實現(xiàn)的接口耗時監(jiān)控功能,統(tǒng)計接口的耗時情況屬于一個可以復用的功能點,因此這里直接使用 SpringMVC的HandlerInterceptor攔截器來實現(xiàn),需要的朋友可以參考下
    2024-02-02
  • 實例詳解Java調(diào)用第三方接口方法

    實例詳解Java調(diào)用第三方接口方法

    很多項目都會封裝規(guī)定好本身項目的接口規(guī)范,所以大多數(shù)需要去調(diào)用對方提供的接口或第三方接口(短信、天氣等),下面這篇文章主要給大家介紹了關(guān)于Java調(diào)用第三方接口方法的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • SpringBoot底層注解超詳細介紹

    SpringBoot底層注解超詳細介紹

    這篇文章主要介紹了SpringBoot底層注解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-09-09
  • Springboot實現(xiàn)頁面間跳轉(zhuǎn)功能

    Springboot實現(xiàn)頁面間跳轉(zhuǎn)功能

    這篇文章主要介紹了Springboot實現(xiàn)頁面間跳轉(zhuǎn)功能,本文給大家分享兩種方式,方法一和方法二是不沖突的,但是通常情況下如果用方法二addViewControllers,需要把方法一所寫的Controller類給注釋掉,需要的朋友可以參考下
    2023-10-10
  • 使用Mybatis-plus實現(xiàn)時間自動填充(代碼直接可用)

    使用Mybatis-plus實現(xiàn)時間自動填充(代碼直接可用)

    這篇文章主要介紹了使用Mybatis-plus實現(xiàn)時間自動填充(代碼直接可用),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java多線程之線程池七個參數(shù)詳解

    Java多線程之線程池七個參數(shù)詳解

    這篇文章主要介紹了Java多線程之線程池七個參數(shù)詳解,文中有很詳細的代碼示例,對正在學習java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04
  • java統(tǒng)計字符串中指定元素出現(xiàn)次數(shù)方法

    java統(tǒng)計字符串中指定元素出現(xiàn)次數(shù)方法

    這篇文章主要介紹了java統(tǒng)計字符串中指定元素出現(xiàn)次數(shù)方法,需要的朋友可以參考下
    2015-12-12
  • 工作中禁止使用Executors快捷創(chuàng)建線程池原理詳解

    工作中禁止使用Executors快捷創(chuàng)建線程池原理詳解

    這篇文章主要為大家介紹了工作中禁止使用Executors快捷創(chuàng)建線程池原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • JAVA獲取文件絕對路徑的方法

    JAVA獲取文件絕對路徑的方法

    這篇文章主要介紹了JAVA獲取文件絕對路徑的方法,涉及針對文件路徑的操作技巧,需要的朋友可以參考下
    2015-02-02
  • Java泛型定義與用法實例詳解

    Java泛型定義與用法實例詳解

    這篇文章主要介紹了Java泛型定義與用法,結(jié)合實例形式較為詳細的分析了Java中泛型的概念、原理、定義、使用方法及相關(guān)操作注意事項,需要的朋友可以參考下
    2018-08-08

最新評論

建水县| 泽库县| 福海县| 孙吴县| 乌什县| 阜城县| 宁津县| 兴隆县| 巴林左旗| 五指山市| 绥江县| 钟山县| 万宁市| 原阳县| 阿拉善盟| 台北县| 西乌珠穆沁旗| 铜山县| 高雄县| 汨罗市| 左权县| 金沙县| 龙井市| 涞水县| 鄂州市| 泽州县| 余庆县| 怀仁县| 宜黄县| 门头沟区| 黄平县| 和龙市| 通城县| 正宁县| 武鸣县| 西盟| 安达市| 文昌市| 平塘县| 织金县| 巩留县|