Spring Boot 系列4 -- 统一功能处理

这篇具有很好参考价值的文章主要介绍了Spring Boot 系列4 -- 统一功能处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言

1. Spring AOP 用户统⼀登录验证的问题

1.1 自定义拦截器

1.2 配置拦截器并配置拦截的规则

1.3 拦截器的原理源码分析

2. 统一异常处理

2.1 实现统一异常处理

2.2 测试统一异常处理

3. 统一的数据格式返回

3.1 统⼀数据返回格式的实现

3.2 测试统一的数据返回


Spring Boot 系列4 -- 统一功能处理,# SpringBoot,spring boot,java,后端

前言

        Spring AOP是一个面向切面编程的框架,可以同设置要做处理的类为切面,设置切点进行设置拦截规则,然后定义通知,实现一定的拦截规则.但是我们原生的Spring AOP的框架使用起来比较繁琐.为了解决如此之类的Spring AOP的问题.对于Spring AOP的实战,本文将介绍三种功能.

1. 统一用户登录权限验证

2. 统一数据返回格式

3. 统一异常处理

1. Spring AOP 用户统⼀登录验证的问题

假设我们要实现这样一个功能,在多个页面进行判断用户的登录状态,然后发现当前用户的登录状态为空的时候进行跳转到登录页.

        我们之前的做法是,在每个页面的路由中进行判断用户的登录状态,显然这些操作是重复的,后来我们又学习了Spring AOP,我们试想可以将需要进行验证的类进行设置为切面,在需要地方进行配置拦截的规则,然后进行设置前置通知.这个思想是可以的,但是我们实现起来会遇到两个问题.

1.  没办法获取到 HttpSession 对象(我们需要对Session进行判断当前的用户登录状态)

2.  我们要对⼀部分方法进行拦截,而另⼀部分方法不拦截,如注册⽅法和登录方法是不拦截的,这样的话排除⽅法的规则很难定义,甚至没办法定义。

针对一以上的问题,Spring 框架为我们提供了一个具体实现的拦截器:HandlerInterceptor

而我们要使用这个拦截器实现自己的功能,可以具体分为两步:

Spring Boot 系列4 -- 统一功能处理,# SpringBoot,spring boot,java,后端

 下面我们使用代码进行实现上述的功能:

1.1 自定义拦截器

Spring Boot 系列4 -- 统一功能处理,# SpringBoot,spring boot,java,后端

具体代码:

public class LoginInterceptor implements HandlerInterceptor {
    /**
     * 此方法返回一个boolean类型的值,返回true表示验证成功,继续执行后续流程
     */
    //  重写preHandle方法实现自己的业务代码
    @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;
        }
        // 没有登录,可以进行跳转到登录页面,或者返回一个401 或者403 没有权限码
        response.sendRedirect("/login1.html");
//        response.setStatus(403);
        // 上面两者取一个即可
        return false;
    }

}

1.2 配置拦截器并配置拦截的规则

红色部分就是将自定义的拦截器添加到项目中,然后绿色是一个扩展,就是在路由前面加前缀.

Spring Boot 系列4 -- 统一功能处理,# SpringBoot,spring boot,java,后端

 具体代码:

package com.example.demo.config;

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

/**
 * Created with IntelliJ IDEA.
 * Description:将自定义拦截器加入到WebMvcConfigurer中,重写addInterceptors方法进行设置拦截规则
 * User: YAO
 * Date: 2023-07-14
 * Time: 15:04
 */
@Configuration
public class AppConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/**")  // 拦截规则设置,此处进行拦截所有请求
                .excludePathPatterns("/user/login")
                .excludePathPatterns("/user/reg")
                .excludePathPatterns("/user/get-num")
                .excludePathPatterns("/user/get-string")
                .excludePathPatterns("/img/**")
                .excludePathPatterns("/**/*.html");
    }

    // 所有的接⼝添加 api 前缀
      // 给路由进行添加前缀 ,设置为 true 表示启动前缀
//    @Override
//    public void configurePathMatch(PathMatchConfigurer configurer) {
//        configurer.addPathPrefix("api", c -> true);
//    }
}

我们对上述实现的拦截器进行验证

Spring Boot 系列4 -- 统一功能处理,# SpringBoot,spring boot,java,后端

Spring Boot 系列4 -- 统一功能处理,# SpringBoot,spring boot,java,后端 当进行点击的时候,因为没有Session所以直接跳转到我们设置的登录页面了.

Spring Boot 系列4 -- 统一功能处理,# SpringBoot,spring boot,java,后端

可以看出没有进行设置过Cookie的,就是没有Session连接. 

Spring Boot 系列4 -- 统一功能处理,# SpringBoot,spring boot,java,后端

1.3 拦截器的原理源码分析

Spring Boot 系列4 -- 统一功能处理,# SpringBoot,spring boot,java,后端

Spring Boot 系列4 -- 统一功能处理,# SpringBoot,spring boot,java,后端

所有的方法都会执行 DispatcherServlet 中的 doDispatch 调度方法,观察源码发现:

Spring Boot 系列4 -- 统一功能处理,# SpringBoot,spring boot,java,后端  点击这个applyPreHandle,applyPreHandle 中会获取所有拦截器 HandlerInterceptor 并执行拦截器中的 preHandle 方法,这与之前我们实现拦截器的步骤对应.

Spring Boot 系列4 -- 统一功能处理,# SpringBoot,spring boot,java,后端

2. 统一异常处理

        统一异常处理是指 在应用程序中定义一个公共的异常处理机制,用来处理所有的异常情况。 这样可以避免在应用程序中分散地处理异常,降低代码的复杂度和重复度,提高代码的可维护性和可扩展性.\

        统⼀异常处理使⽤的是 @ControllerAdvice + @ExceptionHandler 来实现的,@ControllerAdvice 表示控制器通知类,@ExceptionHandler 是异常处理器,两个结合表示当出现异常的时候执行某个通知,也就是执行某个方法事件.

2.1 实现统一异常处理

Spring Boot 系列4 -- 统一功能处理,# SpringBoot,spring boot,java,后端

2.2 测试统一异常处理

我们自己创建一个路由,其中内容出现一个空指针异常,我们查看是否能进行返回给前端处理. 

Spring Boot 系列4 -- 统一功能处理,# SpringBoot,spring boot,java,后端

Spring Boot 系列4 -- 统一功能处理,# SpringBoot,spring boot,java,后端

我们设置的异常处理起到作用了.那么如果不设置,异常的处理,会出现什么样的现象?

就会直接将控制台打印的异常返回给前端,前端拿到数据就很懵.所以统一的异常处理还是很有必要的.

3. 统一的数据格式返回

Spring Boot 系列4 -- 统一功能处理,# SpringBoot,spring boot,java,后端

3.1 统⼀数据返回格式的实现

下述是我们一般的统一返回的数据的格式

Spring Boot 系列4 -- 统一功能处理,# SpringBoot,spring boot,java,后端

实现统一的数据返回格式可以使用 @ControllerAdvice + ResponseBodyAdvice 的方式实现,具体步骤如下:

  1. 创建一个类,并添加 @ControllerAdvice 注解;
  2. 实现 ResponseBodyAdvice 接口,并重写 supports 和 beforeBodyWrite 方法.

Spring Boot 系列4 -- 统一功能处理,# SpringBoot,spring boot,java,后端 上述部分就是记性统一的数据格式返回.

其中需要注意的是,当返回的类型为String类型的时候,我们需要使用Jackson将String转换成json再进行返回.也就是绿色的部分.

package com.example.demo.config;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import java.util.HashMap;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: YAO
 * Date: 2023-07-14
 * Time: 17:25
 */
@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {

    @Autowired
    private ObjectMapper objectMapper;
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
                                  Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        HashMap<String, Object> result = new HashMap<>();
        result.put("state",1);
        result.put("msg", "");
        result.put("data", body);
        if (body instanceof String){
            // 需要特殊进行处理,因为String比较特殊,既不是基础类型也不是对象,进行重写的时候String用的格式化工具是自己独有的
            // 在body返回之前没有加载好.需要将String进行单独进行处理.使用Jackson将String转换成json再进行返回.
            try {
                return objectMapper.writeValueAsString(result);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        }
        return result;
    }
}

3.2 测试统一的数据返回

Spring Boot 系列4 -- 统一功能处理,# SpringBoot,spring boot,java,后端

Spring Boot 系列4 -- 统一功能处理,# SpringBoot,spring boot,java,后端

可以看出返回的格式是我们规定好的格式.这就变得更加统一.


 好啦本文就总结到这了,点个赞吧,谢谢!!!

Spring Boot 系列4 -- 统一功能处理,# SpringBoot,spring boot,java,后端文章来源地址https://www.toymoban.com/news/detail-625619.html

到了这里,关于Spring Boot 系列4 -- 统一功能处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Spring Boot】拦截器与统一功能处理:统一登录验证、统一异常处理与统一数据返回格式

     Spring AOP是一个基于面向切面编程的框架,用于将横切性关注点(如日志记录、事务管理)与业务逻辑分离,通过代理对象将这些关注点织入到目标对象的方法执行前后、抛出异常或返回结果时等特定位置执行,从而提高程序的可复用性、可维护性和灵活性。但使用原生Sp

    2024年02月16日
    浏览(34)
  • 【Spring Boot统一功能处理】统一异常处理,统一的返回格式,@ControllerAdvice简单分析,即将走进SSM项目的大门! ! !

    前言: 大家好,我是 良辰丫 ,在上一篇文章中我们已经学习了一些统一功能处理的相关知识,今天我们继续深入学习这些知识,主要学习统一异常处理,统一的返回格式,@ControllerAdvice简单分析.💌💌💌 🧑个人主页:良辰针不戳 📖所属专栏:javaEE进阶篇之框架学习 🍎励志语句:生

    2024年02月16日
    浏览(33)
  • Spring Boot 统一功能处理(拦截器实现用户登录权限的统一校验、统一异常返回、统一数据格式返回)

    目录 1. 用户登录权限校验 1.1 最初用户登录权限效验 1.2 Spring AOP 用户统⼀登录验证 1.3 Spring 拦截器 (1)创建自定义拦截器 (2)将自定义拦截器添加到系统配置中,并设置拦截的规则 1.4 练习:登录拦截器 (1)实现 UserController 实体类 (2)返回的登录页面:login.html (3)实

    2024年02月12日
    浏览(34)
  • Spring Boot 优雅实现统一数据返回格式+统一异常处理+统一日志处理

            在我们的项目开发中,我们都会对数据返回格式进行统一的处理,这样可以方便前端人员取数据,当然除了正常流程的数据返回格式需要统一以外,我们也需要对异常的情况进行统一的处理,以及项目必备的日志。         在项目开发中返回的是json格式的数据

    2024年01月19日
    浏览(32)
  • Spring Boot实现统一异常处理的技术解析

    引言 在软件开发过程中,异常处理是非常重要的一环。一个好的异常处理机制可以帮助我们更好地定位问题,提高代码的可维护性和稳定性。Spring Boot作为一款轻量级的Java开发框架,提供了一种简单而高效的方式来实现统一异常处理。本文将详细介绍如何使用Spring Boot实现统

    2024年01月21日
    浏览(29)
  • Spring Boot 统一数据返回格式 分析 和 处理

    目录 实现统一数据格式  测试   原因分析  解决方案 🎥 个人主页:Dikz12 📕格言:吾愚多不敏,而愿加学 欢迎大家👍点赞✍评论⭐收藏 统⼀的数据返回格式使⽤ @ControllerAdvice 和 ResponseBodyAdvice 的⽅式实现; @ControllerAdvice : 表⽰控制器通知类. 比如:添加类 ResponseAdvic

    2024年04月08日
    浏览(40)
  • 【Spring Boot 使用Filter统一处理请求数据转换】

    Spring Boot Filter 使用场景 身份验证和授权 场景描述: 在用户访问应用程序的敏感资源之前,需要验证用户的身份并授权用户访问特定的内容。 实现方式: 使用Filter拦截请求,检查HTTP请求中的身份验证令牌(如JWT),并确定用户是否具有执行操作的权限。 日志记录和审计 场景

    2024年02月21日
    浏览(34)
  • 【Spring】SpringBoot 统一功能处理

    在日常使用 Spring 框架进行开发的时候,对于一些板块来说,可能需要实现一个相同的功能,这个功能可以是验证你的登录信息,也可以是其他的,但是由于各个板块实现这个功能的代码逻辑都是相同的,如果一个板块一个板块进行添加的话,开发效率就会很低,所以 Spring

    2024年01月18日
    浏览(33)
  • 【Redis系列】Spring Boot 集成 Redis 实现缓存功能

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年04月10日
    浏览(40)
  • 【SpringBoot系列】Spring Boot 3核心技术与最佳实践

    强烈推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站: 人工智能 引言 Spring Boot 3 是对 Spring Boot 框架的一个重要更新版本,它延续了 Spring Boot 简化 Spring 应用程序开发的宗旨,进一步提升了开发者体验和应用程

    2024年03月09日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包