Documentation

A good document is like an intriguing story.

Usage

提供 web 开发中最常用的核心功能,被其它 starter 依赖。

                        Copy
                        
<dependency>
    <groupId>net.dragonshard</groupId>
    <artifactId>dragonshard-web-core-starter</artifactId>
    <version>${latest.version}</version>
</dependency>
                        
                    

Data Desensitization

通过默认或自定义方式,实现敏感数据脱敏。

分为直接使用和基于注解的使用。

直接使用

在 Dragonshard-sample 中查看

                        
// 自定义
Assert.assertEquals(DesensitizedUtils.desValue("abcd", 2, 1, "*"), "ab*d");
// 默认实现,中文姓名
Assert.assertEquals(DesensitizedUtils.chineseName("龙晶"), "*晶");
// 默认实现,电子邮箱
Assert.assertEquals(DesensitizedUtils.email("saber@dragonshard.net"), "s****@dragonshard.net");
                        
                    

基于注解

在 Dragonshard-sample 中查看

                                
// 使用了默认实现的 SensitiveTypeEnum.CHINESE_NAME 脱敏规则
@Sensitive(type = SensitiveTypeEnum.CHINESE_NAME)
@ApiModelProperty(notes = "角色名称")
private String roleName;

/**
 * SensitiveTypeEnum.CUSTOMER 自定义脱敏规则
 * prefixNoMaskLen 前置不需要打码的长度
 * suffixNoMaskLen 后置不需要打码的长度
 */
@Sensitive(type = SensitiveTypeEnum.CUSTOMER, prefixNoMaskLen = 1, suffixNoMaskLen = 1)
@ApiModelProperty(notes = "备注")
private String remark;

// 实际输出
{
    "status": "200",
    "data": {
        "id": "1",
        "roleName": "*****************r",
        "remark": "s****************r",
        "createTime": "2018-11-12 15:59:43.000",
        "modifiedTime": "2018-11-12 15:59:47.000"
    }
}
                                
                            

Jsckson

在 Dragonshard-sample 中查看

                                Copy
                                
// 所有特有配置项都是以dragonshard开头
dragonshard:
  // 二级节点为starter名称
  web-core:
    // 对应的功能
    jackson:
      allow-unquoted-control-chars: true
      time-format-serializer: HH:mm:ss.SSS
      date-format-serializer: yyyy-MM-dd
      date-time-format-serializer: yyyy-MM-dd HH:mm:ss.SSS
                                
                            

配置项前缀dragonshard.web-core.jackson

配置项 默认值 选项 描述
enabled true true / false 是否开启
accept-empty-string-as-null-object true true / false 是否允许对null进行转换
accept-single-value-as-array true true / false 是否接受只有一个元素的数组的反序列化
allow-unquoted-control-chars true true / false 是否允许包含非引号控制字符

控制字符:
值小于32的ASCII字符,含制表符和换行符
default-property-inclusion NON_NULL ALWAYS
默认

NON_DEFAULT
属性为默认值不序列化

NON_EMPTY
属性为""NULL不序列化

NON_NULL
属性为NULL不序列化
序列化设置
fail-on-unknown-properties false true / false 反序列化时遇到未知属性是否引起失败
write-numbers-as-strings true true / false 给所有数字加上引号
date-time-format-serializer yyyy-MM-dd HH:mm:ss
date-format-serializer yyyy-MM-dd
time-format-serializer HH:mm:ss

Api Version

通过@ApiVersion注解,对Api增加版本号。 在 Dragonshard-sample 中查看

用在 Controller 类或方法上,优先级: 方法 > 类。

参数为整数,实际生成格式为http://ip:port/v1/xxx/...

                                Copy
                                
dragonshard:
  web-core:
    version:
      enabled: true
                                
                            

配置项前缀dragonshard.web-core.version

配置项 默认值 选项 描述
enabled true true / false 是否开启

RESTful

在 Dragonshard-sample 中查看

在使用 RESTful 风格接口时,如果对响应速度有非常高的要求( < 50ms ),那么你会发现使用@PathVariable时,相比非 RESTful 风格的请求,处理速度要慢很多。这是因为当在URL中存在变量时,即使用了@PathVariable时,请求处理过程中的路径匹配是非常复杂耗时的。

为了让 RESTful 接口也可以达到非 RESTful 接口一样的效率,我们可以建立一个 HandlerMethod 与服务名的映射,保存在一个Map中。
@RequestMapping中有一个name属性,这个属性并没有被 SpringMVC 用在匹配逻辑中,直接拿来用即可。所以只需要在每个接口的@RequestMapping中添加 name 属性,值为接口的服务名。在 SpringMVC 启动时会自动建立起一个服务名与 HandlerMethod 的映射。我们只要在匹配时从HTTP请求头中获取请求的服务名,然后从该 Map 中查询到对应的 HandlerMethod 返回。如果没有查询到则调用父类中的原匹配逻辑即可。

使用方法

例如要访问如下接口

                                
// 使用 name 参数,值随便定义,唯一
@GetMapping(value = "/{id}", name = "pathVariableDemo")
public ResponseEntity<Result<Role>> get(@PathVariable("id") Long id) {
    return success("RESTful优化");
}
                                
                            

请求时在 Header 中加入X-DSF-MappingName,值就是上面定义的"pathVariableDemo"。

成功触发时,日志会打印: INFO ... [XNIO-1 task-1] n.d.d.w.c.h.WebRequestMappingHandlerMapping: Enable customization mapping > pathVariableDemo