功能介绍
pom.xml–项目坐标,用于信息的描述;引入jar包;构建项目,是项目级别的配置文件。
web.xml–相当于一个容器,主要是用来注册你写的那些功能,像一些servlet despatcher filter 等等。每定义了一个注册的功能,都加一个mapping与之对应。
学习目标
1.横向越权、纵向越权安全漏洞
横向越权:攻击者尝试访问与他拥有相同权限的用户的资源
eg:如果忘记密码重设时,不传入forgettoken这个值,则对任意用户都可以随便重置密码,导致横向越权。
纵向越权:低级别攻击者尝试访问高级别用户的资源
2.MD5明文加密及增加salt值
3.Guava缓存使用
4.高复用服务响应对象的设计思想及抽象分类
三个属性:status;msg;data
5.Mybatis-plugin使用技巧
6.Session的使用
7.方法局部演进
数据表设计
接口设计
前台用户接口设计
https://gitee.com/imooccode/happymmallwiki/wikis/%E9%97%A8%E6%88%B7_%E7%94%A8%E6%88%B7%E6%8E%A5%E5%8F%A3?sort_id=9917
后台用户接口
https://gitee.com/imooccode/happymmallwiki/wikis/%E5%90%8E%E5%8F%B0_%E7%94%A8%E6%88%B7%E6%8E%A5%E5%8F%A3?sort_id=9912
登录接口
@ResponseBody注解:返回时自动通过SpringMVC的jackson插件让我们的返回值序列化成json。
通过泛型做一个通用的数据响应对象ServerResponse
该对象作用的解释:
https://www.cnblogs.com/chc24w/p/10299305.html
https://www.cnblogs.com/Tiancheng-Duan/p/11363437.html
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
//保证序列化json的时候,如果是null的对象,key也会消失
public class ServerResponse<T> implements Serializable {
private int status;
private String msg;
private T data;
private ServerResponse(int status){
this.status = status;
}
private ServerResponse(int status,T data){
this.status = status;
this.data = data;
}
private ServerResponse(int status,String msg,T data){
this.status = status;
this.msg = msg;
this.data = data;
}
private ServerResponse(int status,String msg){
this.status = status;
this.msg = msg;
}
@JsonIgnore
//使之不在json序列化结果当中
public boolean isSuccess(){
return this.status == ResponseCode.SUCCESS.getCode();
}
public int getStatus(){
return status;
}
public T getData(){
return data;
}
public String getMsg(){
return msg;
}
public static <T> ServerResponse<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);
}
MyBatis在传递多个参数时,需要用到param注解。
流程:先用UserMapper写接口数据,再在UserMapper.xml中用sql语句实现,然后用UserServiceImpl调用xml中的内容,然后在service接口IUserService中声明,然后把Service注入到controller上供controller调用。
退出登录接口
只要在controller层删除Session,不需要涉及到Service层。
注册登录接口
可以通过一个内部的接口类,把我们的常量进行分组,将普通用户和管理员分开。
获取用户登录信息,忘记密码,提示问题与答案,重置密码功能开发
在客户端用户登录时忘记密码,需要找回密码,通过正确输入找回密码答案来访问服务端的修改密码接口。为了防止恶意用户来直接访问修改密码接口,在调用验证答案接口后采用token机制来验证身份,并用Guava Cache做一个定时的token来保证安全性。
项目中的Token,主要用做身份验证。
1、点击忘记密码之后,检验用户名是否存在
2、存在则根据用户名查询问题
3、回答答案正确的话生产Token,并将其放到guava cache本地缓存中
4、将Token返回给客户端
Guava Cache是单个应用运行时的本地缓存。它不把数据存放到文件或者外部服务器上。简单强大、及轻量级。不需要配置文件,使用起来和ConcurrentHashMap一样简单,而且能覆盖绝大多数使用cache的场景需求.
使用token机制的身份验证方法,在服务器端不需要存储用户的登录记录。大概的流程:客户端使用用户名和密码请求登录。服务端收到请求,验证用户名和密码。验证成功后,服务端会生成一个token,然后把这个token发送给客户端。客户端收到token后把它存储起来,可以放在cookie或者Local Storage(本地存储)里。客户端每次向服务端发送请求的时候都需要带上服务端发给的token。服务端收到请求,然后去验证客户端请求里面带着token,如果验证成功,就向客户端返回请求的数据。
用户相关的接口全部改为用POST提交。
参考文献:https://blog.youkuaiyun.com/qq_28021299/article/details/80541755