【个人博客系统网站】统一处理 · 拦截器

news2024/11/27 14:30:45

【JavaEE】进阶 · 个人博客系统(2)

在这里插入图片描述

文章目录

  • 【JavaEE】进阶 · 个人博客系统(2)
    • 1. 统一返回格式处理
      • 1.1 统一返回类common.CommonResult
      • 1.2 统一返回处理器component.ResponseAdvice
    • 2. 统一异常处理
    • 3. 拦截器实现
      • 3.1 全局变量SESSION_KEY
      • 3.2 session工具类SessionUtils
      • 3.3 拦截器 UserInterceptor
      • 3.4 配置类 AppConfig

【JavaEE】进阶 · 个人博客系统(2)

【JavaEE】Spring全家桶实现AOP-统一处理_s:103的博客-CSDN博客

为了让代码更加低耦合,高内聚,符合单一设计原则,所以进行一些统一处理!

1. 统一返回格式处理

1.1 统一返回类common.CommonResult

@Data
public class CommonResult {
    private int code; //状态码
    private String msg;  //状态码描述信息
    private Object data; //返回数据


    public static CommonResult success(Object data) {
        CommonResult result = new CommonResult();
        result.setCode(200);
        result.setMsg("成功");
        result.setData(data);
        return result;
    }
    public static CommonResult success(Object data, String msg) {
        CommonResult result = new CommonResult();
        result.setCode(200);
        result.setMsg(msg);
        result.setData(data);
        return result;
    }

    public static CommonResult fail(int code, String msg) {
        CommonResult result = new CommonResult();
        result.setCode(code);
        result.setMsg(msg);
        return result;
    }
    public static CommonResult fail(int code, String msg, Object data) {
        CommonResult result = new CommonResult();
        result.setCode(code);
        result.setMsg(msg);
        result.setData(data);
        return result;
    }

}

1.2 统一返回处理器component.ResponseAdvice

@ControllerAdvice
@ResponseBody
public class ResponseAdvice implements ResponseBodyAdvice {

    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;//我要重写~
    }

    @Autowired
    private ObjectMapper objectMapper;//Spring中自带了个 Bean是 ObjectMapper,所以可以注入

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType,
                                  MediaType selectedContentType, Class selectedConverterType,
                                  ServerHttpRequest request, ServerHttpResponse response) {

        if(body instanceof Result) {//body 有 Result对象向上转型而来(已经包装好了的)~
            return body;
        }
        if(body instanceof String) {
            try {
                return objectMapper.writeValueAsString(Result.success(body));
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        }
        return Result.success(body);
    }
}

当然,统一返回处理,一般针对的是(百密一疏的缺漏情况),controller里的接口mapping中,没有使用CommonResult类的包装方法的mapping,即默认的一个返回处理,而 平常我们写的时候,都是自己调用CommonResult类的包装方法 ~

  • String类型进行统一返回,响应的类型还是text/html,所以前端得手动将json字符串转化为json对象,jQuery.parseJSON()
  • 如果手动调用了CommonResult类的包装方法,则没有这个问题,因为接口方法的返回值是非String类型,默认是json

2. 统一异常处理

@RestControllerAdvice
public class ExceptionAdvice {
    @ExceptionHandler(Exception.class)
    public Object exceptionAdvice(Exception e) {
        return CommonResult.fail(-1, e.getMessage());
    }
}

在这里插入图片描述

3. 拦截器实现

3.1 全局变量SESSION_KEY

在这里插入图片描述

3.2 session工具类SessionUtils

通过这个工具类,我们可以调用一个方法去获取当前登录用户:

public class SessionUtils {
    /**
     * 得到当前登录用户
     * @param request
     * @return
     */
    public static UserInfo getUser(HttpServletRequest request) {
        HttpSession session = request.getSession(false);
        return session == null ? null : (UserInfo) session.getAttribute(ApplicationVariable.SESSION_KEY);
    }
}

3.3 拦截器 UserInterceptor

@Component
public class UserInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("执行了拦截器!");
        //业务逻辑
        if (SessionUtils.getUser(request) != null) {
            return true;//用户登录
        }
        response.sendRedirect("blog_login.html");
        return false;
    }
}

3.4 配置类 AppConfig

@Configuration//不是Configurable!
public class AppConfig implements WebMvcConfigurer {
    
    @Autowired
    private UserInterceptor userInterceptor;
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(userInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/blog_login.html")
                .excludePathPatterns("blog_detail.html")
                .excludePathPatterns("blog_register.html")
                .excludePathPatterns("blog_lists.html")
                .excludePathPatterns("/css/**")
                .excludePathPatterns("/editor.md")
                .excludePathPatterns("/img/**")
                .excludePathPatterns("/js/**")
                .excludePathPatterns("/sql/**");
    }
}

随着功能的实现,根据业务逻辑,判断其是否要进行排除!目前仅仅将一些静态资源排除~

在这里插入图片描述


文章到此结束!谢谢观看
可以叫我 小马,我可能写的不好或者有错误,但是一起加油鸭🦆

代码:myblog_system · 游离态/马拉圈2023年9月 - 码云 - 开源中国 (gitee.com)


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

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

相关文章

Mariadb高可用(四十)

目录 一、概述 (一)概念 (二)组成 (三)特点 (四)工作原理 二、实验要求 三、构建MHA (一)ssh免密登录 (二)安装mariadb数据库…

数学建模--一维插值法的多种插值方式的Python实现

目录 1.算法流程步骤 2.算法核心代码 3.算法效果展示 1.算法流程步骤 #算法的核心就是利用scipy中的interpolate来完成工作 #一共是5种一维插值算法形式: #插值方法:1.阶梯插值 2.线性插值 3.2阶样条插值 4.3阶样条插值 #"nearest"阶梯插值 #"zero&…

硬盘数据恢复的基础操作方法分享

确定硬盘故障类型:在进行硬盘数据恢复之前,首先需要确定故障类型是硬件故障还是软件故障。如果是软件故障,可以尝试使用数据恢复软件进行恢复;如果是硬件故障,则需要求助专业数据恢复公司进行处理。 使用数据恢复软件…

JavaScript基础05——字面量、变量介绍及变量基本使用

哈喽,大家好,我是雷工! 说起变量感觉很熟悉,但要让解释什么是变量时,却有点语塞,就像解释下为啥112一样,感觉非常熟悉,就是知道,但确解释不出来。 不过虽然在其他场景比较…

机器学习——线性回归/岭回归

0、前言: 线性回归会用到python第三方库:sklearn.linear_model中的LinearRegression导入第三方库的方法:from sklearn.linear_model import LinearRegression使用LinearRegression(二维数据,一维数据)进行预测,其中数…

MySQL中的索引事务(2)事务----》数据库运行的原理知识+面试题~

本篇文章建议读者结合:MySQL中的索引事务(1)索引----》数据库运行的原理知识面试题~_念君思宁的博客-CSDN博客此时,如果你根据name来查询,查到叶子节点得到的只是主键id,还需要通过主键id去主键的B树里面在…

源码角度看待线程池的执行流程

文章目录 前言一、线程池的相关接口和实现类1.Executor接口2.ExecutorService接口3.AbstractExecutorService接口4.ThreadPoolExecutor 实现类 二、ThreadPoolExecutor源码解析1.Worker内部类2.execute()方法3.addWorker()方法 总结 前言 线程池内部维护了若干个线程&#xff…

RT-Thread 内核移植

内核移植 内核移植就是将RTT内核在不同的芯片架构、不同的板卡上运行起来,能够具备线程管理和调度,内存管理,线程间同步等功能。 移植可分为CPU架构移植和BSP(Board support package,板级支持包)移植两部…

1783_CMD启动MATLAB同时执行一个脚本

全部学习汇总: GitHub - GreyZhang/g_matlab: MATLAB once used to be my daily tool. After many years when I go back and read my old learning notes I felt maybe I still need it in the future. So, start this repo to keep some of my old learning notes…

【数据结构】树和二叉树的概念及结构(一)

目录 一,树的概念及结构 1,树的定义 2,树结点的分类及关系 3,树的表示 二,二叉树的概念及结构 1,二叉树的定义 2,特殊的二叉树 3,二叉树的性质 4,二叉树的存储结构 1&…

Unity中Shader 纹理属性 Tilling(缩放度) 和 Offset(偏移度)

文章目录 前言一、Tilling(缩放度),个人理解有点像减小周期函数的周期的效果(在单位空间内,容得下重复的函数图像的多少)二、Offset(偏移度),个人理解是函数的平移三、在Shader中使用 Tilling 和…

如何批量查询所有德邦快递的物流信息

当我们需要查询多个德邦快递的物流信息时,我们可以使用固乔快递查询助手来批量查询。以下是具体的操作步骤: 1. 在浏览器中搜索并下载【固乔快递查询助手】软件。这款软件支持多种快递公司,包括德邦快递,而且可以批量查询物流信息…

洞发现-APP应用之漏洞探针利用修复(44)

主要分为三个部分,第一部分抓包是很重要的,第二部分是协议,第三部分是逆向(讲的不会太多,介绍根据使用不介绍原理), 关于反编译,app就分为安卓和苹果系统,苹果系统的源码…

基于STM32的简易示波器设计

疫情期间闲来无事,正好学习STM32F407,因此设计、制作了简易示波器,以助学习。长话短说方案如下: (1)单片机,选择STM32F407VET6,采用SWD方式仿真及程序烧写。五路独立按键和两个LED指…

[国产MCU]-W801开发实例-用户报文协议(UDP)数据接收和发送

用户报文协议(UDP)数据接收和发送 文章目录 用户报文协议(UDP)数据接收和发送1、UDP简单介绍2、W801的UDP创建逻辑2.1 UDP使用步骤2.2 代码实现1、UDP简单介绍 用户数据报协议 (UDP) 是一种跨互联网使用的通信协议,用于对时间敏感的传输,例如视频播放或 DNS查找。它通过在数…

OTFS-ISAC通信最新进展

测试场景 Tx DD域帧结构导频区域 Rx DD域帧导频区域 原始星座图 信道估计及数据检测 经过MP算法后的星座图 误码率曲线

串行协议——USB驱动[基础]

多年前的学习记录,整理整理。 一、USB协议基础 二、Linux内核USB驱动源码分析 USB中不同类型设备使用的 设备描述符(设备类\设备子类\设备协议) 配置不同,典型的以下几种:1)HID设备: Human Input Device人工输入设备, 如鼠标\键盘\游戏手柄等.2)CDC设备: Communi…

GB28181学习(二)——注册与注销

概念 使用REGISTER方法进行注册和注销;注册和注销应进行认证,认证方式应支持数字摘要认证方式,高安全级别的宜支持数字证书认证;注册成后,SIP代理在注册过期时间到来之前,应向注册服务器进行刷新注册&…

core dump管理在linux中的前世今生

目录 一、什么是core dump? 二、coredump是怎么来的? 三、怎么限制coredump文件的产生? ulimit 半永久限制 永久限制 四、从源码分析如何对coredump文件的名字和路径管理 命名 管理 一些问题的答案 1、为什么新的ubuntu不能产生c…

ApplicationRunner、InitializingBean、@PostConstruct 执行顺序

概述 开发中可能会有这样的场景,需要在容器启动的时候执行一些内容。比如读取配置文件,数据库连接之类的。SpringBoot给我们提供了两个接口来帮助我们实现这种需求。两个启动加载接口分别是:CommandLineRunner和ApplicationRunner。Spring 提…