首页 > 编程知识 正文

电商的后端是什么意思,电商可以前后端分离吗

时间:2023-05-05 11:40:32 阅读:142243 作者:4843

代码量: 7300行

项目源地址

技术堆栈: javawebspringspringmvcmybatismysqlmavengit

1 .服务器端环境1.JDK2. vsftpd3. nginx4. MySQL5. Tomcat6. git7. maven8. redis

采用tomcat集群nginx的负荷分散是基于以下理由

服务器负载过重,在某些情况下,系统并发量过大,一台服务器无法承担用户的请求,因此必须构建服务器群集。 nginx负载平衡是指接收用户请求并将其转发到后台服务器群集上的每台计算机

2 .用户管理模块的知识点:

横向越权、纵向越权安全漏洞

横向越权:攻击者希望访问与他具有相同权限的用户

纵向越权:低级攻击者希望访问高级用户的资源

如何避免横向越权:以重设密码为例,如果您恢复了问题,且问题的答案一致,则可以执行充值操作。 此时被攻击者攻击的情况下,攻击者可以自由更改用户的密码。 因此,如果问题和答案一致,就将token传递给用户并保存在Guava缓存中,设置有效期。 如果用户想在有效期内更改密码,可以从Guava缓存中提取token并与用户token进行比对,如果匹配,则证明是本人的操作,可以进行修改

如何避免纵向越权:为每个用户设置他的角色,区分是普通用户还是管理员,进行特殊操作时,进行身份判断,确认角色是

MD5明文加密和salt值的增加

根据指定的函数将MD5加密密码(普通字符串)转换为复杂的序列。 例如,在注册时对用户的密码进行MD5散列处理并存储在数据库中,然后在登录时将用户输入的密码与数据库中的MD5密码进行比较。

如果不使用MD5加密,后台管理员会直接看到用户的密码,有进行恶意操作的风险。 使用MD5后,即使管理员看到MD5密码,也无法登录。 因为登录时必须输入MD5加密前的密码,但MD5密码是不可逆的,无法从MD5的值中得出原始密码的值。

增加盐值(salt)如果两个用户的密码相同,那么如果MD5的值也相同,那么一个用户知道另一个用户的密码。 增加伏特是在MD5中追加随机数,与各自的密码对应的MD5变得唯一

高复用服务响应对象的设计思想和抽象封装

package com.mmall.common; importorg.codehaus.fk DTN.annotate.JSON ignore; importorg.codehaus.fk DTN.map.annotate.JSON serialize; import java.io.Serializable;/* * @ authorwmddg 2019012364 */@在保证JSON serialize (include=JSON serialize.inclusion.non _ null ) /序列化JSON时私有数据; privateserverresponse (int status ) { this.status=status; } privateserverresponse (int status,T data ) { this.status=status; this.data=data; } privateserverresponse (int status,String msg,T data ) { this.status=status; this.data=data; this.msg=msg; } privateserverresponse (int status,String msg ) { this.status=status; this.msg=msg; }@JSONignore//JSON序列化结果中包含public boolean isSuccess () return this.status==response code.success.getcode ); } public int getStatus () { return status; }公共字符串getmsg () { return msg; }公共获取数据() { return data; }公共静态服务器

Response<T> createBySuccess(){ return new ServerResponse<T>(ResponseCode.SUCCESS.getCode()); } public static <T> ServerResponse<T> createBySuccessMessage(String msg){ return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(), msg); } public static <T> ServerResponse<T> createBySuccess(T data){ return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(), data); } public static <T> ServerResponse<T> createBySuccess(String msg, T data){ return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(), msg, data); } public static <T> ServerResponse<T> createByError(){ return new ServerResponse<T>(ResponseCode.ERROR.getCode(), ResponseCode.ERROR.getDesc()); } public static <T> ServerResponse<T> createByErrorMessage(String errorMessage){ return new ServerResponse<T>(ResponseCode.ERROR.getCode(), errorMessage); } public static <T> ServerResponse<T> createByErrorCodeMessage(int errorCode, String errorMessage){ return new ServerResponse<T>(errorCode, errorMessage); }} 3.分类管理模块

知识点:

如何设计及封装无限层级的树状数据结构递归算法的设计思想 4.商品模块

知识点:

FTP文件上传
流程:先将文件保存在tomcat服务器,然后通过FTP工具类将tomcat上的文件上传到FTP服务器上,最后将tomcat上的文件删除

SpringMVC文件上传

流读取Properties配置文件

package com.mmall.util;import org.apache.commons.lang3.StringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.IOException;import java.io.InputStreamReader;import java.util.Properties;/** * @author wmddg 2019012364 */public class PropertiesUtil { private static Logger logger = LoggerFactory.getLogger(PropertiesUtil.class); private static Properties props; static { String fileName = "mmall.properties"; props = new Properties(); try { props.load(new InputStreamReader(PropertiesUtil.class.getClassLoader().getResourceAsStream(fileName), "UTF-8")); } catch (IOException e) { logger.error("配置文件读取异常", e); } } public static String getProperty(String key){ String value = props.getProperty(key.trim()); if(StringUtils.isBlank(value)){ return null; } return value.trim(); } public static String getProperty(String key, String defaultValue){ String value = props.getProperty(key.trim()); if(StringUtils.isBlank(value)){ return defaultValue; } return value.trim(); }}

抽象POJO、BO、VO对象之间的转换关系及解决思路

joda-time的使用

package com.mmall.util;import org.apache.commons.lang3.StringUtils;import org.joda.time.DateTime;import org.joda.time.format.DateTimeFormat;import org.joda.time.format.DateTimeFormatter;import java.util.Date;/** * @author wmddg 2019012364 */public class DateTimeUtil { public static final String STANDARD_FORMAT = "yyyy-MM-dd HH:mm:ss"; public static Date strToDate(String dateTimeStr, String formatStr){ DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern(formatStr); DateTime dateTime = dateTimeFormatter.parseDateTime(dateTimeStr); return dateTime.toDate(); } public static String dateToStr(Date date, String formatStr){ if(date == null){ return StringUtils.EMPTY; } DateTime dateTime = new DateTime(date); return dateTime.toString(formatStr); } public static Date strToDate(String dateTimeStr){ DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern(STANDARD_FORMAT); DateTime dateTime = dateTimeFormatter.parseDateTime(dateTimeStr); return dateTime.toDate(); } public static String dateToStr(Date date){ if(date == null){ return StringUtils.EMPTY; } DateTime dateTime = new DateTime(date); return dateTime.toString(STANDARD_FORMAT); }} 5.购物车模块

知识点:

如何封装一个高复用购物车核心方法Bigdecimal解决浮点型商业运算中丢失精度的问题
因为用普通的数据类型进行运算时,会产生误差,后果很严重。而且BigDecimal的参数要传入字符串,而不是int,double,不然还是会产生误差package com.mmall.util;import java.math.BigDecimal;/** * @author wmddg 2019012364 */public class BigDecimalUtil { private BigDecimalUtil() { } public static BigDecimal add(double v1, double v2){ BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.add(b2); } public static BigDecimal sub(double v1, double v2){ BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.subtract(b2); } public static BigDecimal mul(double v1, double v2){ BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.multiply(b2); } public static BigDecimal div(double v1, double v2){ BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP); //四舍五入,保留2位小数 }} 6.收货地址模块

知识点:

SpringMVC数据绑定中对象绑定mybatis自动生成主键、配置和使用如何避免横向越权漏洞的巩固
比如每个人只能增删改查自己的收货地址,所以在进行增删改查前,先判断该userId和Shipping是不是一致 7.支付模块

知识点:

支付宝对接核心文档,调通支付宝支付功能官方Demo解析支付宝SDK对接源码RSA1和RSA2验证签名及加解密避免支付宝重复通知和数据校验生成二维码,并持久化到图片服务器外网穿透 8.订单模块

知识点:

设计实用、安全、扩展性强大的常量、枚举类mybatis批量插入

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。