Usage
提供 web 开发中最常用的核心功能,被其它 starter 依赖。
Copy
<dependency>
<groupId>net.dragonshard</groupId>
<artifactId>dragonshard-web-core-starter</artifactId>
<version>${latest.version}</version>
</dependency>
Data Desensitization
通过默认或自定义方式,实现敏感数据脱敏。
分为直接使用和基于注解的使用。
直接使用
// 自定义
Assert.assertEquals(DesensitizedUtils.desValue("abcd", 2, 1, "*"), "ab*d");
// 默认实现,中文姓名
Assert.assertEquals(DesensitizedUtils.chineseName("龙晶"), "*晶");
// 默认实现,电子邮箱
Assert.assertEquals(DesensitizedUtils.email("saber@dragonshard.net"), "s****@dragonshard.net");
基于注解
// 使用了默认实现的 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
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
在使用 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