java 模拟浏览器请求url java获取浏览器请求地址_请求转发

/*
 *request-->封装了客户端所有的请求数据
 *请求行
 *请求头
 *空行
 *请求体(GET没体)
 *  http协议:请求协议中的数据都可以通过request对象来获取
 *  获取常用信息
 *      获取客户端IP 封IP request.getRemoteAddr()
 *      请求方法 request.getMethod() 可能是POST也可能是GET
 *  获取Http请求头 与http相关
 *      ***String getHeader(String name) 适用于单值头
 *      Int GetIntHeader(String name) 适用于单值Int类型的请求头
 *      long getDateHeader(String name) 适用于单值毫秒类型的请求头
 *      Enumeration<String> getHeaders(String name) 适用于多值请求头
 *  
 *  案例
 *      通过User-Agent识别用户浏览器类型
 *      防盗链 如果请求不是通过本站的超链接发出的发送错误状态码404 如果请求不是通过本站的超链接发出的 
 *发送错误状态码404 Referer这个请求头 表示请求的来源 
 * 获取请求URL
 *  http://localhost:8080/day04_02/AServlet?username=xxx&password=y
 *  String getSchema() 获取协议             http
 *  String getServerName() 获取服务器名   localhost
 *  String getServerPort() 获取服务器端口  8080
 *  String getContextPath() 获取项目名       /day04_02
 *  String getServletPath() 获取Servlet路径 /AServlet
 *  String getQueryString() 获取参数部分即问号后面的部分  username=xxx&password=y
 *  String getRequestURI() 获取请求uri 等于项目名+Servlet路径  /day04_02/AServlet
 *  String getRequestURL() 获取请求URL 等于不包含参数的整个请求路径  http://localhost:8080/day04_02/AServlet
 *  getRequestURL()+"?"+getQueryString() 完整路径

  *获取请求参数 请求参数是由客户端发送给服务器的 有可能是在请求体中(POST) 也可能是URL之后(GET)
 *  请求参数 有一个参数一个值的 还有一个参数多个值
 * String getParameter(String name) 获取指定名称的请求参数值 适用于单值请求参数
 * String getParameterValues(String name)获取指定名称的请求参数值 适用于多值请求参数
 * Enumeration<String> getParameterNames() 获取所有请求参数名称
 * Map<String,String[]> getParameterMap() 获取所有请求参数 其中key为参数名 value为参数值

 * 请求转发和请求包含
 *  RequestDispatcher rd = request.getRequestDispatcher("/MyServlet");
 * 使用request获取RequestDispatcher对象 方法的参数是被转发或包含的Servlet的Servlet路径
 *  请求转发 ** rd.forward(request.response);
 *  请求包含 rd.include(request.response);
 *有时一个请求需要多个Servlet协作才能完成 所以需要在一个Servlet中跳到另一个Servlet
 * 一个请求跨多个Servlet 需要使用转发和包含
 * 请求转发 由下一个Servlet完成响应体 当前Servlet可以设置响应头(留头不留体)[自己完成不了让其他人协作完成]
 * 请求包含 由两个Servlet共同来完成响应体(都留)
 * 无论是请求转发还是请求包含 都在一个请求范围内 使用同一个request和response
 *request域
 *  servlet中三大域对象 request、session、application都有如下三种方法
 *  void setAttribute(String name,Object value)
 *  Object getAttribute(String name)
 *  同一请求范围内使用request.setAttribute() request.getAttribute()来传值 前一个Servlet调用setAttribute()保存值后一个调用getAttribute
 *
 * 请求转发和重定向的区别
 *  请求转发是一个请求一次响应 而重定向是两次请求两次响应
 *  请求转发地址栏不变化 而重定向会显示后一个请求的地址
 *  请求转发只能转发到本项目其他Servlet 而重定向 不只能重定向到本项目的其他Servlet 还能定向到其他项目
 *  请求转发是服务器端行为 只需给出转发的Servlet路径 而重定向需要给出requestURI 即包含项目名
 *  
 * 请求转发和重定向 效率是转发高 因为是一个请求
 *   需要地址栏发生变化必须用重定向
 *   需要在下一个Servlet中获取request域中的数据 必须要用转发

 */
/*
         * 通过request来获取url的相关方法
         */
        response.getWriter().println(request.getScheme()+"<br/>");//获取请求协议
        response.getWriter().println(request.getServerName()+"<br/>");//获取服务器名称
        response.getWriter().println(request.getServerPort()+"<br/>");//获取服务器端口号
        response.getWriter().println(request.getContextPath()+"<br/>");//获取项目名称  最常用因为移动后的项目名不一定
        response.getWriter().println(request.getServletPath()+"<br/>");//获取servlet路径
        response.getWriter().println(request.getQueryString()+"<br/>");//获取参数部分
        response.getWriter().println(request.getRequestURI()+"<br/>");//获取请求URI
        response.getWriter().println(request.getRequestURL()+"<br/>");//获取请求URL
/*
     * 获取客户端的ip地址 获取请求方式 获取User-Agent 得到客户端的信息(操作系统 浏览器)
     */
String addr = request.getRemoteAddr();//获取客户端的IP地址
        System.out.println("IP "+addr);
        System.out.println("请求方式"+request.getMethod());//获取请求方式
        String userAgent = request.getHeader("User-Agent");//获取名为User-Agent的请求头
        System.out.println(userAgent);
        //是否包含Chrome 如果包含 说明用户使用的是google浏览器
        if(userAgent.toLowerCase().contains("chrome")) {
            System.out.println("好"+addr+"用了谷歌");
        }else if(userAgent.toLowerCase().contains("firefox")) {
            System.out.println("好"+addr+"用了火狐");
        }else if(userAgent.toLowerCase().contains("msie")) {//微软的ie
            System.out.println("好"+addr+"用了ie");
        }
/*
         *使用Referer请求头 防盗链 
         */
        String referer = request.getHeader("Referer");
        System.out.println(referer);
        if(referer==null || !referer.contains("localhost")) {
            response.sendRedirect("http://www.baidu.com");
        }else if(referer.contains("localhost")) {
            System.out.println("hello");
        }

a.html

<h1>测试请求参数</h1>

<a href="/day04_02/DServlet?x=xxx&y=YYY">abc</a>
<hr/>
<form action="/day04_02/DServlet" method="post">
    用户名 <input type="text" name="username"/>
    密码<input type ="password" name ="password"/>
    爱好<input type="checkbox" name = "ho" value="cf"/>吃饭
    <input type="checkbox" name="ho" value ="ss"/> 史诗
    <input type="submit" value="提交"/>
</form>
doGet{
  System.out.println("GET"+request.getParameter("x"));
  }
doPost{
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    //有缺陷 少用一点
    String[] ho = request.getParameterValues("ho");
    System.out.println(username+" "+password+"..."+Arrays.toString(ho));
    /*
    *测试获取所有请求参数的名称
     */
    Enumeration names = request.getAttributeNames();
    while(names.hasMoreElements()) {
    System.out.println(names.nextElement());
    }
    /*
     * 获取所有请求参数 封装到map中
     */
    Map<String,String[]> map = request.getParameterMap();
    System.out.println(map);
    for(String name:map.keySet()) {
    String[] values = map.get(name);
    System.out.println(name+"="+Arrays.toString(values));
    }
}