SpringBoot 统⼀功能处理

news2024/11/16 15:40:16

目录

SpringBoot 统一功能处理概念

统一用户登录权限验证

登录功能代码 

Spring拦截器实现步骤:

 统一项目访问前缀

第一种方法:重写configurePathMatch方法进行配置

 第二种方法:在系统的配置文件.properties中进行配置

统一异常处理返回

统一数据格式返回


SpringBoot 统一功能处理概念

SpringBoot 统一功能处理就是AOP思想的实战环节,接下来就开始讲解SpringBoot 统一功能实战处理了。

SpringBoot 统一功能实现主要是实现以下功能:

1、统一用户登录权限验证(使用拦截器实现)

2、统一数据格式返回

3、统一异常处理返回

统一用户登录权限验证

        在原来进行用户登录权限验证时 ,需要在每一个方法体中进行登录方法的验证,代码十分的麻烦。于是就出现了Spring AOP思想,可以进行统一登录权限验证,但是原生Spring AOP实现统一拦截的难点就在于:

1、定义拦截的规则(表达式)非常难;

2、在切面类中拿到HttpSession比较难。

        因此在该背景下于是就出现了Spring拦截器。

登录功能代码 

@RequestMapping("/hi")
@RestController
public class controller {

    @RequestMapping("/getLogin")
    public String Login(){
        System.out.println("执行了login~~");
        return "login~~";
    }

    @RequestMapping("/getUser")
    public String User(){
        System.out.println("执行了user~~");
        return "user~~";
    }

    @RequestMapping("/getReg")
    public String reg(){
        System.out.println("执行了reg~~");
        return "reg~~";
    }

}

Spring拦截器实现步骤:

1、实现HandlerInterceptor接口并且重写preHeadler方法,在方法中编写自己的业务代码

public class LoginInter implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 用户登录效验
        HttpSession session = request .getSession(false);
        if(session != null && session.getAttribute("userInfo") != null){
            // 说明用户已经登录
            return true;
        }
        // 执行到这里说明用户未登录,既可以设置跳转到登录界面进行重新登录
        response.sendRedirect("/login.html");
        return false;
    }
}

2、将拦截器添加到配置文件中,并且设置拦截规则

        1.添加注解:@Configuration

        2.实现WebMvcConfigurer接口并重写addInterceptors方法

        3.使用 addPathPatterns确定哪些需要拦截的方法,excludePathPatterns为不拦截哪些URL(**表示拦截所有的方法)

代码如下

@Configuration
public class config implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInter())
                .addPathPatterns("/**") // 拦截所有请求
                .excludePathPatterns("/hi/getLogin") // 不拦截该请求URL
               .excludePathPatterns("/hi/getReg") // 不拦截该请求URL
                .excludePathPatterns("/**/*.html"); // 不拦截所有的html页面
    }
}

 

 以上代码未拦截URL为 "/hi/getLogin""/hi/getReg""/**/*.html", 而是拦截了URL为"/hi/getUser",并且自动跳转到了登录界面login.html

不加拦截器效果

 加了拦截器,会在调⽤ Controller 之前进⾏相应的业务处理,执⾏的流程如下图

 统一项目访问前缀

第一种方法:重写configurePathMatch方法进行配置

 @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer.addPathPrefix("hello",c->true);
    }

 

 第二种方法:在系统的配置文件.properties中进行配置

# 配置统一访问前缀
server.servlet.context-path=/hello

 配置后如果使用原来的URL就会报404错误,此时需要添加前缀/hello进行访问

 

 

统一异常处理返回

当后端发生异常时,需要返回异常通知到前端,方便前端接收识别到异常并进行处理。因此就需要后端返回统一的异常提交给前端,否则前端会无法识别到后端返回的异常错误

示例:当后端发生空指针异常时

  @RequestMapping("/login")
    public String Login(){
        int a = 100/0;
        System.out.println("执行了login~~");
        return "login~~";
    }

 

此时我们需要返回一个统一的异常格式json给前端

步骤:

1.创建一个类,并在类上标明@ControllerAdvice

2.添加方法@ExceptionHandler来订阅异常

@ControllerAdvice 表示控制器通知类,@ExceptionHandler 是异常处理器,两个结合表示当出现异常的时候执行某个通知,执行某个方法事件
@ControllerAdvice
@ResponseBody
public class ErrorException {
    @ExceptionHandler(Exception.class)
    public HashMap<String,Object> exception(Exception e){
        HashMap<String,Object> result = new HashMap<>();
        result.put("code","-1"); // 状态码
        result.put("emg",e.getMessage());  // 错误码描述信息
        result.put("data",null);
        return result;
    }

}

以上⽅法表示,如果出现了异常就返回给前端⼀个 HashMap 的对象,其中包含的字段如代码中定义的那样。

统一数据格式返回

统一数据格式返回可以更好的方便前端接收和解析后端返回的数据,可以大大加快工作效率

步骤:

1.在类上添加注解:@ControllerAdvice

2.实现接口ResponseBodyAdvice并且必须重写supportsbeforeBodyWrite这两个方法

@ControllerAdvice
public class Advice implements ResponseBodyAdvice {
    /*
     *重写support和beforeBodyRead两个方法
     * */
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;  // 返回true 则执行下面的beforeBodyWrite,否则不执行
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        HashMap<String,Object> map = new HashMap<>(); // 返回数据格式为哈希map格式
        map.put("code",200); // 状态码
        map.put("message","");
        map.put("data",body);
        return map;
    }
}

后端返回给前端数据为数字和字符串形式

controller代码如下:

    @RequestMapping("/num")
    public Integer getNum(){
        return new Random().nextInt(100); // 后端传递100以内的随机数字给前端
    }
    @RequestMapping("/char")
    public String getString(){
        return "hello,world"; //后端传递字符串"hello,world"给前端
    }

后端传递数字给前端,结果正常显示

 后端传递"hello,world"字符串给前端,结果错误显示

原因:HashMap 转换成字符串出现异常,因为字符串是一个特殊的类型,需要借助jakson的转换工具来进行HashMap 转换成字符串

 添加jaskon代码如下:

if(body instanceof String){ // instanceof 为判断数据类型
            try {
                return objectMapper.writeValueAsString(map); // 将HashMap 转换成字符串类型
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        }

 

再次运行项目,此时后端将hello,world字符串就成功传递给前端了

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/676905.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

香橙派4 2. 驱动usb2.0芯片cy7c68013

0. 环境 - 香橙派4&#xff08;Orangepi4_2.1.2_ubuntu_bionic_desktop_linux4.4.179.img&#xff09; - EZ-USB FX2LP CY7C68013A USB 核心板 1. 下载FX3_SDK_1.3.4_linux EZ-USB™ FX3 Software Development Kit https://www.infineon.com/cms/en/design-support/tools/sdk…

Autosar模式管理实战系列08-BswM与EcuM模块交互详解

本文框架 前言EcuM及BswM交互EcuM及BswM交互总览启动时BswM与EcuM的状态管理交接下电时BswM与EcuM的状态管理交接前言 在Autosar模式管理系列介绍01-BswM文章中,我们对BswM基本内容进行了介绍,我们知道了BswM是根据既定的仲裁规则对来自应用层SWCs或其他底层BSW模块,同时也…

InnoDB 和 MyISAM 的区别

1、InnoDB支持事务&#xff0c;MyISAM不支持&#xff1b; 2、InnoDB支持外键&#xff0c;MyISAM不支持&#xff1b; 3、InnoDB是簇索引&#xff0c;MyISAM是非簇索引&#xff1b; 4、Innodb不支持fulltext全文索引&#xff0c;MyISAM支持&#xff1b; 5、InnoDB支持到行级锁&am…

JavaSE基础语法--数组的拷贝

数组的拷贝方法有好几种&#xff0c;第一种是简单的for循环。通过遍历原数组来给新数组赋值完成数组的拷贝代码如下&#xff1a; import java.util.Arrays;public class TestDemo {public static void main(String[] args) {int[] arr1{1,2,3,4,5,6};int[] arr2new int[arr1.l…

MySQL高级SQL语句操作之存储过程

MySQL高级SQL语句操作之存储过程 一、存储过程介绍二、存储过程操作1、创建存储过程2、调用存储过程3、查看存储过程4、存储过程的参数5、删除存储过程6、存储过程的控制语句6.1 条件语句6.2 循环语句 一、存储过程介绍 存储过程是一组为了完成特殊功能的SQL语句集合存储过程在…

Tik Tok 如何提高账户的活跃度和吸引力?

Tik Tok 是一款非常受欢迎的应用程序&#xff0c;它在全球范围内拥有大量的用户和创作者。Tik Tok 在人工智能技术方面投入了大量的资源&#xff0c;并且正在不断改进和扩展其人工智能技术。Tik Tok 正在不断扩展其业务&#xff0c;例如在音乐、视频制作等方面扩展。这表明 Tik…

如何提升虚拟机性能?除了绑核还有它可以!

第一章 大页内存与小页内存 1.1 小页内存 在Linux系统中&#xff0c;默认情况下&#xff0c;内存管理器将物理内存划分为小页(4KB)或大页(2MB或1GB)的大小。Linux内核会根据需要分配和释放内存&#xff0c;以确保系统的稳定性和性能。 在默认情况下&#xff0c;Linux系统会使用…

在spring事务中扩展业务操作;spring事务同步器TransactionSynchronizationManager

概述 业务上经常会有一些需求是需要在某个数据库操作事务提交之后再去操作。 我常用的就方式有TransactionalEventListener和TransactionSynchronizationManager. 其实TransactionalEventListener背后使用的也是TransactionSynchronizationManager。 注意点&#xff1a;在a…

爬虫(Requests库get和post应用)

Requests库 介绍 Requests是Python中用于进行HTTPS请求的库。它提供了一种简单直观的API&#xff0c;用于发送HTTP&#xff0c;HTTPS请求和处理响应。 request.get()函数 参数 url&#xff0c;一般放置需要请求的URL headers&#xff0c;一般用于User-agent&#xff08;UA…

制定CRM战略流程是哪些?

CRM战略是企业为了提升核心竞争力&#xff0c;在市场、销售、客户管理等方面开展的一系列改善、创新或转型的措施。目的是建立和维护与客户的关系&#xff0c;增加企业的收入。那么&#xff0c;企业如何制定CRM战略呢&#xff1f; 1、深入了解客户需求 企业需要了解其目标客户…

【算法总结】——子集型回溯

文章目录 子集型回溯例题1——78.子集代码模板1代码模板2 例题2——131.分割回文串代码模板1代码模板2补充&#xff1a;怎么判断回文串双指针dp提前处理 参考资料 子集型回溯 主要学习 分别从 输入 和 答案 去思考的两种代码模板。 例题1——78.子集 例题&#xff1a;78. 子集…

JavaSE基础语法--数组(1)

数组的定义与使用 数组就是存储相同数据类型的一组数据。它有如下特点&#xff1a; 1.数组中存放的数据是一样的 2.数组的空间是连续的 3.每个空间有自己的编号&#xff0c;其实位置的编号为0&#xff0c;即数组的下标 那么在Java里面如何定义一个数组呢&#xff1f; 假设…

【Python入门】Python循环语句(for循环的嵌套应用)

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于Python零基础入门系列&#xff0c;本专栏主要内容为Python基础语法、判断、循环语句、函…

行为型模式--中介者模式

目录 概述 结构 案例实现 优缺点 优点&#xff1a; 缺点&#xff1a; 使用场景 概述 一般来说&#xff0c;同事类之间的关系是比较复杂的&#xff0c;多个同事类之间互相关联时&#xff0c;他们之间的关系会呈现为复 杂的网状结构&#xff0c;这是一种过度耦合的架构&a…

深入理解深度学习——BERT派生模型:跨语言模型XLM(Cross-lingual Language Model)

分类目录&#xff1a;《深入理解深度学习》总目录 BERT本应在语义理解上具有绝对优势&#xff0c;但其训练语料均为英语单语&#xff0c;受限于此&#xff0c;早期的BERT只在英语文本理解上有优势。随着全球化进程的加速&#xff0c;跨语言的预训练语言模型也具有非常重要的应用…

seldom之数据驱动

seldom之数据驱动 如果自动化某个功能&#xff0c;测试数据不一样而操作步骤是一样的&#xff0c;那么就可以使用参数化来节省测试代码。 seldom是我在维护一个Web UI自动化测试框&#xff0c;这里跟大家分享seldom参数化的实现。 GitHub&#xff1a;GitHub - SeldomQA/seld…

idea设置项目编码为utf8

设置当前项目的编码为utf8 File -> Settings -> Editor -> File Encoding&#xff1a; 设置新建项目的编码为utf8 File -> New Projects Setup -> Settings for New Projects&#xff1a;

Flutter系列(九)ListView实现新闻列表和正文布局

基础工程&#xff1a; Flutter系列&#xff08;四&#xff09;底部导航顶部导航图文列表完整代码_摸金青年v的博客-CSDN博客 相关文章: Flutter系列&#xff08;七&#xff09;ListView 图文列表详解_flutter 图文列表_摸金青年v的博客-CSDN博客 一、前言 本文用flutter实现新闻…

注册 Google 邮箱(最新:保姆级教程)

文章目录 1、我们使用浏览器打开谷歌邮箱官网&#xff08;gmail.google.com&#xff09;&#xff0c;进入谷歌邮箱的登录主页&#xff0c;我们点击左下方的创建账号按钮&#xff0c;选择个人用途 2、在进入的界面我们不要着急填写资料&#xff0c;我们先修改语言&#xff0c;点…

(2023,3D 场景生成器 Infinigen)使用程序化生成的无限逼真世界

Infinite PhotorealisticWorlds using Procedural Generation 公众号&#xff1a;EDPJ 目录 0. 摘要 1. 简介 2. 相关工作 3. 方法 4. 实验 参考 S. 总结 S.1 主要思想 S.2 方法 S.3 场景生成 0. 摘要 我们介绍 Infinigen&#xff0c;一个自然世界逼真 3D 场景的…