Java网络编程基础

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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值