国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - 詳解Spring AOP 實(shí)現(xiàn)“切面式”valid校驗(yàn)

詳解Spring AOP 實(shí)現(xiàn)“切面式”valid校驗(yàn)

2021-03-23 13:57CatalpaFlat Java教程

本篇文章主要介紹了詳解Spring AOP 實(shí)現(xiàn)“切面式”valid校驗(yàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

why:

為什么要用aop實(shí)現(xiàn)校驗(yàn)

answer:

spring mvc 默認(rèn)自帶的校驗(yàn)機(jī)制 @valid + bindingresult, 但這種默認(rèn)實(shí)現(xiàn)都得在controller方法的中去接收bindingresult,從而進(jìn)行校驗(yàn).

eg:

?
1
2
3
4
5
6
7
if (result.haserrors()) {
 list<objecterror> allerrors = result.getallerrors();
 list<string> errorlists = new arraylist<>();
  for (objecterror objecterror : allerrors) {
    errorlists.add(objecterror.getdefaultmessage());
  }
 }

獲取errorlists。這樣實(shí)現(xiàn)的話,每個(gè)需要校驗(yàn)的方法都得重復(fù)調(diào)用,即使封裝也是。

可能上面那么說(shuō)還不能表明spring 的@valid + bindingresult實(shí)現(xiàn),我先舉個(gè)“栗子”。

1. 栗子(舊版本)

1.1 接口層(idal)

eg: 簡(jiǎn)單的post請(qǐng)求,@requestbody接收請(qǐng)求數(shù)據(jù),@valid + bindingresult進(jìn)行校驗(yàn)

  1. httpmethid: post
  2. parameters:@requestbody接收請(qǐng)求數(shù)據(jù)
  3. valid:@valid +bindingresult
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@responsebody
 @postmapping("body")
 public responsevo bodypost(@requestbody @valid testvo body,bindingresult result){
  //校驗(yàn)到錯(cuò)誤
  if (result.haserrors()) {
   list<objecterror> allerrors = result.getallerrors();
   list<string> lists = new arraylist<>();
   for (objecterror objecterror : allerrors) {
     lists.add(objecterror.getdefaultmessage());
   }
   return new responsevo(httpstatus.bad_request.value(), "parameter empty", lists);
 }
   return new responsevo(httpstatus.ok.value(), "bodypost", null);
}

1.2 實(shí)體(vo)校驗(yàn)內(nèi)容

@valid + bindingresult的校驗(yàn)注解一大堆,網(wǎng)上一摸就有的!

?
1
2
3
4
5
6
7
8
9
10
public class testvo {
  @getter
  @setter
  @min(value = 0,message = "請(qǐng)求參數(shù)isstring不能小于0")
  private integer isint;
  @getter
  @setter
  @notblank(message = "請(qǐng)求參數(shù)isstring不能為空")
  private string isstring;
}

1.3 結(jié)果測(cè)試

詳解Spring AOP 實(shí)現(xiàn)“切面式”valid校驗(yàn)

2. aop校驗(yàn)(升級(jí)版)

可以看到若是多個(gè)像bodypost一樣都需要對(duì)body進(jìn)行校驗(yàn)的話,那么有一坨代碼就必須不斷復(fù)現(xiàn),即使改為父類可復(fù)用方法,也得去調(diào)用。所以左思右想還是覺(jué)得不優(yōu)雅。所以有了aop進(jìn)行切面校驗(yàn)。

2.1 接口層(idal)

是的!你沒(méi)看錯(cuò),上面那一坨代碼沒(méi)了,也不需要調(diào)用父類的的共用方法。就單單一個(gè)注解就完事了:@paramvalid

?
1
2
3
4
5
6
@paramvalid
@responsebody
@postmapping("body")
public responsevo bodypost(@requestbody @valid testvo body,bindingresult result){
  return new responsevo("bodypost", null);
}

2.2 自定義注解(annotation)

這個(gè)注解也是簡(jiǎn)簡(jiǎn)單單的用于方法的注解。

?
1
2
3
@target(elementtype.method)
@retention(retentionpolicy.runtime)
public @interface paramvalid {}

2.3 重點(diǎn)!切面實(shí)現(xiàn)(aspect)

切面詳解:

@before: 使用注解方式@annotation(xx),凡是使用到所需切的注解(@paramvalid),都會(huì)調(diào)用該方法

joinpoint: 通過(guò)joinpoint獲取方法的參數(shù),以此獲取bindingresult所校驗(yàn)到的內(nèi)容

遷移校驗(yàn)封裝: 將原先那一坨校驗(yàn)遷移到aspect中:validrequestparams

響應(yīng)校驗(yàn)結(jié)果:

  1. 通過(guò)requestcontextholder獲取response
  2. 獲取響應(yīng)outputstream
  3. 將bindingresult封裝響應(yīng)
?
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
@aspect
@component
public class paramvalidaspect {
 
  private static final logger log = loggerfactory.getlogger(paramvalidaspect.class);
 
  @before("@annotation(paramvalid)")
  public void paramvalid(joinpoint point, paramvalid paramvalid) {
    object[] paramobj = point.getargs();
    if (paramobj.length > 0) {
      if (paramobj[1] instanceof bindingresult) {
        bindingresult result = (bindingresult) paramobj[1];
        responsevo errormap = this.validrequestparams(result);
        if (errormap != null) {
          servletrequestattributes res = (servletrequestattributes) requestcontextholder.getrequestattributes();
          httpservletresponse response = res.getresponse();
          response.setcharacterencoding("utf-8");
          response.setcontenttype(mediatype.application_json_utf8_value);
          response.setstatus(httpstatus.bad_request.value());
 
          outputstream output = null;
          try {
            output = response.getoutputstream();
            errormap.setcode(null);
            string error = new gson().tojson(errormap);
            log.info("aop 檢測(cè)到參數(shù)不規(guī)范" + error);
            output.write(error.getbytes("utf-8"));
          } catch (ioexception e) {
            log.error(e.getmessage());
          } finally {
            try {
              if (output != null) {
                output.close();
              }
            } catch (ioexception e) {
              log.error(e.getmessage());
            }
          }
        }
      }
    }
  }
 
  /**
   * 校驗(yàn)
   */
  private responsevo validrequestparams(bindingresult result) {
    if (result.haserrors()) {
      list<objecterror> allerrors = result.getallerrors();
      list<string> lists = new arraylist<>();
      for (objecterror objecterror : allerrors) {
        lists.add(objecterror.getdefaultmessage());
      }
      return new responsevo(httpstatus.bad_request.value(), "parameter empty", lists);
    }
    return null;
  }
}

2.4 測(cè)試結(jié)果

 詳解Spring AOP 實(shí)現(xiàn)“切面式”valid校驗(yàn)

看了上面兩種結(jié)果,就可以對(duì)比出使用spring aop 配合@valid + bindingresult進(jìn)行校驗(yàn)的優(yōu)點(diǎn):

  1. 去除代碼冗余
  2. aop異步處理
  3. 優(yōu)化代碼實(shí)現(xiàn)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://juejin.im/post/5a5e1159518825732b19d8ce

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 久热在线 | 欧美三区二区一区 | 国产免费av网站 | 日韩成人影院 | 私人毛片免费高清视频 | 国产精品亚洲第一区 | 互换娇妻呻吟hd中文字幕 | 欧美精品一区二区三区蜜桃视频 | 日韩精品久久久久久 | av网站观看| 免费激情网站 | 一级做a爰性色毛片免费1 | 欧美国产伦久久久久久 | 久久99精品一区二区三区 | 久久亚洲精品国产精品紫薇 | 九热在线视频 | 久久久人成影片一区二区三区 | 欧美一区二区三区在线 | 免费精品| 亚洲午夜精品毛片成人播放器 | 国产成人精品一区二 | 高清一区二区在线观看 | 激情五月婷婷 | 国产精品久久国产精品 | 韩日精品一区 | 国产美女久久久 | 精品视频在线播放 | 久久亚洲欧美日韩精品专区 | 天堂v在线视频 | 欧美激情一区二区三级高清视频 | 欧美日韩在线播放 | 色二区| 免费黄网站在线观看 | 高清一区在线 | 日韩在线视频观看 | 丝袜美腿一区二区三区 | 亚洲一区二区三区在线 | 黄网站色大毛片 | 一本大道av日日躁夜夜躁 | 亚洲一区中文字幕在线 | 久久精品xx老女人老配少 |