SpringBoot——统一功能处理

news2024/10/2 12:35:16

处理登陆拦截

上一片博客中讲到SpringAOP可以对页面进行拦截,我们可以用SpringAOP实现对登陆的拦截

但是由于拦截需要HttpSession对象,并且之后还需要页面重定向,因此在实际应用中,并不用SpringAOP进行登陆拦截,而是采用下面这种方法

  1. 定义一个拦截器,实现HandlerInterceptor接口
  2. 重写preHandler方法
  3. 配置文件中添加拦截器,定义拦截规则

其中的preHandler方法中有request对象,我们可以利用它获得session对象,就可以实现判断用户是否登陆,页面重定向等功能了

public class 自定义拦截器名称 implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
       	if(判断符合规则){
       		return true;
		}	
		return false;
    }
}

例如定义登陆拦截器:

public class LoginInterceptor implements HandlerInterceptor {
    /**
     * @param request
     * @param response
     * @param handler
     * @return 返回true说明登陆成功,否则登陆失败
     * @throws Exception
     */
    @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;
    }
}

自定义一个配置文件,继承WebMvcConfigurer接口,重写addInterceptor方法

@Configuration
public class 配置文件名 implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new 自定义拦截器)
                .addPathPatterns("添加拦截的请求")
              	.excludePathPatterns("添加不拦截的请求")
    }
}

例如:添加刚才的登陆拦截器

@Configuration
public class Appconfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/**")//拦截所有请求
                .excludePathPatterns("/user/login")//不拦截的url地址
                .excludePathPatterns("/user/reg")
                .excludePathPatterns("/**/*.html")//不拦截的静态资源
                .excludePathPatterns("/**/*.js")
                .excludePathPatterns("/**/*.css");
    }
}

代码中把登陆请求,注册请求和登陆html文件请求排除出去,其他的请求都进行拦截,想要对其进行验证,先实现对应代码

@RestController
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/getuser")
    public String getUser(){
        System.out.println("执行getuser");
        return "执行getuser";
    }

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

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

当我们访问/getuser方法时
在这里插入图片描述
页面会自动跳转到login.html
在这里插入图片描述
而访问login方法时不会跳转
在这里插入图片描述

统一添加前缀

不仅可以在配置文件中添加拦截器,还可以对所有请求的url中都添加前缀
重写configurePathMatch方法:

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

例如我们将所有url都加上/prefix前缀

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

再次访问login界面,就不会找到该界面了
在这里插入图片描述
需要添加/prefix前缀才能访问
在这里插入图片描述
除了这种添加统一前缀的方法,还可以在properies中配置

server.servlet.context-path=/prefix

统一异常封装

如果项目中有异常,页面就会出现5XX页面,这时用户会非常懵逼
在这里插入图片描述
因此,如果项目中有异常,也需要统一封装成固定格式,返回给前端,让前端编写好看的页面,让用户知道问题所在

对于异常封装有下面的步骤:

  1. 创建一个类
  2. 类上添加@ControllerAdvice注解
  3. 添加异常处理方法
  4. 方法上用@ExceptionHandler注解,订阅异常
@ControllerAdvice
public class 异常处理类名称 {
    @ExceptionHandler(异常.class)
    @ResponseBody
    public 返回格式 自定义名称(异常对应类 e){
        return 返回信息
    }
}

例如:

import java.util.HashMap;

@ControllerAdvice
public class MyExceptionHandler {
    /**
     * 拦截所有空指针异常
     * @param e
     * @return 返回code,message,data
     */
    @ExceptionHandler(NullPointerException.class)
    @ResponseBody
    public HashMap<String, Object> nullException(NullPointerException e){
        HashMap<String, Object> result = new HashMap<>();
        result.put("code", "-1");
        result.put("message", "空指针异常" + e.getMessage());//错误描述信息
        result.put("data", null);
        return result;
    }

    @ExceptionHandler(Exception.class)
    @ResponseBody
    public HashMap<String, Object> Exception(Exception e){
        HashMap<String, Object> result = new HashMap<>();
        result.put("code", "-1");
        result.put("message", "异常" + e.getMessage());//错误描述信息
        result.put("data", null);
        return result;
    }
}

这时如果login请求中有空指针异常,页面就会返回下面的结果
在这里插入图片描述

统一数据格式返回

步骤:

  1. 创建类
  2. 添加@ControllerAdvice方法
  3. 实现ResponseBodyAdvice接口
  4. 重写support方法
  5. 重写beforeBodyWrite方法

其中support方法是beforeBodyWrite方法的开关,只有supproy方法返回true,beforeBodyWrite方法才会生效

@ControllerAdvice
public class 类名称 implements ResponseBodyAdvice {
    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) {
        return 返回格式;
    }
}

例如:

@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {

    /**
     * @param returnType
     * @param converterType
     * @return 返回true则执行beforeBodyWrite
     */
    @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("code",200);
        result.put("msg","");
        result.put("data",body);
        return result;
    }
}

返回的结果如下:
在这里插入图片描述

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

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

相关文章

HBase---idea操作Hbase数据库并且映射到Hive

idea操作Hbase数据库并且映射到Hive 文章目录idea操作Hbase数据库并且映射到Hiveidea操作Hbase数据库环境准备启动服务创建Maven工程在测试类中编写初始化方法在测试类中编写关闭方法在测试类中编写创建命名空间方法在测试类中编写创建表方法在测试类中编写查看表结构方法在测试…

tmall.product.match.schema.get( 获取匹配产品规则 )

&#xffe5;免费必须用户授权 ISV发布商品前&#xff0c;需要先查找到产品ID&#xff0c;这个接口返回查找产品规则入参规则 公共参数 请求地址: HTTP地址 http://gw.api.taobao.com/router/rest 公共请求参数: 公共响应参数: 点击获取key和secret 请求示例 TaobaoClient …

ORACLE SQL格式化小数点

ORACLE SQL格式化小数点 select CONCAT(TO_CHAR(0.00100,‘990.999’),‘%’) as a0 , CONCAT(TO_CHAR(1100,‘990.999’),‘%’) as a1 , CONCAT(TO_CHAR(0.236100,‘990.999’),‘%’) as a2 , CONCAT(TO_CHAR(0.0200100,‘990.999’),‘%’) as a3 , CONCAT(TO_CHAR(1.0310…

状态机的Go语言实现版本

一、状态机 1. 定义 有限状态机&#xff08;Finite-state machine, FSM&#xff09;&#xff0c;简称状态机&#xff0c;是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。 2. 组成要素 现态&#xff08;src state&#xff09;&#xff1a;事务当前所处的状…

Java程序中空指针异常的最佳实践

1、空指针问题 NullPointerException 是 Java 代码中最常见的异常&#xff0c;将其最可能出现的场景归为以下 5 种&#xff1a; 参数值是 Integer 等包装类型&#xff0c;使用时因为自动拆箱出现了空指针异常&#xff1b;字符串比较出现空指针异常&#xff1b;诸如 Concurren…

新建vite+vue3+ts项目,以及解决过程中遇到的问题

目录 一、新建vitevue3ts项目 二、解决过程中遇到的问题 解决报错&#xff1a;Module ‘“xx.vue“‘ has no default export. 解决报错&#xff1a;Error [ERR_MODULE_NOT_FOUND]: Cannot find package ‘uuid’ imported from xxx的解决 解决报错&#xff1a;[plugin:vi…

如何选择一款数据库?

1主流数据库技术介绍常见的数据库模型主要分为SQL关系型数据库和NoSQL非关系型数据库。其中关系型数据库分为传统关系数据库和大数据数据库&#xff0c;非关系型数据库分为键值存储数据库、列存储数据库、面向文档数据库、图形数据库、时序数据库、搜索引擎存储数据库及其他&am…

Java集合类

在了解Java集合类之前&#xff0c;我们必须首先了解java.util包&#xff0c;这个包提供了所有集合相关的接口和类。 集合是用来存储数据类型的一种数据结构&#xff0c;提到存储数据类型的数据结构我们最先想到的应该是数组&#xff0c;接下来我们简单回顾下Java中集合和数组的…

Xilinx ZYNQ 7000 HDMI

High-Definition Multimedia Interface (HDMI) 参考xilinx application note XAPP460 HDMI来自High-Definition Multimedia Interface 高分辨率多媒体接口&#xff0c;多媒体一般包含图像和声音。 Transition Minimized Differential Signaling (TMDS) 是HDMI的物理层。 TMDS…

春招冲刺(十一):前端面试之网络总结

网络总结 Q1: GET和POST的请求的区别 应用场景&#xff1a;Get是一个幂等请求&#xff0c;一般用于请求资源。post不是幂等请求&#xff0c;一般用于修改资源。缓存&#xff1a;Get请求一般缓存&#xff0c;Post一般不缓存报文格式&#xff1a;Get请求体一般为空&#xff0c;…

【Linux】linux | 修改dns | 修改网卡dns

一、说明1、业务需要&#xff0c;需要修改服务的dns的地址2、改成阿里的二、操作查询需要修改dns的网卡ifconfig说明1&#xff1a; 留意ens192&#xff0c;即网卡名称查看网卡配置文件信息cd /etc/sysconfig/network-scripts ll备份cp /etc/sysconfig/network-scripts/ifcfg-en…

Advantest爱德万直流电源维修电压电流发生器ADCMT系列

Advantest爱德万电源维修常见型号&#xff1a;ADCMT6240A/B&#xff1b;R6243/R6246&#xff1b;ADCMT系列。 维修品牌&#xff1a; 安捷伦Agilent/HP、泰克Tektronix、安立Anritsu、罗德施瓦茨、爱德万Advantest、艾法斯/马可尼IFR/Marconi、吉时利Keithley、日立Hitachi、 松…

【BOOST C++】组件编程(2)-- 组件的设计原理

GitHub - ros2/demos at foxy 一、说明 为了研究ROS2的组件编程&#xff0c;首先要理解如何何为组件。组件本是微软的发明物体&#xff0c;但是在ubuntu上需要自己从底层实现&#xff0c;就说ROS2不用你写&#xff0c;但是就能看明白也是需要一点理论功底的。本篇按照COM内幕的…

【2223sW3】LOG1

写在前面 好好学习&#xff0c;走出宿舍&#xff0c;走向毕设&#xff01; 一些心路历程记录&#xff0c;很少有代码出现 因为鬼知道哪条代码到时候变成毕设的一部分了咧&#xff0c;还是不要给自己的查重挖坑罢了 23.3.6 lammps代码修改 因为学姐要中期答辩了&#xff0c;…

用Biome-BGC模型如何模拟水循环过程

在Biome-BGC模型中&#xff0c;对于碳的生物量积累&#xff0c;采用光合酶促反应机理模型计算出每天的初级生产力(GPP)&#xff0c;将生长呼吸和维持呼吸减去后的产物分配给叶、枝条、干和根。生物体的碳每天都按一定比例以凋落方式进入凋落物碳库&#xff1b;对于水份输运过程…

2023/3/8集合之TreeSet HashSet简介 不含代码

TreeSet : 底层是由TreeMap维护的 无序的,不可重的 底层结构 : 红黑树(平衡二叉树) 特点 : 查询效率高,默认升序排序引用场景 : 适合应用在存储多个单个值的数据的集合,去重的,自动升序排序的场景新增方法:新增了一些与比较大小相关的方法 遍历方式 1)foreach 2)iterator 1测试…

【C语言学习笔记】:图解指针变量

1 指针变量的基本操作基本操作 int a,*iptr,*jptr,*kptr;iptr &a;jptr iptr;*jptr 100;kptr NULL; 图解&#xff1a; 1.1 己址和己空间 指针变量也是一个变量&#xff0c;对应一块内存空间&#xff0c;对应一个内存地址&#xff0c;指针名就是己址。这空内存空间多大…

42-Golang中的单元测试

Golang中的单元测试需求传统方法基本介绍单元测试快速入门总结综合案例需求 在工作中&#xff0c;我们会遇到这样的情况&#xff0c;就是去确认一个函数&#xff0c;或者一个模块的结果是否正确 传统方法 在main函数中&#xff0c;调用addUpper函数&#xff0c;看看实际输出…

322. 零钱兑换 279.完全平方数

322. 零钱兑换 完全背包问题&#xff0c;需要注意的是数组的初始值。 class Solution {public int coinChange(int[] coins, int amount) {int[] dp new int[amount1];for(int i 0;i < amount;i){dp[i] Integer.MAX_VALUE;}dp[0] 0;for(int i 0;i < coins.length;i…

使用 create-react-app 脚手架搭建React项目

❀官网 1、安装脚手架&#xff1a;npm install -g create-react-app 2、查看版本&#xff1a;create-react-app -V &#xff01;&#xff01;&#xff01;注意 Node版本必须是14以上&#xff0c;不然会报以下错误。 3、创建react项目&#xff08;项目名不能包含大写字母&…