SpringBoot Aop进行身份验证

news2024/11/19 0:50:59

忘了好复制🤣

创建一个注解,可以应用于类或者方法上的,进行表示身份认证。

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface VerifyLogin {
}

定义一个没有登录的异常和全局异常处理器,如果没有登录就抛出没有登录异常,让全局异常处理器来处理,重定向到登录页面。

定义异常

public class NotLoginException extends RuntimeException{
    public NotLoginException(String message) {
        super(message);
    }
}

全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(NotLoginException.class)
    public ModelAndView handleUserNotLoggedInException(NotLoginException ex, HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("redirect:/login.html");
        return mav;
    }
}

创建AOP

@Component
@Aspect
public class VerifyLoginAspect {

    private final VerificationIdentity verificationIdentity;

    @Autowired
    public VerifyLoginAspect(VerificationIdentity verificationIdentity) {
        this.verificationIdentity = verificationIdentity;
    }

    @Around(value = "@within(com.example.demo.annotation.VerifyLogin) || @annotation(com.example.demo.annotation.VerifyLogin)")
    public Object verifyLogin(ProceedingJoinPoint joinPoint) throws Throwable {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        try {
            assert attributes != null;
            HttpServletRequest request = attributes.getRequest();
            if (!verificationIdentity.VerificationIfLogin(request)) {
                throw new NotLoginException("User is not logged in.");
            }
        } catch (NotLoginException e) {
            throw e;
        } catch (Exception e) {
            throw new NotLoginException("Error occurred during login verification.");
        }
        return joinPoint.proceed();
    }
}

controller里应用的示例

@RestController
@VerifyLogin
@RequestMapping("/announcement")
public class AddAnnoController {

    @Autowired
    AnnouncementDao announcementDao;

    @GetMapping("/add")
    public String handleFormUpload(@RequestParam("designation") String designation,
                                 @RequestParam("content") String content,
                                 @RequestParam("remark") String remark,
                                 @RequestParam("file") MultipartFile file,
                                 HttpServletRequest request,
                                 HttpServletResponse response) {
        ...
        return "hello world";
    }
}

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

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

相关文章

找样机素材,就上这5个网站,免费下载~

设计师经常需要用到各种样机模型来展示直接的作品,今天我就分享几个可以免费下载样机模型的网站,大家赶紧收藏起来! 菜鸟图库 https://www.sucai999.com/searchlist/3217.html?vNTYxMjky 菜鸟图库有多种类型的设计素材,像平面、…

fiddler过滤器

1、fiddler Fiddler是一个免费、强大、跨平台的HTTP抓包工具。下载地址 2、为什么适用过滤器 不适用过滤器时,所有的报文都会被抓包。 我们在开发或测试时,只需要抓包某个域名下的报文 ,以“www.baidu.com”为例,不设置过滤器&…

数据中台系列2:rabbitMQ 安装使用之 window 篇

RabbitMQ 是一个开源的消息队列系统,是高级消息队列协议(AMQP)的标准实现,用 erlang 语言开发。 因此安装 RabbitMQ 之前要先安装好 erlang。 1、安装 erlang 到 这里 下载本机能运行的最新版 erlang 安装包。如果本机没有装过 …

64核RISC-V服务器能打了吗?

作者:西风烈 最近看到“澎峰科技”的微信公众号,看到他们发布了第一款RISC-V服务器,芯片是算能的SG2042,带64个RISC-V核心(阿里平头哥的C910v核),2.0GHz主频,最大支持128GB内存。这…

【visual studio2019】如何打开即时窗口

在 Visual Studio2019 中打开即时窗口,有两种方法: 1、可以通过“调试”菜单,然后选择“窗口”下的“即时窗口”选项 2、直接使用快捷键“Ctrl Alt I” 此时即时窗口将显示在 Visual Studio2019 的底部。在即时窗口中,可以执…

Mybatis增强框架Mybatis-Flex

一、Mybatis-Flex是什么? Mybatis-Flex 是一个优雅的 Mybatis 增强框架,它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用 Mybaits-Flex 链接任何数据库,其内置的 QueryWrapper^亮点 帮助我们极大的减少了 SQL 编写的工作的同时…

Openlayers实战:绘制多边形,导出CSV文件

CSV(Comma-Separated Values)是一种常用的数据交换格式,是一种纯文本文件格式。在Openlayers的交互中,经常性的我们要导出一些数据,在这个实战中,演示的是导出CSV文件。 安装依赖 npm install file-saver --save npm install papaparse --save 效果图 导出的文件 源代码…

docker安装nginx并配置SSL

1、拉取镜像 docker pull nginx2、启动nginx容器,复制一份默认配置文件出来 // 以nginx镜像为基础镜像创建一个名为nginx01的容器 docker run -d -p 80:80 --name nginx01 nginx创建成功后会看到nginx的欢迎页面 3、挂载nginx目录 拷贝nginx的配置信息到主机目录…

【CAS6.6源码解析】深度解析默认票据存储策略及其拓展支持-探究存储策略的设计

CAS作为一款企业级中央认证服务系统,其票据的生成是非常重要的一环,在票据的生成中,还有一个比较重要的点是票据的存储,本文将默认票据存储策略及其拓展支持,并延伸到探究存储策略的设计。 文章重点分析源码的过程&…

一起学算法(二分查找篇)

1.线性枚举 1.线性枚举定义 线性枚举指的就是遍历某个一维数组(顺序表)的所有元素,找到满足条件的那个元素并且返回,返回值可以是下标,也可以是元素本身。 由于是遍历的,穷举了所有的情况,所以…

iphone卡在恢复模式怎么办?修复办法分享!

iPhone 卡在恢复屏幕问题是 iPhone 用户在软件更新或恢复期间的常见问题。如果你也遇到此问题,不要着急,接下来我们将探讨 iPhone 卡在恢复屏幕上的主要原因,以及如何轻松修复它。 iPhone卡在恢复屏幕问题上没有一个特别的原因,但…

ALLEGRO之Route菜单

本文主要介绍了ALLEGRO的Route菜单。 (1)Connect:走线; (2)Slide:推挤; (3)Timing Vision:等长设计时使用?暂不清楚; &…

【动态规划算法】-子序列问题题型(27-34题)

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

svn还原本地代码

svn代码还原 问题描述:在vscode中修改了代码,没有提交,而且不小心点击了svn更新,导致本地修改的最新代码被覆盖,因为没有提交,所以远程仓库中也没有刚才修改的代码记录 解决: 通过vscode的时间…

远距离传输大型文件:如何应对不同地区的网络环境和带宽约束

在现代社会中,远程传输大文件已经变得非常常见了。无论是个人生活还是各种组织之间的合作和协作,都需要频繁地进行文件传输。但是,由于不同地区的网络状况和带宽限制,传输大文件可能会遇到很多问题。因此,如何应对不同…

PSP - 蛋白质序列搜索算法 MMseqs2 与 HHblits 的搜索结果差异

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/132025401 在 AlphaFold2 中,使用 HHblits 算法搜索 BFD 与 UniRef30,输出 bfd_uniref_hits.a3m 文件。MMseqs2 优化搜索速…

Selenium-用这个框架自动化任何你想做的事情!

Chrome DevTools 简介 Chrome DevTools 是一组直接内置在基于 Chromium 的浏览器(如 Chrome、Opera 和 Microsoft Edge)中的工具,用于帮助开发人员调试和研究网站。 借助 Chrome DevTools,开发人员可以更深入地访问网站&#xf…

职责链模式-请求的链式处理

在实际开发中,对于一个请求我们要经过层层过滤:身份验证 -> 权限验证 -> 实际业务处理。请求沿着一个链在传递,每一层都可以处理该请求。而“职责链模式”就是专门用于处理这种请求链式传递的模式。 1 职责链模式概述 避免将请求发送…

Kubernetes系列

文章目录 1 详解docker,踏入容器大门1.1 引言1.2 初始docker1.3 docker安装1.4 docker 卸载1.5 docker 核心概念和底层原理1.5.1 核心概念1.5.2 docker底层原理 1.6 细说docker镜像1.6.1 镜像的常用命令 1.7 docker 容器1.8 docker 容器数据卷1.8.1 直接命令添加1.8.2 Dockerfi…

2023-07-31 C语言根据错误号打印详细的错误信息perror(““) 或者strerror(errno)

一、C 语言可以使用perror("perror output"); 或 strerror(errno)打印详细的错误信息。 二、需要的头文件#include <errno.h>。 三、实例测试&#xff0c;这里我让open一个linux 底层杂项设备失败的情况&#xff0c;返回的是一个负数&#xff0c;强制返回-EN…