devway

https://github.com/devway9

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

完整代码请参考: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;
    }

  

posted on 2017-12-06 15:39  devway  阅读(1621)  评论(0编辑  收藏  举报