娄二

Keep Hungry

request

1.HttpServletRequest概述

我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。

service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大,今天我们学习HttpServletRequest。

 

2.request的运行流程


3.通过抓包工具抓取http请求



因为request代表请求,所以我们可以通过该对象分别获得Http请求的请求行,请 求头和请求体

 

1.通过request获得请求行

获得客户端的请求方式:String getMethod()

获得请求的资源:

String getRequestURI()  :应用开始的地址,没有协议和本机地址部分

StringBuffer getRequestURL() :访问地址

String getContextPath() ---web应用的名称(webapps 下的此应用名)

String getQueryString() ---- get提交url地址后的参数字符串 username=zhangsan&password=123

 

注意:request获得客户机(客户端)的一些信息

request.getRemoteAddr() --- 获得访问的客户端IP地址

 实例:

public class LineServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        //1、获得请求方式
        String method = request.getMethod();
        System.out.println("method:"+method);
        //2、获得请求的资源相关的内容
        String requestURI = request.getRequestURI();
        StringBuffer requestURL = request.getRequestURL();
        System.out.println("uri:"+requestURI);
        System.out.println("url:"+requestURL);
        //获得web应用的名称
        String contextPath = request.getContextPath();
        System.out.println("web应用:"+contextPath);
        //地址后的参数的字符串
        String queryString = request.getQueryString();
        System.out.println(queryString);
        //3、获得客户机的信息---获得访问者IP地址
        String remoteAddr = request.getRemoteAddr();
        System.out.println("IP:"+remoteAddr);
        
        
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

结果:



2.通过request获得请求头

long getDateHeader(String name)

String getHeader(String name)

Enumeration getHeaderNames()

Enumeration getHeaders(String name)

int getIntHeader(String name)

 

referer头的作用:执行该此访问的的来源

做防盗链

 实例:

  public class HeaderServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获得指定的头
        String header = request.getHeader("User-Agent");
          System.out.println("header:"+header);
         //获得所有头的名称
        Enumeration<String> headerNames= request.getHeaderNames();
        while(headerNames.hasMoreElements()) {
            String headerName = headerNames.nextElement();
            String headerValue = request.getHeader(headerName);
            System.out.println(headerName+":"+headerValue);
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

抓包图:

结果图:



3.通过request获得请求体

请求体中的内容是通过post提交的请求参数,格式是:

username=zhangsan&password=123&hobby=football&hobby=basketball

key ---------------------- value

username [zhangsan]

password [123]

hobby [football,basketball]

 

以上面参数为例,通过一下方法获得请求参数:

String getParameter(String name) 

String[] getParameterValues(String name)

Enumeration getParameterNames()

Map<String,String[]> getParameterMap()

 

 

      注意:get请求方式的请求参数 上述的方法一样可以获得

 

      解决post提交方式的乱码:request.setCharacterEncoding("UTF-8");

      解决get提交的方式的乱码:

            parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");

1.request的其他功能

(1)request是一个域对象

request对象也是一个存储数据的区域对象,所以也具有如下方法:

setAttribute(String name, Object o)

getAttribute(String name)

removeAttribute(String name)

 

注意:request域的作用范围:一次请求中

(2)request完成请求转发

获得请求转发器----path是转发的地址

RequestDispatcher getRequestDispatcher(String path)

通过转发器对象转发

requestDispathcer.forward(ServletRequest request, ServletResponse response)


 实例:(  从一个servlet1 访问 servlet2 的内容)

Servlet1.java

public class Servlet1 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        // 想request域中存储数据
        request.setAttribute("name", "tom");

        // servlet1 将请求转发给servlet2
        RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet2");//因为在同一个web应用下,所以不需要写/WEB_request/servlet2
        // 执行转发的方法
        dispatcher.forward(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}


Servlet2.java

public class Servlet2 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().write("request转发到Servlet2 成功!");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}


效果:



//转发的  浏览器路径一直未变  

注意:ServletContext域与Request域的生命周期比较?

ServletContext

创建:服务器启动

销毁:服务器关闭

域的作用范围:整个web应用

request

创建:访问时创建request

销毁:响应结束request销毁

域的作用范围:一次请求中

 

注意:转发与重定向的区别?

1)重定向两次请求,转发一次请求

2)重定向地址栏的地址变化,转发地址不变

3)重新定向可以访问外部网站 转发只能访问内部资源

4)转发的性能要优于重定向

注意:客户端地址与服务器端地址的写法?

客户端地址:

是客户端去访问服务器的地址,服务器外部的地址,特点:写上web应用名

直接输入地址:

重定向

服务器端地址:

服务器内部资源的跳转的地址,特点:不需要写web应用的名称

转发

总结:

request获得行的内容

request.getMethod()

request.getRequestURI()

request.getRequestURL()

request.getContextPath()

request.getRemoteAddr()

request获得头的内容

request.getHeader(name)

request获得体(请求参数)

String request.getParameter(name)

Map<String,String[]> request.getParameterMap();

String[] request.getParameterValues(name);

注意:客户端发送的参数 到服务器端都是字符串

 

获得中文乱码的解决:

post:request.setCharacterEncoding(“UTF-8”);

get:

parameter = new String(parameter.getBytes(“iso8859-1”),”UTF-8”);

 

request转发和域

request.getRequestDispatcher(转发的地址).forward(req,resp);

request.setAttribute(name,value)

request.getAttribute(name)



阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25221835/article/details/79954851
个人分类: JAVAWEB
上一篇response
下一篇一些常见的cmd命令 (一直更新)
想对作者说点什么? 我来说一句

request使用request使用

2010年06月03日 112B 下载

Jsp的request的用法

2009年10月04日 29KB 下载

神州付支付接口php示例

2011年12月29日 4KB 下载

http request

2011年03月04日 24KB 下载

form builder develop

2009年02月23日 675KB 下载

QueryString.js

2008年04月10日 654B 下载

request python

2015年11月07日 470KB 下载

No Idocs Arrived from the Source System

2015年05月26日 154KB 下载

ASP二维码代码

2012年05月12日 8.52MB 下载

没有更多推荐了,返回首页

关闭
关闭