暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SpringBoot拦截器

dalaoyang 2018-05-20
649

在实际开发中,总存在着这样的场景,比如拦截请求的ip地址,或者在所有的请求都返回相同的数据,如果每一个方法都写出相同数据固然可以实现,但是随着项目的变大,重复的代码会越来越多,所以在这种情况我们可以用拦截器来实现。

最近一直在研究thymeleaf,越发的感觉这个很好用,所以这篇文章也选择结合这个来使用。

新建项目,pom文件如下:

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  3.         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  4.    <modelVersion>4.0.0</modelVersion>


  5.    <groupId>com.dalaoyang</groupId>

  6.    <artifactId>springboot_interceptor</artifactId>

  7.    <version>0.0.1-SNAPSHOT</version>

  8.    <packaging>jar</packaging>


  9.    <name>springboot_interceptor</name>

  10.    <description>springboot_interceptor</description>


  11.    <parent>

  12.        <groupId>org.springframework.boot</groupId>

  13.        <artifactId>spring-boot-starter-parent</artifactId>

  14.        <version>1.5.9.RELEASE</version>

  15.        <relativePath/> <!-- lookup parent from repository -->

  16.    </parent>


  17.    <properties>

  18.        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

  19.        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

  20.        <java.version>1.8</java.version>

  21.    </properties>


  22.    <dependencies>

  23.        <dependency>

  24.            <groupId>org.springframework.boot</groupId>

  25.            <artifactId>spring-boot-starter-thymeleaf</artifactId>

  26.        </dependency>

  27.        <dependency>

  28.            <groupId>org.springframework.boot</groupId>

  29.            <artifactId>spring-boot-starter-web</artifactId>

  30.        </dependency>


  31.        <dependency>

  32.            <groupId>org.springframework.boot</groupId>

  33.            <artifactId>spring-boot-devtools</artifactId>

  34.            <scope>runtime</scope>

  35.        </dependency>

  36.        <dependency>

  37.            <groupId>org.springframework.boot</groupId>

  38.            <artifactId>spring-boot-starter-test</artifactId>

  39.            <scope>test</scope>

  40.        </dependency>

  41.        <dependency>

  42.            <groupId>net.sourceforge.nekohtml</groupId>

  43.            <artifactId>nekohtml</artifactId>

  44.            <version>1.9.15</version>

  45.        </dependency>

  46.    </dependencies>


  47.    <build>

  48.        <plugins>

  49.            <plugin>

  50.                <groupId>org.springframework.boot</groupId>

  51.                <artifactId>spring-boot-maven-plugin</artifactId>

  52.            </plugin>

  53.        </plugins>

  54.    </build>



  55. </project>

复制

新建一个拦截器CommonInterceptor,继承HandlerInterceptorAdapter。给大家说一下,在继承HandlerInterceptorAdapter有三个拦截器是经常使用的: 1.preHandle在业务处理器处理请求之前被调用
2.postHandle在业务处理器处理请求执行完成后,生成视图之前执行 3.afterCompletion在DispatcherServlet完全处理完请求后被调用

本文使用的是postHandle,代码如下:

  1. package com.dalaoyang.interceptor;


  2. import org.apache.log4j.Logger;

  3. import org.springframework.stereotype.Component;

  4. import org.springframework.ui.ModelMap;

  5. import org.springframework.web.servlet.ModelAndView;

  6. import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;


  7. import javax.servlet.http.HttpServletRequest;

  8. import javax.servlet.http.HttpServletResponse;


  9. /**

  10. * @author dalaoyang

  11. * @Description

  12. * @project springboot_learn

  13. * @package com.dalaoyang.interceptor

  14. * @email yangyang@dalaoyang.cn

  15. * @date 2018/4/27

  16. */

  17. @Component

  18. public class CommonInterceptor extends HandlerInterceptorAdapter {

  19.    Logger logger = Logger.getLogger(CommonInterceptor.class);




  20.    //preHandle在业务处理器处理请求之前被调用,

  21.    //postHandle在业务处理器处理请求执行完成后,生成视图之前执行

  22.    //afterCompletion在DispatcherServlet完全处理完请求后被调用

  23.    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,

  24.                           ModelAndView modelAndView) throws Exception {

  25.        logger.info("请求ip:"+request.getRemoteAddr());

  26.        logger.info("请求的方法:"+request.getMethod());

  27.        ModelMap modelMap = modelAndView.getModelMap();

  28.        modelMap.addAttribute("title","dalaoyang");

  29.    }

  30. }

复制

在启动类继承WebMvcConfigurerAdapter来为项目添加拦截器,代码如下:

  1. package com.dalaoyang;


  2. import com.dalaoyang.interceptor.CommonInterceptor;

  3. import org.springframework.beans.factory.annotation.Autowired;

  4. import org.springframework.boot.SpringApplication;

  5. import org.springframework.boot.autoconfigure.SpringBootApplication;

  6. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;

  7. import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;


  8. @SpringBootApplication

  9. public class SpringbootInterceptorApplication extends WebMvcConfigurerAdapter {


  10.    public static void main(String[] args) {

  11.        SpringApplication.run(SpringbootInterceptorApplication.class, args);

  12.    }


  13.    @Autowired

  14.    CommonInterceptor commonInterceptor;


  15.    // 增加拦截器

  16.    @Override

  17.    public void addInterceptors(InterceptorRegistry registry) {

  18.        registry.addInterceptor(commonInterceptor);

  19.    }

  20. }

复制

IndexController负责跳转,代码如下:

  1. package com.dalaoyang.controller;


  2. import org.springframework.stereotype.Controller;

  3. import org.springframework.ui.Model;

  4. import org.springframework.web.bind.annotation.RequestMapping;


  5. /**

  6. * @author dalaoyang

  7. * @Description

  8. * @project springboot_learn

  9. * @package com.dalaaoyang.controller

  10. * @email yangyang@dalaoyang.cn

  11. * @date 2018/4/27

  12. */


  13. @Controller

  14. public class IndexController {


  15.    @RequestMapping("/")

  16.    public String index(Model model){

  17.        model.addAttribute("content","hi , dalaoyang !");

  18.        return "index";

  19.    }

  20. }

复制

在templates下新建index.html,其中content是controller返回的内容,title是在拦截器中返回的内容,代码如下:

  1. <html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">


  2. <!DOCTYPE html>

  3. <head>

  4.    <meta charset="UTF-8">

  5.    <title th:text="${title}"></title>

  6. </head>

  7. <body>

  8. <p th:text="${content}"></p>

  9. </body>

  10. </html>

复制

启动项目,访问http://localhost:8888/,控制台如下:

在看一下页面:

源码下载 :大老杨码云

个人网站:https://dalaoyang.cn


文章转载自dalaoyang,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论