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

news2024/12/23 16:37:39

这是一篇记录如何从建仓开始到最后安全测试完整流程的笔记,使用的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

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

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

相关文章

实测十款连锁店管理系统,专为纠结的连锁店老板打造!

普通的数据工具、人工管理难以满足连锁店老板们的需求,正所谓“有需求就有市场”,随着连锁店、加盟店如雨后春笋般在城市里出现,连锁店管理系统也越来越多。究竟哪一款连锁店管理系统,才能满足老板们的需求?不用纠结了…

park unpark 原理

1、基本使用 // 暂停当前线程 LockSupport.park();// 恢复某个线程的运行 LockSupport.unpark(暂停线程对象) 先 park 再 unpark public class Test1 {public static void main(String[] args) throws InterruptedException {Thread t1 new Thread(() -> {log.debug(&q…

「自控元件及线路」1.2 电机中的磁性材料与磁场

本节介绍磁性材料的性能、分类 本节介绍电机中永磁材料的工作曲线 本节介绍电机中主磁极、电枢的磁场及电枢反应 文章目录磁性材料的基本概念磁性材料的磁性能高导磁性 饱和性 磁滞性 非线性温度特性 电阻率特性铁耗磁性材料的分类电机中的永磁材料永磁电机概述永磁材料的磁性能…

mysql:聊聊mysql学完之后心得,从哪里学,学哪些,怎么选课程,学到什么程度。

mysql:聊聊mysql学完之后心得,从哪里学,学哪些,怎么选课程,学到什么程度。 学习完一套课程之后习惯性总结一下。首先说一下,咕咕是跟着尚硅谷的康老师学习的mysql,大家想学习的话可以直接去b站…

Java文件IO操作及案例

文章目录一. 文件概述1. 狭义和广义上的文件2. 文件的分类3. 文件的路径二. 针对文件系统的操作1. File类的属性和构造2. File类的获取操作3. File类的判断操作4. 文件的创建和删除5. 其他的常用方法三. 对文件内容进行读写1. IO流对象2. 文件的读操作3. 文件的写操作4. Scanne…

vim使用入门

目录vim模式介绍1.1 模式介绍1.2 模式之间切换1.3 进入vim1.4 退出vimvim模式介绍 1.1 模式介绍 vim具有6种基本模式和5种派生模式。 6种基本模式如下: 普通模式 vim启动后的默认模式。使用编辑器命令,比如移动光标,删除文本等等 普通模式进…

智能指针(二)—— unique_ptr、shared_ptr 的简单模拟实现

智能指针其实就是资源管理权限的转移,自己不想手动释放,交给一个对象管理,对象什么时候被销毁,这块资源也就什么时候被释放。unique_ptr 、shared_ptr 和weak_ptr 之间的区别如下: unique_ptr:字面意思是…

非全研究生开题-室内定位最新研究论文总结-1

序言 时间飞逝,23年3月底之前要把开题报告和综述写好。开学后研究了2个方向:serverless冷启动和室内定位; 春节期间在这2个选题之间犹豫不决,不断在心里面分析 经过反复比较对比,决定研究室内定位,也可以为后续完善产品,甚至后面创业打下基础。 后面我会持续深入,在…

【数据结构】链表必做题

写在开头学完链表,我们就要适当做一些题目来巩固知识,下面的一些精选题难度适中,很适合初学者练手。做题之前我们来了解一点概念,就是链表调用传参时,我们什么时候使用一级指针,什么时候使用二级指针&#…

在Linux上安装Maven和配置Maven仓库(v3.8.7)

记录:369场景:在CentOS 7.9操作系统上,使用apache-maven-3.8.7安装Maven和配置Maven仓库。版本:JDK 1.8apache-maven-3.8.7名词:Apache Maven:Apache Maven is a software project management and comprehe…

31_内存马

内存马 一、php内存马(不死马) 原不死马文件是生成一个一句话木马文件之后,自动删除自身,并且抑制报错 即使删除生成的一句话木马文件 也会不断的继续生成一句话木马文件 除非重启服务,才能停止继续生成 <?php error_reporting(0);//抑制报错 unlink(__FILE__);//删除…

【工具】iOS代码混淆工具-iOS源码混淆

最新更新记录 V2.0.3&#xff08;2022年12月11日&#xff09;更新内容&#xff1a; 1、新增导入映射列表的逻辑&#xff1b; 2、优化修复其他混淆逻辑&#xff1b; 3、更新地址 - github 主要功能 ZFJObsLib是专业的iOS源码混淆工具&#xff0c;具体功能有方法混淆、属性…

AcWing 1082. 数字游戏(数位DP)

AcWing 1082. 数字游戏&#xff08;数位DP&#xff09;一、问题二、数位DP三、思路分析四、代码一、问题 二、数位DP 这道题是在一个区间内挑选满足某个条件的数&#xff0c;这是一个非常典型的数位DP的特点。 这道题是一道数位DP的题目&#xff0c;其实数位DP更像我们在高中…

5-TAMRA-TSA,5-TAMRA-Tyramide,5-四甲基罗丹明-酪酰胺

【中文名称】5-四甲基罗丹明-酪酰胺&#xff0c;5四甲基罗丹明酪酰胺【英文名称】 5-Tamra-Tyramide&#xff0c;5-TAMRA-Tyramide&#xff0c;5-Tamra-TSA&#xff0c;5-TAMRA-TSA【CAS】N/A【纯度标准】95%【包装规格】5mg&#xff0c;10mg&#xff0c;25mg【是否接受定制】可…

spring springboot关于异步线程实践案例

前言&#xff1a; 关于多线程的异步处理&#xff0c;由于项目的需求有个方法需要使用异步的方法来调用&#xff0c;方法是调用外部的接口&#xff0c;执行时间会比较长导致的没有办法同步拿去到结果&#xff0c;所以需要写一个异步线程的方法进行该接口的调用&#xff0c;下面是…

Unity - UI适配方案记录

1.普通屏不同分辨率适配及预览 1.背景图 界面背景图建议至少宽于21:9&#xff1b;其中16:9的范围为精细范围&#xff0c;12:9的范围为真机最小可见范围。 2.组件 各组件通过设置RectTransform属性来达到正确适配的效果。 3.预览 在unity中&#xff0c;设置Game窗口左上角…

【C++入门第一期】命名空间 缺省参数 函数重载 的使用方法及注意事项

目录简介命名空间为何会有命名空间命名空间的定义嵌套定义命名空间的使用作用域限定符using 将命名空间中某个成员引入using namespace 将该空间所有成员引入缺省参数全缺省参数函数半缺省参数函数如何给缺省值函数重载函数重载的概念函数重载的三种类型1&#xff1a;函数参数类…

【蓝桥日记①】2017第八届省赛(软件类)JavaA组❤️答案解析

【蓝桥日记①】2017第八届省赛&#xff08;软件类&#xff09;JavaA组❤️答案解析 文章目录【蓝桥日记①】2017第八届省赛&#xff08;软件类&#xff09;JavaA组❤️答案解析A、迷宫B、9数算式C、魔方状态D、方格分割E、字母组串F、最大公共子串G、正则问题H、包子凑数I、分巧…

PID控制和误差曲线分析

PID控制模型 负反馈控制模型&#xff0c;到处都挺常见的&#xff0c;我记得高中的时候生物上就有一堆&#xff0c;什么体液调节之类的。PID控制也算是经典控制了&#xff0c;大家讲的都是经验之谈&#xff0c;这里我从误差曲线调节的角度来讲&#xff08;误差曲线调节一般都是…

Java集合 Map 集合 与 操作集合的工具类: Collections 的详细说明

Java集合 Map 集合 与 操作集合的工具类: Collections 的详细说明 每博一文案 别把人生&#xff0c;输给心情 师父说&#xff1a;心情不是人生的全部&#xff0c;却能左右人生的全部。 你有没有体会到&#xff0c;当你心情好的时候&#xff0c;生活仿佛阳光灿烂&#xff0c;顺…