尽量减少接口的交互
一定要是后端掌控全局,让前端无脑接接口
错误示例
- 让前端传价格
- 抽奖结果由前端决定
注意事务的回滚
并发的处理
校验能放在前面的都放在前面
上传文件大小配置
spring boot上传文件大小
- 错误信息
FileUploadBase$FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 1048576 bytes
org.apache.tomcat.util.http.fileupload.impl.SizeLimitExceededException: the request was rejected because its size (579263821) exceeds the configured maximum (524288000)
# file
spring.servlet.multipart.enabled=true
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=100MB
参考:https://www.cnblogs.com/cnsyear/p/13043798.html SpringBoot的版本不同,这两个配置语句也不一样,具体版本对应如下
# Spring Boot 1.3 版本:
multipart.maxFileSize
# Spring Boot 1.4 版本和 1.5 版本:
spring.http.multipart.maxFileSize
# Spring Boot 2.0 版本:
spring.servlet.multipart.maxFileSize
nginx配置上传文件大小
#上传文件大小限制
client_max_body_size 1024M;
# 设置为on表示启动高效传输文件的模式
sendfile on;
# 保持连接的时间,默认65s
keepalive_timeout 1800;
删除操作,没有校验数据所属者
错误做法
- token 都不用传,直接删除
- 传 token,直接删除,没有校验用户的权限,没有校验数据的所属者,
token :用户登录后,后台返回的一个临时令牌。前端根据这个令牌,访问后端数据。后端根据这 token 校验用户身份。
正确做法
- 传 token ,删数据需要校验用户的权限
long 相乘
public static final long DEFAULT_MAX_SIZE = 2048 * 1024 * 1024;
猜一下上面的输出结果
正确写法:
// 直接写结果
public static final long DEFAULT_MAX_SIZE = 2147483648L;
大数相乘用 BigInteger
// 大数字相乘 用 BigInteger
BigInteger a = BigInteger.valueOf(2048)
.multiply(BigInteger.valueOf(1024))
.multiply(BigInteger.valueOf(1024));
mybatis 注入 排序字段
ProductMapper.xml
<select id="listProduct" resultType="com.hn.project.domain.database.Product">
select p.id, p.product_category_id, p.price,p.ot_price,p.product_name name,p.product_font_img img
from app_product p
where p.del_flag = 0 and p.publish_status = 1
order by #{oderBy},p.id asc
</select>
ProductMapper.java
List<Product> listProduct(@Param("oderBy")String orderBy);
发现用 #{oderBy} 排序无效,# 将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #{oderBy},如果传入的值是 id desc ,那么解析成sql时的值为order by “id desc”
解决方式:将 #{oderBy} 改成 ${oderBy}
通常,咱们的动态sql一般都会用#代替$,因为#可以防止sql注入问题。
但是在order by的字段里,如果继续用#,那么排序会无效。这个时候只能用$代替#。
#
将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #{user_id},如果传入的值是111,那么解析成sql时的值为order by “111”, 如果传入的值是id,则解析成的 sql 为order by “id”。$
将传入的数据直接显示生成在sql中。如:order by ${user_id},如果传入的值是111,那么解析成sql时的值为order by 111, 如果传入的值是id,则解析成的sql为order by id。#
方式能够很大程度防止sql注入。$
方式无法防止Sql注入。$
方式一般用于传入数据库对象,例如传入表名。- 一般能用
#
的就别用$
。
列表接口不要返回大文本数据
列表返回富文本,客户设置的内容比较大1.4M,接口请求时间2s左右