天天看點

Java 技術篇 - 前端浏覽器發送一次url請求後端ServerSocket接收到兩次請求原因及解決方法,GET /favicon.ico HTTP/1.1問題處理

效果圖如下:

Java 技術篇 - 前端浏覽器發送一次url請求後端ServerSocket接收到兩次請求原因及解決方法,GET /favicon.ico HTTP/1.1問題處理
前端發送一次請求,後端接收到兩次,第二次是:

GET /favicon.ico HTTP/1.1

可以看到頁簽上标題欄前面是個地球,這個是預設的。

原因就是背景給的響應裡沒有指定這個圖示,他再請求一次,就是請求這個資源。

Java 技術篇 - 前端浏覽器發送一次url請求後端ServerSocket接收到兩次請求原因及解決方法,GET /favicon.ico HTTP/1.1問題處理
解決方法,在響應裡加上這個元素,指定下圖示内容:

<link rel="shortcut icon" href="https://g.csdnimg.cn/static/logo/favicon32.ico" type="image/x-icon" />

其中

https://g.csdnimg.cn/static/logo/favicon32.ico

這個是 csdn 網站上的圖示,具體的可以自己來指定。

修改後再次測試:

Java 技術篇 - 前端浏覽器發送一次url請求後端ServerSocket接收到兩次請求原因及解決方法,GET /favicon.ico HTTP/1.1問題處理
可以看到隻有一次請求了,而且頁簽前面也有圖示了。
Java 技術篇 - 前端浏覽器發送一次url請求後端ServerSocket接收到兩次請求原因及解決方法,GET /favicon.ico HTTP/1.1問題處理
測試代碼如下:

package com.test.test;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketTest {
    public static void main(String[] args) throws IOException {
        /*
         作用:接收浏覽器的請求并響應
        */

        // 建立服務,端口設定為10010
        ServerSocket server = new ServerSocket(10010);

        int k = 0;
        while(true) {

            // 阻塞式連接配接,當接收請求前保持阻塞
            Socket socket_client = server.accept();

            // 擷取輸入流
            InputStream in_put = socket_client.getInputStream();

            // 制作響應封包
            StringBuffer response = new StringBuffer();

            // 讀取請求内容
            BufferedReader input = new BufferedReader(new InputStreamReader(in_put,"GBK"));
            String url = input.readLine();

            if(url != null) {
                String url_new = java.net.URLDecoder.decode(url, "UTF-8");
                k = k + 1;
                System.out.println("\n循環次數:" + k);
                System.out.println(url_new);
            }

            // 響應頭部
            String response_head = "HTTP/1.1 200 OK\r\n" +
                    "Content-type:text/html\r\n\r\n";

            // 響應主體
            String response_body = "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">" +  // 解決亂碼問題
                    "<link rel=\"shortcut icon\" href=\"https://g.csdnimg.cn/static/logo/favicon32.ico\" type=\"image/x-icon\" />" +
                    "<style>body{font-family:\"黑體\"}</style>" +
                    "歡迎來到小藍棗的部落格<br>" +
                    "Welcome to xiaolanzao's blog!";

            response.append(response_head + response_body);

            // 擷取輸出流
            OutputStream out_put = socket_client.getOutputStream();

            // 将響應資料傳給輸出流
            out_put.write(response.toString().getBytes());

            // 關閉建立的對象
            out_put.close();
            in_put.close();
            socket_client.close();
        }
    }
}      

喜歡的點個贊❤吧!