首页 > 其他分享 >测试平台开发(一)鉴权模块5 用户登录与异常拦截

测试平台开发(一)鉴权模块5 用户登录与异常拦截

时间:2024-11-08 21:49:25浏览次数:3  
标签:返回 ServiceException String public user 模块 response 拦截 鉴权

一、定义异常类型

使用以下代码定义了ServiceException,集成了RuntimException,用于在系统中捕捉和返回异常信息。

@Data
@Slf4j
public class ServiceException extends RuntimeException{
    private static final long serialVersionUID = 12345678123456L;

    private Integer code;
    private String message;


    public ServiceException(Integer code) {
        this.code = code;
    }

    public ServiceException(String message) {
        this.code = 400;
        this.message = message;
        log.info("message:{}",this.message);
    }
}

二、用户登录逻辑

1、编写Controller层

用户登录后,将密码进行加密,并将密文与数据库中的密文对比,如果一致则登录成功;否则将报错。

    @PostMapping("/tokens")
    public Response login(@RequestParam(value = "uid")String username,
                          @RequestParam(value = "pwd")String password,
                          HttpServletResponse response){
        // 验证用户名和密码不能为空
        Assert.notNull(username,"用户名不能为空");
        Assert.notNull(password,"密码不能为空");
        UserEntity user = userServiceImp.getUserByAccount(username);
        if (user == null){
            throw new ServiceException("用户名或密码错误");
        }

        // 将用户输入的密码进行加密
        String encodePwd = SecurityUtils.md5(password, user.getUserActivationKey());

        // 将密文与数据库中存储的密文进行对比,不一致则说明认证错误
        if (!encodePwd.equals(user.getPassword())){
            throw new ServiceException("用户名或密码错误");
        }

        // 操作response的header信息
        String token = "123";
        response.setHeader(SecurityUtils.REQUEST_AUTH_HEADER,token);
        response.setHeader("Access-Controller-Expose-Header",SecurityUtils.REQUEST_AUTH_HEADER);

        // 注意不要返回用户的密码和密钥
        user.setPassword(null);
        user.setUserActivationKey(null);
        // 把user和token返回
        return ResponseFactory.getSuccess("user",user,"token",token);
    }

ResponseFactory的定义参考:测试平台开发(一)鉴权模块2 统一返回工厂-CSDN博客

2、编写Service层

使用用户名和密码去数据库查询

    public UserEntity getUserByAccount(String username){
        UserEntity userEntity = this.getOne(new QueryWrapper<UserEntity>().eq("username", username));
        return userEntity;
    }

3、代码中的缺陷

以上用户登录鉴权的逻辑基本完成,但存在一个问题,即如果用户验证失败,那么用户看到的返回是500错误,我们主动抛出的异常ServiceException("用户名或密码错误")只会在后台打印,用户无法看到错误信息。因此我们要使用拦截器,把错误信息返回给用户。

三、拦截异常并返回

1、定义拦截器

我们定义ResponseResultHandler并实现ResponseBodyAdvice,可以对Response进行拦截。

①supports:定义对哪种类型的方法进行拦截,此处指定了非void类型

②beforeBodyWrite:全局重写response的返回值,此处直接返回response的body就可以了

③ExceptionHandler注解:全局拦截异常,捕获到ServiceException异常后,直接使用ResponseFactory构造返回结果

@RestControllerAdvice
public class ResponseResultHandler implements ResponseBodyAdvice {

    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        // 指定对哪种返回类型进行拦截,此处只拦截非Void类型的方法,因为Void方法不涉及改写异常的返回
        boolean isVoid = !returnType.getMethod().getReturnType().isAssignableFrom(Void.TYPE);
        return isVoid;
    }

    // 全局重写返回值
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        // 改写返回值,此处返回body即为不改写,因为非异常情况下直接返回就可以。
        // 举例:如果改写成return 123456,那么返回结果也会是123456
        return body;
    }

    // 全局拦截异常,捕获到ServiceException异常后,直接使用ResponseFactory构造返回结果
    @ExceptionHandler(ServiceException.class)
    public Response handleServiceException(ServiceException e, HttpServletRequest request){
        return ResponseFactory.getError(e.getMessage());
    }
}

再次测试登录接口,可以看到已经变为修改后的返回值

标签:返回,ServiceException,String,public,user,模块,response,拦截,鉴权
From: https://blog.csdn.net/weixin_39477393/article/details/143602624

相关文章

  • 使用argparse模块添加命令行参数
    有时,我们希望我们的程序运行时能够通过参数来控制其行为,一种就是通过一个前端交互的界面让用户来配置参数,另一种就是直接通过命令行的方式启动程序的同时设置参数。argparse模块就实现了命令行参数的功能,参数名如果是--parm或-p这种加了-或--前缀的,默认为可选参数,但也可......
  • 【前端知识】JS模块规范
    JS模块规范概述CommonJS规范代码示例AMD规范代码示例ES6Module规范代码示例IIFE规范代码示例全局变量代码示例CommonJS模块和ES6模块有什么区别?1.语法和声明方式2.动态和静态导入3.循环依赖4.默认导出和命名导出5.文件扩展名6.环境和应用7.工具和构......
  • 配置文件configparser模块
    importconfigparserconfig=configparser.ConfigParser()'''#创建配置文件config["DEFAULT"]={"ServerAliveInterval":"45","Compression":"yes","......
  • Multi-Scale and Detail-Enhanced Segment Anything-1-MEEM-差分边缘增强模块
    `importtorch.nnasnnimporttorchclassMEEM(nn.Module):definit(self,in_dim,hidden_dim,width=4,norm=nn.BatchNorm2d,act=nn.GELU):super().init()self.in_dim=in_dimself.hidden_dim=hidden_dimself.width=widthself.in_conv=nn.Sequential(nn......
  • 【模块一】kubernetes容器编排进阶实战之k8s基础概念
    kubernetes基本介绍kubernetes组件简介   -master:       主人,并不部署服务,而是管理salve节点。      后期更名为:controllplane,控制面板。         etcd:      2379(客户端通信)、2380(集群内部通信)         ......
  • 理解Web登录机制:会话管理与跟踪技术解析(四)-拦截器Interceptor、异常处理
    本文将详细探讨如何通过拦截器实现登录校验,并介绍如何通过异常处理来确保系统的鲁棒性。我们将通过具体的示例,深入分析如何在Spring框架中配置拦截器与异常处理,以便为开发者提供一套高效、安全的登录校验和异常管理方案。目录前言拦截器Interceptor快速入门Interceptor......
  • 网页版五子棋——用户模块(服务器开发)
    前一篇文章:网页版五子棋——WebSocket协议-CSDN博客目录·前言一、编写数据库代码1.数据库设计2.配置MyBatis3.创建实体类4.创建UserMapper二、前后端交互接口1.登录接口2.注册接口3.获取用户信息三、服务器开发1.代码编写2.测试后端接口·结尾·前言 ......
  • VUE模块化开发思路
    构建工具:vite需求:在多个项目下,低层框架可复用,样式可复用,模块可复用。一、项目示例例如当前有两个项目:aaAdmin项目atwtighten项目b项目a和项目b中都有共同的低层逻辑,比如登录,权限验证,前端框架样式等等。在这个两个项目中我们独立出一个公用项目adminCommon,a和b都引用......
  • W5500以太网模块 - 25MHz谐波超标
    在低频超标的,25M倍频,100M以太网产品针对W5500以太网模块25MHz谐波辐射不合格的问题,可以采取以下措施进行解决:1.检查晶振电路晶振选择:确保使用的晶振符合W5500模块的要求,具有稳定的频率和较低的谐波。w5500的晶振输出输入分别加rc滤波,w5500出来的时钟加π型滤波电路布局:优化......
  • angular—如何制作一个HTTP拦截器
    原文链接:angular—如何制作一个HTTP拦截器–每天进步一点点HTTP拦截器在开发过程中十分常见。在构建项目时,最好就直接创建一个HTTP拦截器,否则遇到以下几种问题,再进行改动就会十分浪费时间。需要给所有的请求修改请求地址。需要给所有的请求参数设置新的请求报文首部。需要监......