当前位置: 首页 > news >正文

SpringBoot拦截器

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

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

新建项目,pom文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.dalaoyang</groupId>
    <artifactId>springboot_interceptor</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>springboot_interceptor</name>
    <description>springboot_interceptor</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>net.sourceforge.nekohtml</groupId>
            <artifactId>nekohtml</artifactId>
            <version>1.9.15</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>
复制代码

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

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

package com.dalaoyang.interceptor;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
import org.springframework.ui.ModelMap;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

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

/**
 * @author dalaoyang
 * @Description
 * @project springboot_learn
 * @package com.dalaoyang.interceptor
 * @email yangyang@dalaoyang.cn
 * @date 2018/4/27
 */
@Component
public class CommonInterceptor extends HandlerInterceptorAdapter {
    Logger logger = Logger.getLogger(CommonInterceptor.class);



    //preHandle在业务处理器处理请求之前被调用,
    //postHandle在业务处理器处理请求执行完成后,生成视图之前执行
    //afterCompletion在DispatcherServlet完全处理完请求后被调用
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        logger.info("请求ip:"+request.getRemoteAddr());
        logger.info("请求的方法:"+request.getMethod());
        ModelMap modelMap = modelAndView.getModelMap();
        modelMap.addAttribute("title","dalaoyang");
    }
}
复制代码

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

package com.dalaoyang;

import com.dalaoyang.interceptor.CommonInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@SpringBootApplication
public class SpringbootInterceptorApplication extends WebMvcConfigurerAdapter {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootInterceptorApplication.class, args);
    }

    @Autowired
    CommonInterceptor commonInterceptor;

    // 增加拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(commonInterceptor);
    }
}
复制代码

IndexController负责跳转,代码如下:

package com.dalaoyang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author dalaoyang
 * @Description
 * @project springboot_learn
 * @package com.dalaaoyang.controller
 * @email yangyang@dalaoyang.cn
 * @date 2018/4/27
 */

@Controller
public class IndexController {

    @RequestMapping("/")
    public String index(Model model){
        model.addAttribute("content","hi , dalaoyang !");
        return "index";
    }
}
复制代码

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

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

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title th:text="${title}"></title>
</head>
<body>
<p th:text="${content}"></p>
</body>
</html>
复制代码

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

在看一下页面:

源码下载 :大老杨码云

个人网站:dalaoyang.cn

相关文章:

  • 静态路由的配置
  • HTML 知识弥补
  • 国内互联网可用时间服务器地址(NTP时间服务器地址)
  • 关于隐私数据获取统一说明
  • C++ 中的 unique 函数
  • tornado 04 模板
  • JavaWeb XSS攻击防御
  • 廖雪峰Git教程总结
  • TCP基础知识
  • linux DNS
  • 《Linux学习并不难》Linux网络命令(2):ifconfig命令显示和配置网络接口
  • 如何在Visual Studio 2017中使用C# 7+语法
  • NetCore入门篇:(十一)NetCore项目读取配置文件appsettings.json
  • 三、变量与常量定义
  • Wireshark基本介绍和学习TCP三次握手
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • 03Go 类型总结
  • Javascript编码规范
  • Swift 中的尾递归和蹦床
  • 百度小程序遇到的问题
  • - 概述 - 《设计模式(极简c++版)》
  • 经典排序算法及其 Java 实现
  • 如何实现 font-size 的响应式
  • 新手搭建网站的主要流程
  • 用Python写一份独特的元宵节祝福
  • nb
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (9)目标检测_SSD的原理
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (动态规划)5. 最长回文子串 java解决
  • (二)springcloud实战之config配置中心
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (南京观海微电子)——COF介绍
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (循环依赖问题)学习spring的第九天
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转)平衡树
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET成年了,然后呢?
  • .NET中使用Protobuffer 实现序列化和反序列化
  • .pyc文件是什么?
  • ??myeclipse+tomcat
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • @ModelAttribute使用详解
  • @Transaction注解失效的几种场景(附有示例代码)
  • @Transient注解
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [APIO2015]巴厘岛的雕塑
  • [BZOJ 4129]Haruna’s Breakfast(树上带修改莫队)