request

1. 获取客户端IP、获取请求方式、获取Agent

       String addr=request.getRemoteAddr();
       System.out.println("IP:"+addr);
       String method=request.getMethod();
       System.out.println("method:"+method);
       String agent=request.getHeader("User-Agent");
       response.setCharacterEncoding("utf-8");
       if(agent.toLowerCase().contains("chrome")){
           response.getWriter().print("您使用的是谷歌浏览器");
       }else if(agent.toLowerCase().contains("firefox")){
           response.getWriter().print("您使用的是火狐浏览器");
       }else{
           response.getWriter().print("我猜您使用的是IE浏览器");
       }

2. request的各种get

        String scheme=request.getScheme();    // http
        String context=request.getContextPath(); // /jsp
        String server=request.getServerName(); //   localhost
        int port=request.getServerPort(); // 8080
        response.getWriter().print("scheme:"+scheme+"<br>");  
        response.getWriter().append("context:"+context+"<br>")
        .append("server:"+server+"<br>")
        .append("port:"+port+"<br>")
        .append("getservletpath:"+request.getServletPath())   //    /RBservlet
        .append("querystring:"+request.getQueryString())   //请求是http://localhost:8080/jsp/RBservlet?chen=133结果是:chen=133
        .append("uri:"+request.getRequestURI()+"<br>") //   /jsp/RBservlet
        .append("URL:"+request.getRequestURL());  //http://localhost:8080/jsp/RBservlet

3. request的Referer请求头完成防盗链

Referer可以统计访问是从哪里来的

防盗链:如果请求不是通过本站的超链接发出去,发送状态码404

       String referer=request.getHeader("Referer");
       System.out.println(referer);
       if(referer==null){  //如果是直接在浏览器里输入的http://localhost:8080/jsp/RCservlet不会有referer必须通过超链接
           response.sendRedirect("http://www.baidu.com");
       }else if(referer.contains("localhost")){
           response.getWriter().print("hello");
       }else {
           response.getWriter().print("127.0.0.1");
       }

发出请求http://localhost:8080/jsp/jsp/a.html
结果: 地址栏变成http://localhost:8080/jsp/RCservlet
页面显示hello,控制台输出 http://localhost:8080/jsp/jsp/a.html

发出请求http://127.0.0.1:8080/jsp/jsp/a.html
结果: 地址栏变成http://127.0.0.1:8080/jsp/RCservlet

发出请求http://localhost:8080/jsp/RCservlet或者
http://127.0.0.1:8080/jsp/RCservlet
结果:跳转到百度页面

4. request之获取请求参数

请求参数是客户端发送给服务器的

请求参数有可能是在请求体中(POST)、也有可能在URL之后(GET)
String getParameter(String name)
获取指定参数的请求参数值,使用与单值
如String name=request.getParameter(“username”);
String[] getParameterValues(String name) 获取指定名称的参数值,适用于多值
Enumeration getParameterNames() 获取所有请求参数名称
Map<字符串String,字符串数组String[]> getParameterMap()
获取所有请求参数,其中key为参数名,value为参数值
案例:超链接参数
案例:表单数据

RDservlet.java

  //1.得到URL携带的参数

  String x=request.getParameter("x");
  System.out.println("post-x:"+x);

   //2.得到表单的参数
    String username=request.getParameter("username");
   String password=request.getParameter("password");
   response.getOutputStream().print("username:"+username+"||password:"+password);

    //得到checkbox,jsp里name都是hobby,value随便写,如果选中就会有value的值,不选中就没有

   String[] hobby=request.getParameterValues("hobby");
   System.out.println(Arrays.toString(hobby));

   // 3.得到所有参数的键值

 Enumeration<String>   hs=request.getParameterNames();
   while(hs.hasMoreElements()){
       System.out.println(hs.nextElement());
   }
   // 4.map键值

   Map<String,String[]> map=request.getParameterMap();
     for(String s:map.keySet()){
         String[] value=map.get(s);
         System.out.println(s+"="+Arrays.toString(value));
     }
   }

b.jsp
b.jsp

5.请求和转发

请求转发和包含

RequestDispatcher rd=request.getRequestDispatcher(“/MyServlet”);
使用request获取RequestDispatcher对象,方法的参数是被转发或包含的Servlet的路径
请求转发:rd.forword(request,response)
请求包含:rd.include(request,response)

有时候一个请求需要多个Servlet协作才能完成,所以需要在一个Servlet跳到另一个Servlet

一个请求跨多个Servlet,需要使用转发和包含
请求转发:由下一个Servlet完成响应体!当前Servlet可以设置响应头!(留头不留体)
请求包含:由两个Servlet共同完成响应体(都留)
无论是请求转发还是请求包含,都在一个请求范围内!使用同一个request和response

5.1 请求转发
Forword.java

       System.out.println("AServlet");
       response.setHeader("aaa", "AAA");
       response.getWriter().print("hello forword");  //这个是输不出来的
       request.getRequestDispatcher("/ForwordTwo").forward(request, response);

ForwordTwo.java

 response.getWriter().print("forwordTwo");

发送请求http://localhost:8080/jsp/Forword
结果: 页面显示forwordTwo

所谓留头不留体

5.2请求包含
IncludeA.java

     response.setHeader("aa", "df");
     response.getWriter().print("IncludeA\n");               request.getRequestDispatcher("/IncludeB").include(request, response);

IncludeB.java

  protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       response.getWriter().print("IncludeB");
      }

发送请求http://localhost:8080/jsp/IncludeA
结果:IncludeA
IncludeB

所谓留头也留体

5.3 request域
实际上servlet中有三大域 request servlet application
void setAttribute(String name,Object value)
Object getAttribute(String name)
void removeAttribute(String name)
同一请求范围内使用同一个servlet调用request.setAttribute()、后一个servlet调用getAttribute()

6. 请求转发和重定向的区别

  • 重定向是response对象

  • 重定向发生了两次请求两此响应,浏览器地址会改变

  • 重定向不止重定向到本项目其他资源,还能定向到其他项目,比如百度

  • 重定向要给出requestURI,即包含项目名


  • 转发是request对象

  • 转发发生了一次请求一次响应,浏览器地址不改变

  • 请求转发只能转发到本项目中其他

  • 请求转发是服务器行为,只需要给出转发的servlet路径

    请求转发的效率高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值