基于spring生态的基础后端开发及渗透测试流程

7 篇文章 1 订阅
2 篇文章 0 订阅

这是一篇记录如何从建仓开始到最后安全测试完整流程的笔记,使用的spring生态,目的是为spring的基础后端开发及后期渗透测试打一个模板。本篇采用springSecurity作为安全框架,搭载了redis-cachespring-valid等功能,并开放了OAuth2授权登录。

本篇代码格式规范为优雅,代码大量使用java8新特性以及apache包下方便的工具类,能一行代码写完的就不用两行。当然本文也配备了大量注释,方便有需要的同学学习。

限于篇幅,文章内只能简短提及使用原因以及简略使用方法,具体步骤还请参考本篇附带代码或百度

代码仓库:https://github.com/23DAY01/blog_23DAY

项目初始化

创建git仓库

github上创建一个仓库,复制仓库地址

https://github.com/xxx/xxx.git

创建spring项目

文件->新建->来自版本控制的项目->填写仓库地址

文件初始化

根据项目需要,更改.gitignore并修改配置文件

测试提交

  • git命令行
    1. git add –ignore-error **.java
    2. git commit -m 'init'
    3. git push --progress --porcelain origin refs/heads/master:master
  • 用idea的GUI直接提交也可以

JavaBean

设计原则

  • 设置逻辑删除字段
  • 设置生成时间、更新时间字段
  • 单一关联时可违反第三范式
  • 不设置外键

数据表

为不占用篇幅,数据表放在篇末

生成实体类

诸多工具可以实现从数据库直接生成pojo实体类,本篇采用mybatis plus

Mybatis-Plus生成器生成domain、dto、vo、controller、service、serviceImpl、mapper、mapperXml

生成器模板具体见mybatis-plus使用手册

领域驱动

这里简单描述一下领域驱动,他主要的目的是为了降低各层之间的耦合,业务层只做业务逻辑

对象含义作用作用范围
DO(Data Object)数据对象与数据库表结构对应,通过DAO层向上传输数据源对象数据库与Dao层,Dao层与Service层
DTO(Data Transfer Object)数据传输对象主要用于远程调用等需大量传输对象的地方Sevice层和Web层
BO(Business Object)业务对象业务对象,可以由 Service 层输出的封装业务逻辑的对象Sevice层和Web层
VO(View Object)视图对象对应页面所显示的数据,将这些数据进行封装并返回Web层与页面
POJO(Plain Ordinary Java Object)普通Java对象--

盗用别人的一张图来描述领域驱动

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zm4VS8vk-1675427351964)(img/%E6%90%AD%E5%BB%BA%E6%B5%81%E7%A8%8B/image-20230122132819257.png)]

当业务不复杂的时候BO和DTO可以合成一个,VO可以直接使用DTO

概念是死的,人是活的,当团队协作开发时一定要保证大家理解的概念是一样的

本篇采用的是domaindtovo三层

JavaBean转换

对于pojo封装的实体类在各层之间的转换,可以采用工具进行转换

  • mapStruct
  • spring
  • hutools
  • EntityUtils
  • BeanCopier
  • ……

本篇采用的是mapStruct进行实体类转化

引入依赖,编写转换器即可使用。mapStruct在打包后会自动生成一段转换代码,并不是使用反射的方式去进行javabean的转换。在转换的过程中,字段名相同的字段会直接转换,不同的字段需要使用@Mapping注解定义,对于嵌套的字段,mapStruct会在自身中自动寻找对应的转换方法。

@Mapper(componentModel = "spring" , injectionStrategy = InjectionStrategy.CONSTRUCTOR)
@Component
public interface MapStruct {

    @Mappings({
            @Mapping(target = "id",source = "studentId"),
    })
    Student studentConvert(StudentRequestVo studentRequestVo);
}

API文档

业务状态码

目前大家对于业务状态码的评论出现两极分化状态,详见https://www.v2ex.com/t/611572

本篇采用业务状态码,并参考微信小程序官方给出的状态码设计规则,自定义状态码

  • 前三位遵循http状态码:200、400、500
  • 中间两位表示错误范围(file、param、authentication等)
  • 后两位表示细粒度错误类型

业务状态码已放在篇末

swagger/knife4j

生成接口文档,导入包并配置文件Knife4jConfig,使用@Api @ApiOperation @ApiParam等标注方法和类,在写完业务逻辑后访问配置文件中配置的文档地址,即可查看全部标注过的接口

Knife4j是一个集Swagger2 和 OpenAPI3为一体的增强解决方案

接口设计

RESTful 的核心思想就是,客户端发出的数据操作指令都是"动词 + 宾语"的结构。比如,GET /articles这个命令,GET是动词,/articles是宾语。

  • GET:读取(Read)
  • POST:新建(Create)
  • PUT:更新(Update)
  • PATCH:更新(Update),通常是部分更新
  • DELETE:删除(Delete)

宾语就是 API 的 URL,是 HTTP 动词作用的对象。它应该是名词,不能是动词。比如,/articles这个 URL 就是正确的

耦合处理

通过构建常量、枚举、工具等类降低项目耦合性,减小后期维护难度

枚举常量

constant

常量类描述
AuthConst认证常量,token过期时间、随机数种子等
CommonConst公共常量
DateConst日期常量,借鉴hutool封装的日期常量
OptTypeConst操作日志常量,操作类型等
RedisPrefixConstredis常量,用于生成redis的key
SocialLoginConst登录常量,oauth2相关常量
StatusMsgConst业务状态码常量
WebConst数据包常量

enums

  • FileExtEnum
  • FilePathEnum
  • LoginTypeEnum
  • StatusCodeEnum
  • UploadModeEnum

工具类

如果想自己造轮子可以仿照诸多工具去自己造,不想造的话直接调用即可

工具类描述
ArithmeticUtil.java浮点数算数工具,用于提供server性能计算
AuthUtil.java认证工具,用于支持SpringSecurity
BeanCopyUtil.java实体类转换工具,spring自带工具
ConvertUtil.java类型转换工具
DateUtil.java日期工具
FileUtil.java文件工具
JsonUtil.javaJson处理工具
JwtUtil.javaJWT工具,用于支持SpringSecurity
MapStruct.java实体类转换工具,mapStruct
OssUtil.javaOSS工具
RedisUtil.javaredis工具
ResponseAPI.java封装响应体
EncryptUtil.java加解密工具
StringUtil.java字符串工具
WebUtil.java网络工具,处理数据包

异常处理

GlobalExceptionHandler利用@RestControllerAdvice@ExceptionHandler注解实现异常统一处理

目前对于异常自定义的写法有很多,本篇采用的是根据多篇文章和Java特性自己总结出来的一种写法,主旨依旧是降低耦合、提高复用性

自定义异常,并继承BaseException,复写withErrorMessagewithErrorCodeEnum即可

对于异常处理的流程:

  • DAO

    1. 尽量不 catch 任何异常, 该向上抛就抛
    2. 不用记录 log 日志, 或者仅使用 logger.debug() 记录
  • Service

    1. 对于一些关键问题,应该及时 throw 异常, 以确保事务完整
    2. Service 层一般的日志级别, 应该用 logger.debug() 记日志
  • Controller 层:

    1. Controller 层负责组装 Service, 在关键步骤上应该加日志输出 (info 级别)
    2. Controller 层不应再主动 throw 异常
  • 统一异常处理层:

    通过 json 或 UI 返回详细的报错信息, 包括 HttpStatus 和详尽的 ErrorCode/ErrorMessage

日志框架

本篇采用slf4j+logback记录日志

导入包并进行文件配置logback-spring.xml`

可以通过@Log4j2注解,在方法内部直接使用log即可

缓存技术

为了提高性能,引入缓存技术,目前springCache的实现有很多种

  • GENERIC
  • JCACHE
  • EHCACHE
  • HAZELCAST
  • INFINISPAN
  • COUCHBASE
  • REDIS
  • CACHE2K
  • CAFFEINE
  • SIMPLE
  • NONE

本篇采用redis,继承CachingConfigurerSupport复写配置方法即可自定义key与过期时间等

首先连接redis,进行文件配置RedisConfig,编写redisUtil方便redis数据操作,编写配置文件CacheConfig并选定redis作为缓存类型即可

注解:

  • @Cacheable:当重复(n>1)调用该方法时,不次执行方法体,其结果直接从缓存中找到并返回
  • @CachePut:确保方法调用即执行,执行后更新缓存
  • @CacheEvict@Cachable注解的反向操作,它负责从给定的缓存中移除一个值
  • @Caching@Caching是一个组注解,可以为一个方法定义提供基于@Cacheable@CacheEvict或者@CachePut注解的数组
  • @CacheConfig:在@CacheConfig注解中定义了类级别的缓存和自定义键生成器

切面编程

spring里可以有三种方法实现切面编程,过滤器、拦截器、切面

三者的顺序为:过滤器->拦截器->切面

可以根据业务需要使用三者中的任意一个进行业务逻辑的编写

拦截器可以访问controller上下文、值栈里的对象,而过滤器不能访问

拦截器可以获取IOC容器中的各个bean,而过滤器就不行

操作日志

如果有对人员的行为进行记录的需求,则可以通过自定义注解OptLog,然后写一个切面OptLogAspect,并配置切入点即可实现对重点资产的操作行为记录

接口限流

实现对部分接口的接口限流操作,防止人员恶意访问接口。通过自定义注解AccessLimit,通过实现HandlerIntercept生成自定义拦截器ApiAccessRestrictionInterceptor,注入到spring里面,并在WebMvcConfigurer中添加拦截器

重复提交限制

实现对部分接口的重复提交限制。通过自定义注解RepeatSubmit,通过实现HandlerIntercept生成自定义拦截器RepeatSubmitInterceptor,注入到spring里面,并在WebMvcConfigurer中添加拦截器

安全框架

认证安全

本篇实现的是1.5次开发的springSecurity,复写了一部分的springSecurity的处理器,实现了部分的定制,这一部分内容推荐大家自己debug一下源码,这样会更容易理解

采用session管理用户,session信息保存在redis里面

所有bean注入全部放入SecurityBeanCreateConfig

本篇由于重写了UsernamePasswordAuthenticationFilter,所以对于springSecurity的原有配置做了比较大的改动,配置起来较为麻烦

认证

继承WebSecurityConfigurerAdapterconfigure复写,对http进行配置

  • formLogin
    1. 复写loadUserByUsername
    2. 认证成功处理器authenticationSuccessHandler
    3. 认证失败处理器authenticationFailHandler
    4. 登录url
  • logout
    1. 登出成功处理器logoutSuccessHandler
    2. 登出url
  • authorizeRequests
    1. 密码比对策略DaoAuthenticationProviderImpl
    2. 自定义接口拦截规则filterInvocationSecurityMetadataSource
    3. 自定义权限提取规则accessDecisionManager
  • rememberMe
  • 其他配置
    1. 前认证检查preAuthenticationChecks
    2. 后认证检查postAuthenticationChecks
会话管理

利用@EnableRedisHttpSession开启redis管理session

WebSecurityConfig中配置http.session

  • sessionId策略
  • session过期策略
  • session并发策略
  • session集群会话处理
  • session错误策略

上述部分策略由CompositeSessionAuthenticationStrategy集合后注入到LoginAuthenticationFilter

其余策略注入到springSecurity配置的session管理器中

验证码

本篇采用图形验证码,先编写配置文件CaptchaConfigVerificationCodeFilter实现OncePerRequestFilter

WebSecurityConfig中的http.addFilterAtVerificationCodeFilter添加过滤器在UsernamePasswordAuthenticationFilter在前面即可

数据流恢复

通过BodyReaderRequestWrapperRepeatableFilter恢复数据流,通过repeatableFilterRegistration方法注册,解决在Filter中读取Request中的流后,后续controller或restful接口中无法获取流的问题

将取出来的字符串,再次转换成流,然后把它放入到新request 对象中,在chain.doFiler方法中 传递新的request对象

网络配置

实现WebMvcConfigurer,配置定义的拦截器,解决跨域问题以及资源处理器问题

数据校验

由于对外接口全部体现为VO,我们在VO的对应字段上加入@Valid的相关注解,并在参数位置使用@Valid即可实现对数据的校验

  • 针对 UI 输入检查, 如果 js 前端检查有困难, 可以在 Controller 层使用 Pojo validation 手段做检查, 然后前端使用 ajax 拿到校验结果. 检查过程没有触发 UI 完整渲染, 用户体验会很好
  • Controller 层使用 validation 进行检查, 可以在视图函数的形参上检查, 或者在视图函数内部检查.
  • Service 层, 使用 Assert 进行数据验证
  • DAO 层, 不做任何数据验证

会话监听

通过session监听器对session的创建、销毁等行为进行自定义,其中就包括存在于session里面的id,即每次会话产生一次作用的javabean

RedisHttpSessionListener通过实现HttpSessionListener能监听session的创建销毁,实现HttpSessionAttributeListener能监听session里面的键值的创建销毁,然后将RedisHttpSessionListener作为bean注入到spring里面就可以实现监听了

注入检测

通过加一层过滤器实现对输入的安全过滤

定义过滤器后写一个wrapper把过滤器增强,重写里面的getParam等方法,然后将过滤器加入过滤器链中,从而实现过滤

策略

文件上传策略

通过构建文件上传上下文UploadStrategyContext来存储全局文件上传参数,UploadStrategy接口和AbstractUploadStrategyImpl抽象类,通过继承可实现本地文件上传LocalUploadStrategyImpl,oss文件上传OssUploadStrategyImpl等上传策略

登录策略

策略构建方法同上,可以构建qq登录、微博登录、邮箱登录方法

业务逻辑

介绍本篇重要利用的某些语法,主要为java8新特性、自定义分页、自定义响应包等

Optional

主要用于对null的判断,利用ofNullableisPresent

Stream

流的操作包含如下三个部分:创建流、中间流、关闭流。筛选、去重、映射、排序属于流的中间操作,收集属于终止操作。Stream是流操作的基础关键类

通过流操作可以更优雅快速的实现对javaBean的处理

先通过stream生成流,再通过mapdistinct等处理流,最后收集流

分页

mybatisplus自带的page的基础上构建PageUtil,构建了一个仅存在于一次requestpage

通过一个过滤器实现对参数内currentsize的获取,在控制层之前构建出page,从而实现在参数内无需出现分页参数

通过PageUtil可以解决返回参数时无法知道total的问题

最后通过pageResult封装一下分页bean即可

注意:page使用前后是一个实体

CompletableFuture

使用CompletableFuture可以实现异步任务,当前后业务逻辑无关时可以将耗时较长的方法设为异步任务

ResponseAPI

通过自定义响应包,将业务状态码与状态信息、响应体封装在一起

collections4

对于mybatis-pluslambdaQuerycontains等需要判空的地方可以使用emptyIfNullisNotEmpty等方法,方便编写业务逻辑

定时任务

对于游客用户的地域统计可以采用定时任务的形式,统计数据存入redis即可

上线部署

本篇用的是docker-compose去部署这个博客系统,在application.yml中将active字段设置为prod,然后创建application-prod.yml配置文件,将上线部署的环境变量配置进去即可,避免将本地配置暴露

把利用到的中间件等配置文件写好,利用docker-compose去构建这些docker容器即可,记得将容器放在一个网络内,而每个容器的ip或域名与其名字是一样的,也就是我们在application-prod.yml中可以直接使用容器名作为ip

另外,本篇用另一个域名处理管理员对应操作,nginx和vue打包时需要对应两个文件

安全测试

容灾备份

The end

数据表

day_article文章表

字段名字段类型属性备注
idintnot null主键
user_idintnot null作者id
category_idintnull;default null分类id
article_covervarcharnull;default null文章封面
article_contentlongtextnot null文章内容
article_titlevarcharnot null文章标题
typeintnot null;default 0(1原创 2转载 3翻译)文章类型
original_urlvarcharnull;default null原文链接
is_toptinyintnot null;default 0(0否 1是)是否置顶
statusintnot null;default 1(1公开 2私密 3草稿)文章状态
deletedtinyintnull;default 0(0否 null是)逻辑删除
create_timedatetimenot null创建时间
update_timedatetimenull;default null修改时间

day_article_tag文章标签关系表

字段名字段类型属性备注
idintnot null主键
article_idintnot null文章id
tag_idintnot null标签id
deletedtinyintnull;default 0(0否 null是)逻辑删除
create_timedatetimenot null创建时间
update_timedatetimenull;default null修改时间

day_category分类表

字段名字段类型属性备注
idintnot null主键
category_namevarcharnot null分类名称
deletedtinyintnull;default 0(0否 null是)逻辑删除
create_timedatetimenot null创建时间
update_timedatetimenull;default null修改时间

day_chat_record聊天记录表

字段名字段类型属性备注
idintnot null主键
user_idintnull;default null用户id
nicknamevarcharnot null用户昵称
avatarvarcharnot null用户头像
contentvarcharnot null聊天内容
ip_addressvarcharnot nullip地址
ip_sourcevarcharnot nullip来源
typeintnot null记录类型
deletedtinyintnull;default 0(0否 null是)逻辑删除
create_timedatetimenot null创建时间
update_timedatetimenull;default null修改时间

day_comment评论表

除一级评论(顶级评论)外,其他嵌套评论均归为二级评论

parent_id是父评论id

top_id是顶级评论

reply_user_id是当前comment作为回复时,被回复的评论的用户id,属于冗余设计

user_id是当前comment的用户id

affiliation_id是属主的id

type是属主的类型

字段名字段类型属性备注
idintnot null主键
user_idintnot null用户id
affiliation_idintnull;default null所属主体id
typeintnot null;default 0(1文章 2友链 3说说)评论类型
comment_contenttextnot null评论内容
reply_user_idintnull;default null回复用户id
parent_idintnull;default null父评论id
top_idintnull;default null顶级评论id
is_reviewtinyintnot null;default 0(0否 1是)是否审核
deletedtinyintnull;default 0(0否 null是)逻辑删除
create_timedatetimenot null创建时间
update_timedatetimenull;default null修改时间

day_friend_link友链表

字段名字段类型属性备注
idintnot null主键
link_namevarcharnot null链接名称
link_avatarvarcharnot null链接头像
link_addressvarcharnot null链接地址
link_infovarcharnot null链接简介
deletedtinyintnull;default 0(0否 null是)逻辑删除
create_timedatetimenot null创建时间
update_timedatetimenull;default null修改时间

day_menu菜单表

字段名字段类型属性备注
idintnot null主键
menu_namevarcharnot null菜单名称
menu_pathvarcharnot null菜单路径
compoentvarcharnot null组件
iconvarcharnot null菜单图标
order_numintnot null排序级别
parent_idintnot null父菜单id
is_hiddentinyintnot null;default 0(0否 1是)是否隐藏
deletedtinyintnull;default 0(0否 null是)逻辑删除
create_timedatetimenot null创建时间
update_timedatetimenull;default null修改时间

day_message留言表

字段名字段类型属性备注
idintnot null主键
nicknamevarcharnot null用户昵称
avatarvarcharnot null用户头像
message_contentvarcharnot null留言内容
ip_addressvarcharnot nullip地址
ip_sourcevarcharnot nullip来源
speedintnull;default null弹幕速度
is_reviewtinyintnot null;default 0(0否 1是)是否审核
deletedtinyintnull;default 0(0否 null是)逻辑删除
create_timedatetimenot null创建时间
update_timedatetimenull;default null修改时间

day_operation_log操作日志表

字段名字段类型属性备注
idintnot null主键
opt_modulevarcharnot null操作模块
opt_typevarcharnot null操作类型
opt_urlvarcharnot null操作url
opt_methodvarcharnot null操作方法
opt_descvarcharnot null操作描述
request_paramlongtextnot null请求参数
request_methodvarcharnot null请求方式
response_datalongtextnot null响应数据
user_idintnot null用户id
nicknamevarcharnot null用户昵称
ip_addressvarcharnot nullip地址
ip_sourcevarcharnot nullip来源
deletedtinyintnull;default 0(0否 null是)逻辑删除
create_timedatetimenot null创建时间
update_timedatetimenull;default null修改时间

day_page页面表

字段名字段类型属性备注
idintnot null主键
page_namevarcharnot null页面名称
page_labelvarcharnull;default null页面标签
page_covervarcharnot null页面封面
deletedtinyintnull;default 0(0否 null是)逻辑删除
create_timedatetimenot null创建时间
update_timedatetimenull;default null修改时间

day_resource资源表

字段名字段类型属性备注
idintnot null主键
resource_namevarcharnot null资源名称
urlvarcharnull;default null权限路径
request_methodvarcharnull;default null请求方式
parent_idintnull;default null父权限id
is_anonymoustinyintnot null;default 0(0否 1是)是否可以匿名访问
deletedtinyintnull;default 0(0否 null是)逻辑删除
create_timedatetimenot null创建时间
update_timedatetimenull;default null修改时间

day_role角色表

字段名字段类型属性备注
idintnot null主键
role_namevarcharnot null角色名称
role_labelvarcharnot null角色描述
is_disabletinyintnot null;default 0(0否 1是)是否禁用
deletedtinyintnull;default 0(0否 null是)逻辑删除
create_timedatetimenot null创建时间
update_timedatetimenull;default null修改时间

day_role_menu角色菜单表

字段名字段类型属性备注
idintnot null主键
role_idintnull;default null角色id
menu_idintnull;default null菜单id
deletedtinyintnull;default 0(0否 null是)逻辑删除
create_timedatetimenot null创建时间
update_timedatetimenull;default null修改时间

day_role_resource角色资源表

字段名字段类型属性备注
idintnot null主键
role_idintnull;default null角色id
resource_idintnull;default null资源id
deletedtinyintnull;default 0(0否 null是)逻辑删除
create_timedatetimenot null创建时间
update_timedatetimenull;default null修改时间

day_tag标签表

字段名字段类型属性备注
idintnot null主键
tag_namevarcharnot null标签名称
deletedtinyintnull;default 0(0否 null是)逻辑删除
create_timedatetimenot null创建时间
update_timedatetimenull;default null修改时间

day_talk说说表

字段名字段类型属性备注
idintnot null主键
user_idintnot null用户id
contentvarcharnot null说说内容
imagevarcharnull;default null图片
is_toptinyintnot null;default 0(0否 1是)是否置顶
statustinyintnot null;default 1(0公开 1私密)说说状态
deletedtinyintnull;default 0(0否 null是)逻辑删除
create_timedatetimenot null创建时间
update_timedatetimenull;default null修改时间

day_view访问量表

字段名字段类型属性备注
idintnot null主键
view_countintnot null访问量
deletedtinyintnull;default 0(0否 null是)逻辑删除
create_timedatetimenot null创建时间
update_timedatetimenull;default null修改时间

day_user_auth用户权限表

字段名字段类型属性备注
idintnot null主键
user_info_idintnot null用户信息id
usernamevarcharnot null用户名
passwordvarcharnot null密码
login_typeintnot null登录类型
ip_addressvarcharnull;default nullip地址
ip_sourcevarcharnull;default nullip来源
is_disabledtinyintnot null;default 0(0否 1是)是否禁用
last_login_timedatetimenull;default null上次登录时间
deletedtinyintnull;default 0(0否 null是)逻辑删除
create_timedatetimenot null创建时间
update_timedatetimenull;default null修改时间

day_user_info用户信息表

字段名字段类型属性备注
idintnot null主键id
emailvarcharnull;default null邮箱
nicknamevarcharnot null用户昵称
avatarvarcharnot null;default ‘’用户头像
introvarcharnull;default null用户介绍
websitevarcharnull;default null个人网站
deletedtinyintnull;default 0(0否 null是)逻辑删除
create_timedatetimenot null创建时间
update_timedatetimenull;default null修改时间

day_user_role用户角色表

字段名字段类型属性备注
idintnot null主键
user_idintnull;default null用户id
role_idintnull;default null角色id
deletedtinyintnull;default 0(0否 null是)逻辑删除
create_timedatetimenot null创建时间
update_timedatetimenull;default null修改时间

day_website_config网站配置表

字段名字段类型属性备注
idintnot null主键
namevarcharnot null网站名称
introvarcharnull;default null网站简介
authorvarcharnull;default null网站作者
urlvarcharnull;default null网站地址
noticevarcharnull;default null网站通知
aboutvarcharnull;default null关于我
githubvarcharnull;default nullgithub
qqvarcharnull;default nullqq号
beian_idvarcharnull;default null备案号
author_avatarvarcharnull;default ‘’作者头像
user_avatarvarcharnull;default‘’游客头像
deletedtinyintnull;default 0(0否 null是)逻辑删除
create_timedatetimenot null创建时间
update_timedatetimenull;default null修改时间

业务状态码

2xx:
http状态码错误范围细粒度错误业务状态码错误原因错误名称
2000000200000nullOK
4xx(client):
http状态码错误范围细粒度错误业务状态码错误原因错误名称
40001014000101参数缺失ACCESS_PARAM_MISSING
40001024000102参数类型错误ACCESS_PARAM_TYPE_ERROR
40001034000103参数校验错误ACCESS_PARAM_NOT_VALID
40002014000201文件为空FILE_EMPTY
40002024000202文件类型错误FILE_TYPE_ERROR
40003014000301尚未登录AUTH_NO_LOGIN
40003024000302缺少权限AUTH_PERMISSION_DENIED
40003034000303认证失败AUTH_UorP_ERROR
40003044000304用户名为空AUTH_USERNAME_EMPTY
40003054000305账号不存在AUTH_USER_NOT_FOUND
40003064000306认证失败AUTH_FAILED
40003074000307校验码错误AUTH_CODE_ERROR
40003084000308校验码为空AUTH_CODE_MISSING
40003094000309session过期AUTH_SESSION_TIMEOUT
40003104000310访问登录接口方法错误AUTH_METHOD_NOT_AVAILABLE
40003114000311账号已在别处登录AUTH_SESSION_CONCURRENCY_MAX
40003124000312用户账号已锁定AUTH_USER_ACCOUNT_LOCKED
40003134000313用户账号不可用AUTH_USER_ACCOUNT_DISABLED
40003144000314用户账号已过期AUTH_USER_ACCOUNT_EXPIRED
40003154000315用户账号密码过期AUTH_USER_CREDENTIALS_EXPIRED
40003164000316用户名已存在AUTH_USER_USERNAME_REPEAT
40003174000317密码错误AUTH_PASSWORD_ERROR
40003184000318qq登录失败AUTH_QQ_ERROR
40004014000401接口访问频繁API_ACCESS_FREQUENT
40004024000402重复提交API_REPEAT_SUBMIT
40004034000403接口访问方法错误API_ACCESS_METHOD_ERROR
40005014000501检测到xss或sql注入SECURITY_CHECK_XSSorSQL
40010014001001文章不存在ARTICLE_MISSING
40011014001101说说不存在TALK_MISSING
40012014001201分类已存在CATEGORY_NAME_REPEAT
40012024001202分类不存在CATEGORY_MISSING
40012034001203分类下存在文章CATEGORY_ARTICLE_RELATION
40013014001301标签已存在TAG_NAME_REPEAT
40013024001302标签不存在TAG_MISSING
40013034001303标签下存在文章TAG_ARTICLE_RELATION
40014014001401菜单下存在角色MENU_ROLE_RELATION
40015014001501资源下存在角色RESOURCE_ROLE_RELATION
40099014009901未知异常UNKNOWN_CLIENT_ERROR
5xx(server):
http状态码错误范围细粒度错误业务状态码错误原因错误名称
50001015000101参数封装失败PARAM_OPERATION_ERROR
50002015000201文件上传失败FILE_UPLOAD_ERROR
50002025000202文件下载失败FILE_DOWNLOAD_ERROR
50004015000401数据库异常SQL_ERROR
50004025000402redis连接异常REDIS_CONNECTION_ERROR
50099015009901运行时未知异常UNKNOWN_RUNTIME_ERROR
50099025009902系统未知异常UNKNOWN_SYSTEM_ERROR
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值