1. 程式人生 > >【SpringBoot】表單驗證和使用AOP處理請求

【SpringBoot】表單驗證和使用AOP處理請求

表單驗證

專案是上篇文章繼續的。

首先說下要幹嘛,我們需要攔截People年齡在18歲以下的

首先是在People上的年齡增加一個註解

@Min(value = 18,message = "年齡必須大於18")//message為提示  20180103
private Integer age;

在這裡,我們攔截新增的方法
也就是IndexController類中的peopleAdd方法

/**
 * 新增一個物件
 * 增加一個功能,如果年齡大於18,就不讓新增進資料庫 20180103
 * @param people
 * @return
 */
@PostMapping
(value = "/add") public People peopleAdd(@Valid People people, BindingResult bindingResult){//@Valid 註解表示使用資料校驗 People類中對年齡進行了限制 ,驗證返回結果會在bindingResult物件中 20180103 //@RequestParam(value = "people") 直接傳類的時候,建議不要使用RequestParam註解 //當然,你可以選擇每一個引數都寫上,但沒必要,更多的時候是直接傳類物件,注意url的引數名和類中屬性名對上 if(bindingResult.hasErrors()){//驗證出現錯誤
System.out.println("驗證錯誤資訊:"+bindingResult.getFieldError().getDefaultMessage()); return null; } return peopleDao.save(people); }

這樣我們就實現了年齡的攔截,當年齡沒有大於等於18,則bindingResult.hasErrors()返回的是true

沒有什麼新的知識點,springMVC都學過的
與Min註解相對應的還有@Max註解

使用AOP處理請求

AOP是一種程式設計正規化,與語言無關,是一種程式設計思想
下面列出三種程式設計思想:
AOP-面向切面 Aspect Oriented Programming
OOP-面向物件 Object Oriented Programming
POP-面向過程 Procedure Oriented Programming

面向過程到面向物件的區別
其實就是思考點的不同
我們用下雨來說一個例子

面向過程的思想會這樣做:
假如下雨了,我打開了雨傘

在面向物件的思想中,應該這麼做:
比如用Java,首先會實現一個叫天氣的物件,給天氣物件賦予一個下雨的動作
至於我,也會實現一個我的物件,給我這個物件賦予一個打傘的動作
在Java裡面,這些動作可以稱為方法

上面這兩種思想其實就是”換個角度看世界,換個姿勢處理問題”

AOP的通用思想是:
將通用邏輯從具體的業務邏輯中分離出來

統一處理請求日誌

以記錄每一個http請求來寫例項

首先去pom.xml新增aop的依賴

<!-- AOP的依賴-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

增加一個aop的類:

package cn.chenhaoxiang.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;


/**
 * Created with IntelliJ IDEA.
 * User: 陳浩翔.
 * Date: 2018/1/3.
 * Time: 下午 10:10.
 * Explain:
 */
@Aspect
@Component
public class HttpAspect {

    private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class);//使用org.slf4j.Logger,
    /**
     * 定義切面
     */
    @Pointcut("execution(public * cn.chenhaoxiang.controller.IndexController.*(..))")
    public void httpLog(){
    }
    /**
     * 在方法執行之前執行
     */
//    @Before("execution(public * cn.chenhaoxiang.controller.IndexController.*(..))")//*在這裡表示匹配所有的方法, (..) 表示任意引數,包含沒有引數的
    @Before("httpLog()")
    public void before(JoinPoint joinPoint){
        logger.info("before");
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        //url
        logger.info("url={}",request.getRequestURI());//會把request.getRequestURI()的值賦值到{}中去
        //method  請求方式
        logger.info("method={}",request.getMethod());
        //ip
        logger.info("ip={}",request.getRemoteAddr());
        //請求的類方法
        logger.info("class_method={}",joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName());
        //引數
        logger.info("args={}",joinPoint.getArgs());
    }

//    @After("execution(public * cn.chenhaoxiang.controller.IndexController.*(..))")//這個和上面的Before裡面的值重複了,我們可以換種方式來實現
    @After("httpLog()")
    public void after(){
        logger.info("after");
    }

    @AfterReturning(returning = "object",pointcut = "httpLog()")
    public void afterReturning(Object object){//object為方法返回的引數
        logger.info("response={}",object);//toString,不然輸出的物件會是地址
        //最好是不寫object.toString(),直接輸出object,這樣的話,就不用擔心object空指標了。
    }

}

基本上就是這些了。本章就到這兒了,該睡覺了,現在還在集體宿舍,鍵盤聲比較大、
以後出去住就可以學習到半夜了,哈哈

原始碼下載地址:

GITHUB原始碼下載地址:

本文章由[諳憶]編寫, 所有權利保留。
歡迎轉載,分享是進步的源泉。