尽量减少接口的交互

一定要是后端掌控全局,让前端无脑接接口

错误示例

  • 让前端传价格
  • 抽奖结果由前端决定

注意事务的回滚

并发的处理

校验能放在前面的都放在前面

上传文件大小配置

spring boot上传文件大小

  • 错误信息
  1. FileUploadBase$FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 1048576 bytes

image.png

  1. org.apache.tomcat.util.http.fileupload.impl.SizeLimitExceededException: the request was rejected because its size (579263821) exceeds the configured maximum (524288000)

不可忽略的bug - 图2

  1. # file
  2. spring.servlet.multipart.enabled=true
  3. spring.servlet.multipart.max-file-size=10MB
  4. spring.servlet.multipart.max-request-size=100MB

参考:https://www.cnblogs.com/cnsyear/p/13043798.html SpringBoot的版本不同,这两个配置语句也不一样,具体版本对应如下

  1. # Spring Boot 1.3 版本:
  2. multipart.maxFileSize
  3. # Spring Boot 1.4 版本和 1.5 版本:
  4. spring.http.multipart.maxFileSize
  5. # Spring Boot 2.0 版本:
  6. spring.servlet.multipart.maxFileSize

nginx配置上传文件大小

  1. #上传文件大小限制
  2. client_max_body_size 1024M;
  3. # 设置为on表示启动高效传输文件的模式
  4. sendfile on;
  5. # 保持连接的时间,默认65s
  6. keepalive_timeout 1800;

image.png

删除操作,没有校验数据所属者

错误做法

  • token 都不用传,直接删除
  • 传 token,直接删除,没有校验用户的权限,没有校验数据的所属者,

token :用户登录后,后台返回的一个临时令牌。前端根据这个令牌,访问后端数据。后端根据这 token 校验用户身份。

正确做法

  • 传 token ,删数据需要校验用户的权限

long 相乘

  1. public static final long DEFAULT_MAX_SIZE = 2048 * 1024 * 1024;

猜一下上面的输出结果

image.png

正确写法:

  1. // 直接写结果
  2. public static final long DEFAULT_MAX_SIZE = 2147483648L;

大数相乘用 BigInteger

  1. // 大数字相乘 用 BigInteger
  2. BigInteger a = BigInteger.valueOf(2048)
  3. .multiply(BigInteger.valueOf(1024))
  4. .multiply(BigInteger.valueOf(1024));

mybatis 注入 排序字段

ProductMapper.xml

  1. <select id="listProduct" resultType="com.hn.project.domain.database.Product">
  2. select p.id, p.product_category_id, p.price,p.ot_price,p.product_name name,p.product_font_img img
  3. from app_product p
  4. where p.del_flag = 0 and p.publish_status = 1
  5. order by #{oderBy},p.id asc
  6. </select>

ProductMapper.java

  1. List<Product> listProduct(@Param("oderBy")String orderBy);

发现用 #{oderBy} 排序无效,# 将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #{oderBy},如果传入的值是 id desc ,那么解析成sql时的值为order by “id desc”

解决方式:将 #{oderBy} 改成 ${oderBy}

通常,咱们的动态sql一般都会用#代替$,因为#可以防止sql注入问题。
但是在order by的字段里,如果继续用#,那么排序会无效。这个时候只能用$代替#。

  1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #{user_id},如果传入的值是111,那么解析成sql时的值为order by “111”, 如果传入的值是id,则解析成的 sql 为order by “id”。
  2. $将传入的数据直接显示生成在sql中。如:order by ${user_id},如果传入的值是111,那么解析成sql时的值为order by 111, 如果传入的值是id,则解析成的sql为order by id。
  3. #方式能够很大程度防止sql注入。
  4. $方式无法防止Sql注入。
  5. $方式一般用于传入数据库对象,例如传入表名。
  6. 一般能用#的就别用$

列表接口不要返回大文本数据

列表返回富文本,客户设置的内容比较大1.4M,接口请求时间2s左右