利用AOP实现统一功能处理

news2024/11/25 12:32:03

目录

一、实现用户登录校验

实现自定义拦截器 

将自定义的拦截器添加到框架的配置中,并且设置拦截的规则 

二、实现统一异常处理 

三、实现统一数据格式封装


一、实现用户登录校验

在之前的项目中,在需要验证用户登录的部分,每次都需要利用Session会话信息来进行判断用户是否处于登录状态,那么利用AOP思想可以进行统一处理,首先想到的是利用Spring AOP来进行实现,但是获取Session信息时需要HttpSession会话以及Request对象,这点StringAOP的五大通知都无法实现,并且在实际项目中并不是指定包或者指定类要进行拦截,适用AspectJ表达式就无法满足需求了,因此,就需要Spring拦截器来实现用户的登录的校验。

使用Spring拦截器的步骤:

  1. 实现自定义拦截器,实现Spring中的HandlerInterceptor接口中的preHandler方法。
  2. 将自定义的拦截器添加到框架的配置中,并且设置拦截的规则。

实现自定义拦截器 

重写HandlerInterceptor接口中的preHandler方法,先获取到session对象,判断对象是否为空来判断登录状态,若未登录则自动跳转到登录页面。

@Component
public class LoginIntercept implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //先得到session对象,传入参数为false,表示Session为空时不会自动创建,传入参数为true则反之。
        HttpSession session = request.getSession(false);
        if(session != null && session.getAttribute("user") != null){
            //表示登录成功
            return true;
        }
        //表示未登录,则请求重定向到登录页面
        response.sendRedirect("/login.html");
        return false;
    }
}

将自定义的拦截器添加到框架的配置中,并且设置拦截的规则 

将自定义的拦截器添加到框架的配置中,设置所有页面都要判断登录状态,除了一些指定页面。 

@Configuration
public class AppConfig implements WebMvcConfigurer {
    @Resource
    private LoginIntercept loginIntercept;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginIntercept)
                .addPathPatterns("/**")
                .excludePathPatterns("/user/reg")
                .excludePathPatterns("/user/login")
                .excludePathPatterns("/**/*.css")
                .excludePathPatterns("/**/*.js")
                .excludePathPatterns("/**/*.jpg")
                .excludePathPatterns("/**/*.png");

    }
}

userController类的内容如下:

RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/login")
    public boolean login(HttpServletRequest request, String userName, String password){
        if(StringUtils.hasLength(userName) && StringUtils.hasLength(password)){
            if(userName.equals("zhangsan") && password.equals("1234")){
                HttpSession session = request.getSession();
                session.setAttribute("user","user");
                return true;
            }
        }
        return false;
    }
    @RequestMapping("/test")
    public boolean test(){
        return true;
    }
}

 那么访问test页面时就会出现:

此时就会进行拦截,并且重定向到登录页面。

二、实现统一异常处理 

 统一异常处理使用的是@ControllerAdvice注解,在方法前使用@ExceptionHandler注解,其中的参数为捕捉的异常类.class。

@RestControllerAdvice //表示当前处理异常的页面返回的是数据
public class MyExceptionAdvice {
    @ExceptionHandler(NullPointerException.class)
    public HashMap<String,Object> nullPointException(NullPointerException e){
        HashMap<String,Object> res = new HashMap<>();
        res.put("data",-1);
        res.put("state",-1);
        res.put("msg",e.getMessage());
        return res;
    }
}

那么访问一个空指针异常的页面:

    @RequestMapping("/test")
    public boolean test(){
       Object test = null;
       test.toString();
       return true;
    }

进行访问:

 

 但是我们不可能将所有的异常都列举出来,就可以定义一个方法处理所有的异常。 

@ExceptionHandler(Exception.class)
    public HashMap<String,Object> allException(Exception e){
        HashMap<String,Object> res = new HashMap<>();
        res.put("data",-1);
        res.put("state",-1);
        res.put("msg",e.getMessage());
        return res;
    }

三、实现统一数据格式封装

对数据进行统一的格式封装,给当前类添加@Controller注解,实现ResponseBodyAdvice接口,并重写其方法。

@RestControllerAdvice
public class MyResponseAdvice implements ResponseBodyAdvice {
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
        //返回true则表示对之前的数据进行重写,才会调用下面的beforeBodyWrite方法,若传入false则反之。
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
       //此处也可以设置为别的格式
        HashMap<String,Object> res = new HashMap<>();
        res.put("data",body);
        res.put("state",1);
        res.put("msg","");
        return res;
    }
}

UserController类的test方法如下: 

@RequestMapping("/test")
    public String test(){
       return "hello";
    }

访问test:

 也可以设置为别的数据格式:

@Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
       //此处也可以设置为别的格式
        return body;
    }

再次访问:

 

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

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

相关文章

RK3568平台开发系列讲解(环境篇)使用USB线缆升级固件

🚀返回专栏总目录 文章目录 一、进入升级模式1.1、硬件方式进入Loader模式1.2、软件方式进入Loader模式二、安装烧写工具2.1、Windows操作系统2.2、Linux操作系统沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍了如何将主机上的固件,通过USB数据线烧录到…

Typora(Mckbook版)的使用方法

1、标题&#xff08;⌘ 数字&#xff09; 一级标题&#xff1a;&#xff08;⌘ 1&#xff09; 二级标题&#xff1a;&#xff08;⌘ 2&#xff09; 三级标题&#xff1a;&#xff08;⌘ 3&#xff09; 四级标题&#xff1a;&#xff08;⌘ 4&#xff09; ... 六级标…

0303github搜索案例-react应用

文章目录1 前言2 静态组件2.1 静态页面和样式2.2 静态组件3 axios请求github接口4 优化案例结语1 前言 学习了脚手架配置axios&#xff0c;我们通过访问github的接口来做个练习。实例效果如下所示&#xff1a; 搜索框输入github用户名关键字&#xff0c;点击搜索&#xff0c;列…

AD633JRZ-ASEMI代理ADI亚德诺AD633JRZ车规级芯片

编辑-Z AD633JRZ芯片参数&#xff1a; 型号&#xff1a;AD633JRZ 总误差&#xff1a;1% 标度电压错误&#xff1a;0.25% 电源干扰&#xff1a;0.01% 输出偏移电压&#xff1a;5mV 小信号带宽&#xff1a;1MHz 斜率&#xff1a;20V/s 沉降时间达到1%&#xff1a;2s 宽…

在 Rocky linux 8.7 使用 Kubespray v2.21.0 离线部署 kubernetes v1.24.0 集群

文章目录前言创建7台虚拟机要求配置代理下载介质介质初始化安装工具包配置互信编写 inventory.ini创建 offline.ymlt他、部署 offline repo部署 kubespray报错2报错3报错报错&#xff1a;container-engine/containerd : containerd &#xff5c; Create registry directories分…

5.Dockerfile

1.什么是Dockerfile Dockerfile其实就是一个文本文件&#xff0c;由一系列命令和参数构成&#xff0c;Docker可以读取Dockerfile文件并根据Dockerfile文件的描述来构建镜像。 1、对于开发人员&#xff1a;可以为开发团队提供一个完全一致的开发环境&#xff1b; 2、对于测试人…

Servlet API

目录 1.HttpServlet 1.doGet 2.doPost 2.HttpServletRequest 2.1方法 2.2打印请求信息 2.3获取GET请求的参数 2.4post请求body格式 1.x-www-form-urlencoded 2.json 3.HttpServletResponse 3.1方法 3.2设置状态码 3.3自动刷新 3.4构造重定向的响应 1.HttpServlet 方法…

VMware Workstation Pro17安装并导入旧虚拟机系统

VMware Workstation Pro17 VMware是一个虚拟机软件&#xff0c;可以用来虚拟化各种系统&#xff0c;便于进行开发和其他相关工作 VMware Workstation Pro17支持window11版本&#xff0c;如果vm版本太低了升级window的时候会提示卸载旧版本的 下载VMware Workstation Pro17 h…

网格贪心搜索逼近最优组合解

如有错误&#xff0c;感谢不吝赐教、交流 文章目录背景描述实现方法一、寻找两组合的最优二、基于两组合的最优结果寻找四组合最优三、基于四组合的最优结果寻找八组合最优四、基于八组合的最优结果寻找十六组合最优总结适用场景背景描述 假如list [0, 1, 2, 3, 4, 5, 6, 7, …

2023年第三届智能机器人与系统国际会议(ISoIRS 2023) | IEEE-CPS独立出版

2023年第三届智能机器人与系统国际会议(ISoIRS 2023) | IEEE-CPS独立出版 会议简介 Brief Introduction 2023年第三届智能机器人与系统国际会议(ISoIRS 2023) 会议时间&#xff1a;2023年5月26日-28日 召开地点&#xff1a;中国长沙 大会官网&#xff1a;www.isoirs.org ISoIRS…

软件测试别再被“薪资陷阱”困扰了,这份攻略带你轻松查薪资

大家好&#xff0c;我是锦都不二。 测试岗面试 当HR问你期望薪资是多少时&#xff0c; 如果你回答: 10K 恭喜&#xff0c;你已经被HR成功套路&#xff0c; 拿到offer时你会在心里这么嘀咕&#xff1a;我要是当时报价15k该多好。 所以如何知道自己在这个市场上的价值&#xff0c…

95-拥塞控制

拥塞控制1.什么是拥塞控制2.拥塞控制的方法(1)慢启动和拥塞避免(2)快速重传和快速恢复1.什么是拥塞控制 在计算机网络中的链路容量&#xff08;即带宽&#xff09;、交换结点中的缓存和处理机等&#xff0c;都是网络的资源。在某段时间&#xff0c;若对网络中某一资源的需求超…

excel在文本的固定位置插入字符、进行日期和时间的合并

1.excel在文本的固定位置插入字符 如上图&#xff0c;现在想要将其转化为日期格式&#xff08;比如2017/1/1&#xff09;&#xff0c;但是当设置单元格格式为日期时却显示出很多&#xff03;。我们可以通过在20170101中添加两个斜杠“/”来将其转化为2017/1/1。可以用replace函…

基于SSM的二手车交易平台小程序

选题背景 互联网是人类的基本需求&#xff0c;特别是在现代社会&#xff0c;个人压力增大&#xff0c;社会运作节奏高&#xff0c;随着互联网的快速发展&#xff0c;用户的需求也越来越高&#xff0c;用户也将越来越多依靠互联网而不是自己获取信息&#xff0c;使得各种软件程…

【逗老师的无线电】BM的AirSecurity功能使用以防止他人使用你的DMRID

众所周知&#xff0c;在使用DMR热点和中继的时候&#xff0c;如果别人的手台上配置了你的ID进行恶意呼叫&#xff0c;或者伪装你的身份进行通联&#xff0c;之前是没有办法防范的。 目前&#xff0c;BM更新了AirSecurity功能&#xff0c;通过在呼叫前预先单呼一个作为密码的号码…

计算机组成原理——第二章数据的表示和运算(上)

提示&#xff1a;日出有盼&#xff0c;落日有念&#xff0c;心有所期&#xff0c;忙而不茫 文章目录前言2.1.1 进位计数制2.1.2 BCD码2.1.3 无符号整数的表示和运算2.1.4 带符号整数的表示和运算(原反补)2.1.5原反补码的特性对比2.1.6 移码2.1.7 定点小数前言 这里主要是根据王…

vue3 history模式配置及nginx服务器配置

vue的路由方式有hash模式和history模式&#xff0c;history模式路由看起来有好些&#xff0c;路由路径里没有#号&#xff0c;而hash模式默认是有#号的。 vue3开始默认新建的项目都是history模式&#xff0c;不过history模式打包后想要使用正常访问的话&#xff0c;需要后端服务…

BIO/NIO/Netty网络通信编程

文章目录1 BIO (BLOCK IO)2. NIO (new IO)2.1 NIO-Buffer缓冲区2.2 NIO-Buffer分散读-集中写2.3 NIO-Buffer粘包半包2.4 NIO-Channel2.4.1 files相关操作2.4.2 channel网络通信2.4.3 处理消息边界2.4.4 buffer大小分配2.4.5 处理大量写事件2.5 selector-Epoll2.6 IO模型2.7 零拷…

懒人必备!Python代码帮你自动发送会议纪要,让你有更多时间做更重要的事情

目录 痛点&#xff1a; 应用场景&#xff1a; 源代码&#xff1a; 代码说明&#xff1a; 效果如下所示&#xff1a; 痛点&#xff1a; 在传统的工作中&#xff0c;发送会议纪要是一个比较繁琐的任务&#xff0c;需要手动输入邮件内容、收件人、抄送人等信息&#xff0c;每…

代码随想录算法训练营第五十六天 | 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结

583. 两个字符串的删除操作 动规五部曲 1、确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j]&#xff1a;以i-1为结尾的字符串word1&#xff0c;和以j-1位结尾的字符串word2&#xff0c;想要达到相等&#xff0c;所需要删除元素的最少次数。 2、确定递推…