一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - JAVA教程 - string boot 與 自定義interceptor的實例講解

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

2021-03-11 10:58Sniper_ZL JAVA教程

下面小編就為大家分享一篇string boot 與 自定義interceptor的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

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

一. 攔截器的執行順序

1. 目錄

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

2. 攔截器

攔截器里面, 我加了三個(first,two,third), 但是內容都差不多.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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, 才會繼續下面的執行.

攔截器注冊:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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);
  }
}

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

?
1
2
3
4
5
6
7
8
9
10
11
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:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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:

?
1
2
3
4
5
6
7
8
9
10
<!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 方法

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

二. 攔截器實現權限驗證

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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 {
  }
}

然后注冊權限攔截器

?
1
2
3
4
5
6
7
8
9
10
11
12
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);
  }
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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 上.

?
1
2
3
4
5
6
7
8
9
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 {
}

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!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的實例講解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/elvinle/archive/2017/12/23/8093062.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 大象传媒1234区 | 超碰av| 日韩特级片 | 精品一区二区视频 | 国产成人亚洲精品乱码在线观看 | 99久久成人| 啪啪免费入口网站 | 免费一级日本c片完整版 | 日本高清不卡一区久久精品 | 亚洲欧美自偷自拍另类小说 | 亚洲第一在线 | 99久久综合 | 赤色疑惑 | 久久精品黄AA片一区二区三区 | 狠狠五月天中文字幕 | 亚洲第一色网 | 国内精品久久久久影院中国 | 国产中文视频 | 精品在线小视频 | 五月色婷婷在线影院 | 三上悠亚精品专区久久 | 亚洲国产欧美日韩在线一区 | 好大好猛好深好爽视频 | 丫鬟粗大狠狠贯穿h | 草草视频在线观看最新 | 色呦呦tv | 日韩高清一区二区三区不卡 | 无人区免费一二三四乱码 | 猫咪maomiav永久网址 | 精品在线免费观看视频 | 欧美xxx000喷水 | 国产成人免费 | 亚洲成人99 | 国产1区2区在线观看 | 美女用手扒自己下部 | 成人看片免费无限观看视频 | 无限好资源第一片免费韩国 | 青视频在线 | 成人影院免费在线观看 | 男人天堂日韩 | 奶大逼紧 |