SpringBoot攔截器

/**
* 環(huán)境 
*Windows 7 
*JDK 1.8 
*SpringBoot 2.0.2 
*Eclipse Photon
*/

所有的開(kāi)發(fā)之中攔截器一定是一個(gè)必須要使用的功能梯醒,利用攔截器可以更加有效的實(shí)現(xiàn)數(shù)據(jù)的驗(yàn)證處理吸重,而且最為幸運(yùn)的是在 SpringBoot 之中所使用的攔截器與 Spring 中的攔截器完全一樣刽辙。

項(xiàng)目所需JAR(pom文件)

<dependencies>
   <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

        <dependency>
            <groupId>com.github.kischang</groupId>
            <artifactId>fastdfs-client</artifactId>
            <version>0.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jetty</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
  </dependencies>

第一部分 基礎(chǔ)攔截器

1.創(chuàng)建SpringBoot啟動(dòng)類(lèi) (StartSpringBootMain.java)

package com.dxf.myspringboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication  // 啟動(dòng)SpringBoot程序,而后自帶子包掃描
public class StartSpringBootMain {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(StartSpringBootMain.class, args);
    }
}

2.創(chuàng)建Model(Member.java)

package com.dxf.myspringboot.model;

public class Member {
    private Long mid;
    private String name;
    private int age;
    private Double salary;
    public Long getMid() {
        return mid;
    }

    public void setMid(Long mid) {
        this.mid = mid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Double getSalary() {
        return salary;
    }

    public void setSalary(Double salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Member [mid=" + mid + ", name=" + name + ", age=" + age + ", salary=" + salary + "]";
    }
}

3.創(chuàng)建Member控制器(MemberController.java)

package com.dxf.myspringboot.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.dxf.myspringboot.model.Member;

@Controller
public class MemberController {

    @RequestMapping(value="/add_member_pre",method=RequestMethod.GET)
    public String addMemberPre() {
        return "add_member";
    }
    @RequestMapping(value="/add_member",method=RequestMethod.POST)
    @ResponseBody
    public Object addMember(Member member) {
        return member;
    }
}

4.編寫(xiě)HTML界面(add_member.html)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form th:action="@{/add_member}" method="post">
        用戶編號(hào):<input type="text" name="mid" placeholder="請(qǐng)輸入mid"/><br/>
        用戶姓名:<input type="text" name="name" placeholder="請(qǐng)輸入用戶名"/><br/>
        <input type="submit" value="表單提交"/>
    </form>
</body>
</html>

5.SpringBoot配置文件(application.yml)

server:
  port: 80

此時(shí)一個(gè)正常的 MVC 的代碼就實(shí)現(xiàn)完成了精盅,在這里我們進(jìn)行個(gè)小測(cè)試看下能否正常運(yùn)行呢
首先在瀏覽器輸入 localhost/add_member_pre


image

再輸入各種參數(shù)


image

我們看下能否正常輸出Restful
image

6.攔截器配置(MyInterceptor.java)

為了更好的說(shuō)明問(wèn)題胳施,現(xiàn)在將攔截器定義在外包中;

package com.dxf.utils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;

public class MyInterceptor implements HandlerInterceptor {
    private Logger log = LoggerFactory.getLogger(MyInterceptor.class) ;
    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        HandlerMethod handlerMethod = (HandlerMethod) handler ;
        this.log.info("【*** MyInterceptor.preHandle() ***】" + handlerMethod.getBean().getClass().getSimpleName());
        return true;    // 如果返回false表示不繼續(xù)請(qǐng)求羽嫡,如果返回true表示繼續(xù)請(qǐng)求
    }

    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        HandlerMethod handlerMethod = (HandlerMethod) handler ;
        this.log.info("【*** MyInterceptor.postHandle() ***】" + handlerMethod.getBean().getClass().getSimpleName());
        this.log.info("【*** MyInterceptor.postHandle() ***】" + modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        this.log.info("【*** MyInterceptor.afterCompletion() ***】攔截處理完畢" );
    }
}

7.那么此時(shí)如果要想使用攔截器則必須有一個(gè)攔截器的配置類(lèi)”纠眩現(xiàn)在不在編寫(xiě)配置文件了,所有的配置直接利用一個(gè)類(lèi)完成杭棵。(MyWebApplicationConfig.java)

package com.dxf.myspringboot.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import com.dxf.utils.MyInterceptor;

@Configuration
public class MyWebApplicationConfig extends WebMvcConfigurerAdapter{

    @SuppressWarnings("deprecation")
    @Override
    public void addInterceptors(InterceptorRegistry registry) { // 進(jìn)行攔截器的注冊(cè)處理操作
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**") ;   // 匹配路徑
        super.addInterceptors(registry);
    }
}

現(xiàn)在只要找到了可以操作的控制器程序類(lèi)婚惫,那么就可以依照在 Spring 中講解的攔截器代碼那樣進(jìn)行各種驗(yàn)證規(guī)則的編寫(xiě)以及相應(yīng)的錯(cuò)誤提示輸出了。
附件(項(xiàng)目結(jié)構(gòu))


image

第二部分 AOP攔截器

在 Spring 里面還提供有一種 AOP 攔截器配置魂爪,不過(guò)大部分的 AOP 攔截器都是圍繞著業(yè)務(wù)層進(jìn)行攔截處理的先舷。

1.業(yè)務(wù)層接口(IMemberService.java)

package com.dxf.myspringboot.service;

import com.dxf.myspringboot.model.Member;

public interface IMemberService {
 public Member get(long mid) ;
}

2.業(yè)務(wù)層實(shí)現(xiàn)類(lèi)(MemberServiceImpl.java)

package com.dxf.myspringboot.service.imp;

import org.springframework.stereotype.Service;

import com.dxf.myspringboot.model.Member;
import com.dxf.myspringboot.service.IMemberService;

@Service
public class MemberServiceImpl implements IMemberService {
    @Override
    public Member get(long mid) {
        Member member = new Member();
        member.setMid(mid);
        member.setName("韓信");
        member.setSalary(100000.00);
        return member;
    }
    
}

3.現(xiàn)在業(yè)務(wù)層的操作完成之后隨意去修改控制層,讓控制層進(jìn)行業(yè)務(wù)層的調(diào)用

@Resource
    private IMemberService memberService ;
    @RequestMapping(value = "/member_get", method = RequestMethod.GET)
    @ResponseBody
    public Object get(long mid) {
        return this.memberService.get(mid) ;
    }

訪問(wèn)地址:http://localhost/member_get?mid=100

4.現(xiàn)在的業(yè)務(wù)層只是一個(gè)純粹的調(diào)用而已滓侍,但是現(xiàn)在希望對(duì)調(diào)用的過(guò)程進(jìn)行攔截處理蒋川,所以要想實(shí)現(xiàn)這樣的處理,那么就需要

引入新的開(kāi)發(fā)依賴(lài)包撩笆,修改 pom.xml 配置文件(這個(gè)我在之前已經(jīng)加了):

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

5.編寫(xiě)一個(gè) AOP 攔截的控制程序類(lèi)捺球。

package com.dxf.myspringboot.config;

import java.util.Arrays;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class ServiceAspect { // 此時(shí)定義有一個(gè)業(yè)務(wù)層的攔截處理
    private Logger log = LoggerFactory.getLogger(ServiceAspect.class);
    @Around("execution(* com.dxf..service..*.*(..))")
    public Object arroundInvoke(ProceedingJoinPoint point) throws Throwable {
        this.log.info("【*** Service-Before ***】執(zhí)行參數(shù):"
                + Arrays.toString(point.getArgs()));
        Object obj = point.proceed(point.getArgs()); // 進(jìn)行具體業(yè)務(wù)調(diào)用
        this.log.info("【*** Service-After ***】返回結(jié)果:" + obj);
        return obj;
    }
}

如果大家也是用Eclispe的話,切入成功會(huì)出現(xiàn)以下標(biāo)記

image

6.測(cè)試
【啟動(dòng)StartSpringBootMain】---》【在瀏覽器輸入http://localhost/member_get?mid=100
image

看下后臺(tái)輸出
image

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末夕冲,一起剝皮案震驚了整個(gè)濱河市氮兵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌歹鱼,老刑警劉巖胆剧,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡秩霍,警方通過(guò)查閱死者的電腦和手機(jī)篙悯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)铃绒,“玉大人鸽照,你說(shuō)我怎么就攤上這事〉咝” “怎么了矮燎?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)赔癌。 經(jīng)常有香客問(wèn)我诞外,道長(zhǎng),這世上最難降的妖魔是什么灾票? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任峡谊,我火速辦了婚禮,結(jié)果婚禮上刊苍,老公的妹妹穿的比我還像新娘既们。我一直安慰自己,他們只是感情好正什,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開(kāi)白布啥纸。 她就那樣靜靜地躺著,像睡著了一般婴氮。 火紅的嫁衣襯著肌膚如雪斯棒。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,215評(píng)論 1 299
  • 那天主经,我揣著相機(jī)與錄音名船,去河邊找鬼。 笑死旨怠,一個(gè)胖子當(dāng)著我的面吹牛渠驼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鉴腻,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼迷扇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了爽哎?” 一聲冷哼從身側(cè)響起蜓席,我...
    開(kāi)封第一講書(shū)人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎课锌,沒(méi)想到半個(gè)月后厨内,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體祈秕,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年雏胃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了请毛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瞭亮,死狀恐怖方仿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情统翩,我是刑警寧澤仙蚜,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站厂汗,受9級(jí)特大地震影響委粉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜娶桦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一贾节、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧趟紊,春花似錦、人聲如沸碰酝。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)送爸。三九已至铛嘱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間袭厂,已是汗流浹背墨吓。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纹磺,地道東北人帖烘。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像橄杨,于是被迫代替她去往敵國(guó)和親秘症。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容