Http协议知识点总结

1. Http组成部分

tcp协议进行访问、二进制
同步概念:请求和响应 B/S架构
异步概念:服务器不需要及时响应给客户端,由服务器处理好结果后推送给客户端
HttpServerRequest

请求行
Request URL: https://zhidao.baidu.com/notice/get/ <!--请求地址-->
Request Method: GET  <!--请求方式-->
Status Code: 200 OK  <!--响应状态码-->
Remote Address: 220.181.107.200:443  <!--远程调用地址-->
Referrer Policy: unsafe-url  <!--上次访问URL-->
请求头
Accept: application/json, text/javascript, */*; q=0.01  <!--请求类型-->
Accept-Encoding: gzip, deflate, br <!--压缩格式-->
Accept-Language: zh-CN,zh;q=0.9 <!--语言编码格式-->
Connection: keep-alive <!--长连接-->
Cookie: m_lpvt_6859ce5aaf00fb00387e6434e4fcc925=1567135531
Host: zhidao.baidu.com
<!--请求来源,企业可以用来白名单、黑名单,防盗链-->
Referer: https://zhidao.baidu.com/question/2075467092661157468.html
<!--浏览器版本信息-->
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
X-ik-ssl: 1
X-Requested-With: XMLHttpRequest

自定义请求头?移动登录将token存放在请求头中
企业实际移动端登录案例

请求体

只有post请求时会把实体放在请求体中
响应200为向服务器请求资源,304为缓存使用本地资源。

HttpResponse

响应头、响应体

2. 防盗链----企业白名单和黑名单机制

a. 使用nginx反向代理解决防盗链
b. 反盗链机制:Java代码控制请求来源资源判断Referer
方式:项目写个过滤器过滤请求头的来源自断

@WebFilter(filterName = "ImgFilter",urlPatterns = "/img/*")
public class ImgFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("过滤器初始化...");
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("doFilter...");
        HttpServletRequest req=(HttpServletRequest)servletRequest;
        HttpServletResponse res=(HttpServletResponse)servletResponse;
        String referer = req.getHeader("referer");
        //请求服务名称
        String serverName = req.getServerName();
        System.out.println("referer"+referer+",serverName"+serverName);
        if(referer==null ||(referer.contains(serverName))){
            req.getRequestDispatcher("error.png").forward(req,res);
            return;
        }
        //放行
        filterChain.doFilter(req,res);
    }
    @Override
    public void destroy() {
    }
}

3. 重定向和转发原理分析

重定向请求两次,两次响应
转发请求一次,响应一次
重定向地址栏会变,转发不会变

转发过程:

客户端请求,服务端找到对应servlet并执行,执行后调用getRequestDispacther()转发请求给指定jsp文件。整个流程在服务端完成,一次请求一次响应。

重定向过程:

客服端请求,服务端找到对应servlet并执行,执行后调用response.senRedirect()返回响应,并告诉客户端让他再发一个请求访问jsp文件,然后得到一个新的响应,整个过程两次请求,两次响应。第一次请求为302请求,第二次请求为200请求。

4. 时间戳

每次发布版本,一定在js、图片上加上时间戳防止,解决缓存冲突问题。

5. 常见错误码

a. 404 URL地址错误
b. 500 系统错误
c. 403 参数错误
d. 302 重定向
e. 502 正在发布

6. http和https区别

https —>ssl+证书传输 — 非对称加密、证书加密
效率低,安全高,使用https没有证书的话网站会报错提示
http 不安全
http端口:80
https端口:443
抓包工具作用(fiddler):通过宽带连接,都可以通过抓包分析到请求。
a. 笔记本上创建一个wifi
b. 手机连接wif
post请求 浏览器看不到提交参数 抓包可以分析参数

7. HttpClient

public class HttpClientTest {
    static public void get() {
        try {
            //创建默认链接
            CloseableHttpClient httpClient = HttpClients.createDefault();
            //创建get请求
            HttpGet httpGet = new HttpGet("https://www.baidu.com/");
            CloseableHttpResponse response = httpClient.execute(httpGet);
            int code = response.getStatusLine().getStatusCode();
            //获取状态
            System.out.println("http请求结果" + code);
            if (code == 200) {
                System.out.println(EntityUtils.toString(response.getEntity()));
            }
            response.close();
            httpClient.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        get();
    }
}

8. 长连接和短连接

http1.0 属于短连接
http1.1 默认长连接,保留短连接
为什么有长连接?
短连接过程:
建立连接(三次握手)→数据传输→关闭连接(四次挥手)
长连接过程:
建立连接(三次握手)→数据传输→保持连接→数据传输→关闭连接(四次挥手)
效率高

长连接什么时候关闭?

a. 配置失效心跳检测时间,客户端没有继续建立连接,直接关闭
b. 浏览器配置参数后可以主动关闭
c. tomcat服务器配置长连接超市时间
长连接和短连接应用场景:
长连接:默认网站长连接、rpc远程调用、dubbo、netty、移动APP消息推送
短连接:调用接口,使用不是很频繁

9. 跨域解决方案

跨域:跨域其实是浏览器安全机制,请求访问的域名与ajax请求地址不一致,浏览器会直接无法返回请求结果。

a. jsonp 支持get请求不支持post请求
$.ajax({
    typt: "GET",
    async:false,
    url: "http://a.com/index",
    dataType: 'jsonp',
    jsonp:"jsonpCallback"
    success: function(data) {
        alert("获取结果:"+data["userName"]);
    },
    error:function(){
        alert("fail");
});

——

String userName=req.getParameter("userName");
JSONObject jsonObject=new JSONObject();
jsonObject.put("userName",userName);
String jsonpCallback=req.getParameter("jsonpCallback");
resp.getWriter().println(jsonpCallback+"("+jsonObject.toJSONString()+")");

jsonp原理:使用JavaScript发送get请求,传参数回调带回来解析。

b. 使用接口网关----spingcloud zull、nginx----互联网公司实际案例
c. httpclient内部转发
@WebServlet("/ToFromServlet")
public class ToFromServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建默认链接
        CloseableHttpClient httpClient = HttpClients.createDefault();
        //创建get请求
        HttpGet httpGet = new HttpGet("https://b.com/b/ToFromServlet?userName="+req.getParameter("userName"));
        CloseableHttpResponse response = httpClient.execute(httpGet);
        int code = response.getStatusLine().getStatusCode();
        //获取状态
        System.out.println("http请求结果" + code);
        if (code == 200) {
            String result=EntityUtils.toString(response.getEntity());
            resp.getWriter().print(result);
            System.out.println(result);
        }
        response.close();
        httpClient.close();
    }
}

——

$.ajax({
    typt: "GET",
    async:false,
    url: "http://a.com/index",
    dataType: 'json',
    success: function(data) {
        alert("获取结果:"+data["userName"]);
    },
    error:function(){
        alert("fail");
});

通过本地服务调用本地接口,然后内部进行转发调用其他服务接口
缺点:两次请求,不靠谱,浪费资源
优点:安全,不存在跨域安全,抓包分析不到

d. 添加header请求允许访问
resp.setHeader("Access-Control-Allow-Origin","*");

10. 表单重复提交

造成原因:
网络延迟、刷新、提交成功后重新加载、回退
解决方法:
使用token
什么是token→令牌、有效期、唯一不重复的标识
token类似于sessionid

@WebServlet("/FromServlet")
public class FromServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String token= UUID.randomUUID().toString();
        req.getSession().setAttribute("token",token);
        req.getRequestDispatcher("from.jsp").forward(req,resp);
    }
}

原理:
客户端请求来到表单验证页面,session中存入了token值,表单input中存放session值
第一次提交表单,通过判断

req.getParameter("sessionToken");
req.getSession().getAttribute("token");

两值是否相等,如果相等保存数据,并删除session值
重复提交表单后判断结果是不相等,返回友好提示不要重复提交

11. 防止模拟http请求

a. 使用令牌—好处 唯一性 只能有一次请求
知道token方式知道后,如果杜绝被模拟请求
程序使用验证码
token+验证码能杜绝模拟http请求

ps: 单纯记录自己所学记录------------仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值