Servlet&JSP-HTTP報文頭獲取及應用


完整代碼請參考:https://github.com/devway9/java-exercise/tree/master/servlet-jsp

目錄

  • 1 HttpServletRequest獲取報文頭  
  • 2 獲取URL的方法
  • 3 常用報文頭獲取
  • 4 發送壓縮的Web頁面

正文

1 HttpServletRequest獲取報文頭
  1) 報文頭是由瀏覽器產生的,不同的瀏覽器會返回不同的信息。可以使用HttpServletRequest的方法獲取。

2 獲取URL的方法
  1) getRequestURL:獲取完整的URL。
  2) getRequestURI:返回主機和端口后,請求參數前的部分。即web項目的根路徑+請求地址
  3) getContextPath:web項目的根路徑,即部署的項目名。
  4) getServletPath:不包含項目名的請求地址。(不包含web項目跟路徑)
  5) getQueryString:獲取請求參數,僅支持GET方法。

     private void testPath(HttpServletRequest req, HttpServletResponse resp) {
        // 訪問地址為http://localhost/servlet/testHeader?name=Jack&age=20&sex=M
        StringBuffer url = req.getRequestURL(); //http://localhost/servlet/testHeader
        println("完整的URL地址為:" + url);

        String uri = req.getRequestURI(); // /servlet/testHeader
        println("URI地址(返回主機和端口后,請求參數前的部分):" + uri);

        String contextPath = req.getContextPath(); // /servlet
        println("項目的根路徑contextPath:" + contextPath);

        String servletPath = req.getServletPath(); // /testHeader
        println("不包含項目名的地址servletPath:" + servletPath);

        String queryString = req.getQueryString();
        println("請求參數(僅支持GET方法):" + queryString);
    }   

  

3 常用報文頭獲取
  1) getAuthType:獲取認證類型。
  2) getRemoteUser:獲取登陸用戶名。
  3) getContentLength:獲取正文內容長度,只適用於POST請求。
  4) getContentType:正文的MIME類型。
  5) getMethod:獲取請求方法類型(GET、POST等)。
  6) getProtocol:獲取請求的協議(如HTTP/1.1)。
  7) getHeaders:獲取單個報文頭的多個值。
  8) getHeaderNames:獲取所有的報文頭名稱。
  9) getCookies:獲取Cookie的信息(返回數組)。
  10) getHeader:獲取單個報文頭的值,比如resquest.getHeader("Accept"); 報文頭名字忽略大小寫。
    ① Accept:瀏覽器或其他客戶程序能夠處理的MIME類型,比如text/html。
    ② Accept-Charset:瀏覽器可接受的字符集。
    ③ Accept-Encoding:客戶端可以處理的編碼類型,比如gzip。
    ④ Accept-Language:瀏覽器期望的語言種類,比如zh-CN。
    ⑤ Authorization:身份標識信息。
    ⑥ Connection:客戶端是否能處理持續性HTTP連接,Keep-Alive表明可以使用。
    ⑦ Content-Length:獲取正文內容長度,只適用於POST請求。
    ⑧ Cookie:服務器發送給瀏覽器,后又有瀏覽器發送給服務器的內容,一般使用getCookies方法獲取。
    ⑨ Host:URL中的主機名和端口號。
    ⑩ If-Modified-Since:只有當所請求的內容在指定的日期之后又經過修改才返回它,否則返回304“Not Modified”應答。
    11 Referer:前一個頁面的URL。
    12 User-Agent:生成請求的瀏覽器或其他客戶程序,根據這個報頭,可以針對不同類型的瀏覽器返回不同的內容。注意在必要時才使用該標識進行判斷,該報文頭是可以進行偽造的。

 private void testHeaderMethod(HttpServletRequest req, HttpServletResponse resp) {
        String authType = req.getAuthType();
        println("認證類型:" + authType);

        String remoteUser = req.getRemoteUser();
        println("登陸用戶名:" + remoteUser);

        int contentLength = req.getContentLength();
        println("請求消息正文的長度:" + contentLength);

        String contentType = req.getContentType();
        println("正文的MIME類型:" + contentType);

        String method = req.getMethod();
        println("請求方法(GET、POST等):" + method);

        String protocol = req.getProtocol();
        println("協議:" + protocol);

        //獲取單個報文頭的多個值
        Enumeration<String> headers = req.getHeaders("accept-language");
        while (headers.hasMoreElements()) {
            println("accept-language:" + headers.nextElement());
        }

        //獲取所有報文頭名稱
        Enumeration<String> enums = req.getHeaderNames();
        println("所有HTTP頭部信息:");
        while (enums.hasMoreElements()) {
            String element = enums.nextElement();
            println(">>>" + element + "=" + req.getHeader(element));
        }

        //獲取Cookie
        Cookie[] cookies = req.getCookies();
        println("cookie的信息:");
        for (Cookie cookie : cookies) {
            println(">>>注釋:" + cookie.getComment());
            println(">>>域名:" + cookie.getDomain());
            println(">>>名字:" + cookie.getName());
            println(">>>適用的路徑:" + cookie.getPath());
            println(">>>值:" + cookie.getValue());
            println(">>>存活的時間:" + cookie.getMaxAge());
            println(">>>遵從的是否是安全協議::" + cookie.getSecure());
            println(">>>遵從的協議版本:" + cookie.getVersion());
        }
    }

      

4 發送壓縮的Web頁面
  1) 大多數瀏覽器都知道如何處理gzip壓縮的內容,因此服務器可以使用Gzip對文檔壓縮,瀏覽器自動解壓縮,對於較大的文本頁面,Gzip壓縮可以極大的節省網頁下載時間。
  2) 可以通過Accept-Encoding判斷瀏覽器是否支持Gzip。
  3) Servlet使用Gzip壓縮頁面進行傳輸:
    out = new PrintWriter(new GZIPOutputStream(resp.getOutputStream()));
    resp.setHeader("Content-Encoding", "gzip");

public class TestGzip extends BaseServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html");
        resp.setCharacterEncoding("UTF-8");

        if (isSupportGzip(req)) {
            out = new PrintWriter(new GZIPOutputStream(resp.getOutputStream()));
            resp.setHeader("Content-Encoding", "gzip");
        } else {
            out = resp.getWriter();
        }

        for (int i = 0; i < 100000; i++) {
            println(i + ":This is a test for gzip.");
        }

    }

    //判斷瀏覽器是否支持gzip壓縮
    private boolean isSupportGzip(HttpServletRequest req) {
        String acceptEncoding = req.getHeader("Accept-Encoding");
        if (acceptEncoding != null && acceptEncoding.contains("gzip")) {
            return true;
        }
        return false;
    }

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM