1.TCP/IP协议家族
OSI七层协议:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层
TCP三次握手(建立连接)和四次挥手(断开连接)
2.Http请求:他们之间通信是以报文的形式
客户端请求(Request):请求报文 = 请求头 + 空行 + 请求数据
Accept: 客户端可以处理的数据格式
Cookie:服务端的之前给我们的Cookie
服务端响应(Response):响应报文 = 响应头 + 空行 + 响应数据
Status Code 响应状态码
Content-Type: 响应返回的类型 (文本,utf-8)图片等等
Set-Cookie:服务端给我们的Cookie,要保存起来,下次带过去
3.Cookie 、Session、Token
- 3.1 都是用来做持久化处理的,目的就是让客户端和服务端相互认识。Http请求默认是不持久的没有状态的,谁也不认识谁
- 3.2 Cookie: 是存放在客户端的信息,这个信息是来自于服务器返回的信息, 下次请求带过去,如果用户离开网站后,如果Cookie已过期一般是会被清楚的。如果Cookie没过期下次访问网站还是会带过去。(相对危险)
- 3.3 Session: 是存放在服务器上面的客户端临时信息,用户离开网站是会被清除的。(相对安全,耗资源)
- 3.4 Token(App)”令牌”:用户身份的验证,有点类似于 Cookie ,相对来说更安全,一般流程:
- 3.4.1 客户端像服务端申请 Token
3.4.2 服务端收到请求,会去验证用户信息,签发一个 Token 给客户端,自己保存 Token
3.4.3 客户端收到 Token 会保存起来,每次请求带上 Token
3.4.4 服务器收到其他请求,会去验证客户端的 Token , 如果成功返回数据,不成功啥都不给
4. Http缓存
Cache-Control(缓存策略):Public、private、no-cache(也缓存)、max-age 、no-store(不缓存)
Expires(缓存的过期策略):指名了缓存数据有效的绝对时间,告诉客户端到了这个时间点(比照客户端时间点)后本地缓存就作废了,
在这个时间点内客户端可以认为缓存数据有效,可直接从缓存中加载展示。
参看大神https://mp.weixin.qq.com/s/qOMO0LIdA47j3RjhbCWUEQ
如果有缓存并且过期了那么发起请求,那么服务端会给我们数据?(不一定会给)服务器的数据没有变动就不会给,状态码会变为 304 ,自己拿之前过期的缓存
案例:登录和评论案例
BaseServlet:支持get和post
public abstract class BaseServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
onResponse(req,resp);
}
protected abstract void onResponse(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException ;
}
BaseJsonServlet:json数据转换
public abstract class BaseJsonServlet extends BaseServlet {
private static final long serialVersionUID = 1L;
@Override
protected void onResponse(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 支持UTF-8
resp.setContentType("text/html; charset=utf-8");
//处理子类
ResponseEntity responseEntity =null;
try {
responseEntity =onHandler(req,resp);
} catch (Exception e) {
// TODO Auto-generated catch block
responseEntity = new ResponseEntity();
}
PrintWriter printWriter = resp.getWriter();
String json = JSON.toJSONString(responseEntity);
printWriter.write(json);
printWriter.flush();
printWriter.close();
}
protected abstract ResponseEntity onHandler(HttpServletRequest req, HttpServletResponse resp)throws Exception;
}
ResponseEntity:数据格式
public class ResponseEntity {
public String code = "0011";
public String msg = "服务器发生异常";
public String data = "{}";
}
LoginServlet登录
@WebServlet("/LoginServlet")
public class LoginServlet extends BaseJsonServlet{
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
protected ResponseEntity onHandler(HttpServletRequest req, HttpServletResponse resp) throws Exception {
ResponseEntity responseEntity=new ResponseEntity();
responseEntity.code="0022";
responseEntity.msg="用户或者密码错误";
String userName=req.getParameter("userName");
if("peakmain".equals(userName)){
responseEntity.code="0000";
responseEntity.msg="登录成功";
UserInfoEntitiy infoEntitiy=new UserInfoEntitiy();
infoEntitiy.userName=userName;
infoEntitiy.userSex="男";
String jsonString = JSON.toJSONString(infoEntitiy);
//添加Cooker
Cookie cookie = new Cookie("userName", "peakmain");
//设置cookie过期时间
cookie.setMaxAge(20);
resp.addCookie(cookie);
}
return responseEntity;
}
}
用户评论:cookie没有过期则可以评论
@WebServlet("/UserCommentServlet")
public class UserCommentServlet extends BaseJsonServlet{
private static final long serialVersionUID = 1L;
@Override
protected ResponseEntity onHandler(HttpServletRequest req, HttpServletResponse resp) throws Exception {
ResponseEntity responseEntity=new ResponseEntity();
responseEntity.code="0033";
responseEntity.msg="评论失败,用户未登录";
Cookie[] cookies = req.getCookies();
if(cookies!=null){
for(Cookie cookie : cookies){
String name = cookie.getName();
if(name!=null){
responseEntity.code = "0000";
responseEntity.msg = "评论成功";
return responseEntity;
}
}
}
return responseEntity;
}
}
UserInfoEntitiy用户信息封装
public class UserInfoEntitiy {
public String userName;
public String userSex;
}