JAVAWEB——リクエスト、リクエストライン、リクエストヘッダー、リクエスト本文の取得、文字化けしたコードスキームの送信、リクエストドメイン、転送、リダイレクトの違いの解決

1.HttpServletRequestの概要

サーブレットを作成service()するときにメソッドをオーバーライドします。またはdoGet()/doPost()、これらのメソッドには2つのパラメーターがあります。1つは要求を表す要求で、もう1つは応答を表す応答です。

serviceメソッドのリクエストタイプはServletRequestであり、doGet / doPostメソッドのリクエストタイプはHttpServletRequestです。、HttpServletRequestは、より強力な関数とメソッドを備えたServletRequestのサブインターフェイスです。今日はHttpServletRequestを学習しています。

2.パケットキャプチャツールを使用してHttpリクエストを取得します

ここに写真の説明を挿入
リクエストはリクエストを表すため、このオブジェクトを介してHttpリクエストを取得できますリクエストラインリクエストヘッダーリクエスト本文

3つ目は、リクエストを通じてリクエストラインを取得する

クライアントのリクエストメソッドを取得します。String getMethod()

要求されたリソースを取得します。

  • String getRequestURL()
  • StringBuffer getRequestURL()
  • String getContextPath()---- Webアプリケーションの名前
  • String getQueryString()---- URLアドレスusername = zhangsan&password = 123を送信した後、パラメータ文字列を取得します

場合:

				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);

効果は次のとおりです。
ここに写真の説明を挿入
このアドレスはIPV6アドレスです。127.0.0.1に変更する場合は、コンピューターの構成を変更する必要があります。ローカルIPを表します。

4つ目は、リクエストを通じてリクエストヘッダーを取得する

  • long getDateHeader(String name)
  • String getHeader(String name)-指定されたヘッドを取得します
  • Enumeration getHeaderNames()-すべての頭の名前を取得します
  • Enumeration getHeaders(String name)
  • int getIntHeader(String name)

ケースナンバーワン:

新しいHeaderServletを作成し、次のように記述します

//1.获得指定的头,这里是获取USER-Agent也就是用户使用的浏览器
String header = request.getHeader("User-Agent");
System.out.println(header);
//2.获得所有的头的名称
Enumeration<String> headerNames =request.getHeaderNames();
while (headerNames.hasMoreElements()){
    
    
   String headerName =  headerNames.nextElement();
   String headerValue = request.getHeader(headerName);
   System.out.println(headerName+":"+headerValue);

効果は次のとおりです。
ここに写真の説明を挿入
ケース2:
form.htmlにタグを追加すると、アクセスするアドレスはケース1で記述されたHeadServletです。

<a href="/HeaderServlet">访问HeaderServlet资源</a>

この時点で、コンソールから表示できるすべてのリクエストヘッダーの情報を取得します

ここに写真の説明を挿入
TIPSの機能:リファラーヘッダー:訪問のソース機能:アンチリーチリンクは、リンクが私によって書かれたhtmlを介してアクセスされることを意味し、他の人が私のリンクされたWebページを使い込むのを防ぐことができます

ケース3:

盗難防止チェーンをマスターするには、小さなデモを作成します

最初のステップは、新しいnews.htmlを作成し、サーブレットにアクセスすることです。

body>
       <a href="/RefererServlet">纯手工山楂球</a>
</body>

2番目のステップは、アクセスチェーンを検出することです

public class RefererServlet extends HttpServlet {
    
    
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //对该新闻的来源进行判断
        String Header = request.getHeader("RefererServlet");
		if(Header !=null&&Header.startsWith("http://localhost")){
    
    
   		//从本人网站跳转过去,可以看新闻
		response.setContentType("text/html;charset=utf-8");
		response.getWriter().write("纯手中山楂球安全可食用");
        }
		else{
    
    
		response.getWriter().write("盗网站者,可耻");
      }
 }

5、リクエストを通じてリクエスト本文を取得します

リクエスト本文の内容が郵送で提出リクエストパラメータ、形式は次のとおりです。

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)

ケースナンバーワン:

ステップ1:新しいフォームを作成する

<form action="/ContentServlet" method="post">
    用户名:<input type="text" name="username"><br/>
    密码:<input type="password" name="password"><br/>
    爱好:<input type="checkbox" name="hobby" value="zq">足球
         <input type="checkbox" name="hobby" value="pq">排球
         <input type="checkbox" name="hobby" value="ppq">乒乒球
    <input type="submit" value="提交">
</form>

ステップ2:テキストボックスでそれぞれ単一の値と複数の値を取得します

public class ContentServlet extends HttpServlet {
    
    
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doGet(request,response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //1.获得单个表单值
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println(username+"   "+password);
        //2.获得多个表单的值
        String[]hobbys = request.getParameterValues("hobby");
        for (String hobby:hobbys){
    
    
            System.out.println(hobby);
        }
    }
}

効果は次のとおりです。
ここに写真の説明を挿入

  • Enumeration getParameterNames()(まれに使用されます)
  • Map<String,String[]> getParameterMap()(一般的に使用されます)
    注:クライアントからサーバーに送信されるパラメーターはすべて文字列です
    ケース2:

この時点で、上記のサーブレットの横に書き込みを続けます

//3.获取所有的请求参数的名称
Enumeration<String> parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements()){
    
    
    System.out.println(parameterNames.nextElement());
}
System.out.println("+++++++++++++++++++++++++++++++++++");
//4.获得所有的参数 参数封装到一个Map<String,String[]>
Map<String,String[]> parameterMap = request.getParameterMap();
for (Map.Entry<String,String[]> entry:parameterMap.entrySet()){
    
    
    System.out.println(entry.getKey());
    for(String str:entry.getValue()){
    
    
        System.out.println(str);
    }
    System.out.println("+++++++++++++++++++++++++++++++++++");
}

効果は次のとおりです。
ここに写真の説明を挿入

6、文字化けしたコードを送信するソリューション

  • 解決する投稿後の方法文字化け:
    request.setCharacterEncoding("UTF-8");
  • 解決する提出する文字化け:
    parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");

リクエストの他の7つの機能

  1. リクエストはドメインオブジェクトです
  • setAttribute(String name, Object o)
  • getAttribute(String name)
  • removeAttribute(String name)

注:リクエストフィールドの範囲:リクエスト内

ケースナンバーワン:

目的はリクエストのドメインに精通しています。情報をServlet1のコンテンツに保存し、Servlet2で取得します。

最初のステップは、新しいServlet1を作成することです

@WebServlet(name = "Servlet1",urlPatterns
="/Servlet1")
public class Servlet1 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //向request域中存储数据
        request.setAttribute("name","tom");
        RequestDispatcher dispatcher =  request.getRequestDispatcher("/Servlet2");
        //执行转发的方法
        dispatcher.forward(request,response);
    }
}

ステップ2:Servlet2を作成する

@WebServlet(name = "Servlet2",urlPatterns
="/Servlet2")
public class Servlet2 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
       //从request域中取出数据
        Object attribute =   request.getAttribute("name");
        response.getWriter().write("123w45"+attribute);
    }
}

効果は次のとおりです。
ここに写真の説明を挿入
注:この時点でWebサイトにServlet1と入力すると、彼はそれを転送し、コンテンツは、リクエストの次のコンテンツであるServlet2のコンテンツにジャンプして転送します。次に、サーブレットでのリクエストを一度理解するように注意してください。すべてのリソースを取得できます。

  1. 完全なリクエスト転送をリクエストする

Get request forwarder ---- pathは転送されたアドレスです

  • RequestDispatcher getRequestDispatcher(String path)
    フォワーダーオブジェクトを介して転送
  • requestDispathcer.forward(ServletRequest request, ServletResponse response)

ケース2:

目的:ケース1とほぼ同じように、リクエスト転送のコンテンツに習熟するために、Servlet1とServlet2を作成し、コンテンツをServlet1からServlet2に転送します。

最初のステップ:Servlet1を作成します。

@WebServlet(name = "Servlet1",urlPatterns ="/Servlet1")
public class Servlet1 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //Servlet1将请求转发给Servlet2 此处新建一个转发器
        RequestDispatcher dispatcher =  request.getRequestDispatcher("/Servlet2");
        //执行转发的方法
        dispatcher.forward(request,response);
    }
}

ステップ2:サーブレットを作成する

@WebServlet(name = "Servlet2",urlPatterns ="/Servlet2")
public class Servlet2 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        response.getWriter().write("123w45");
    }
}

効果は次のとおりです
。このとき、Servlet1にアクセスすると、Servlet2の内容が表示されます。
ここに写真の説明を挿入

8、リクエストに関するいくつかの注意事項

1. ServletContextドメインとRequestドメインのライフサイクルを比較しますか?

ServletContext:

  • 作成:サーバーの起動
  • 破棄:サーバーのシャットダウン
  • ドメインの範囲:Webアプリケーション全体

リクエスト:

  • 作成:訪問時にリクエストを作成
  • 破棄:応答要求の終わりが破棄されます
  • ドメインの範囲:リクエスト内

2.クライアントアドレスとサーバーアドレスの書き方は?

  • クライアントアドレス:
  • クライアントがサーバーにアクセスするアドレス、サーバーの外部のアドレス、
  • 機能:Webアプリケーション名を書く
  • アクセス方法:リダイレクト
  • サーバーアドレス:
  • サーバーの内部リソースのジャンプアドレス、
  • 機能:Webアプリケーションの名前を書く必要はありません
  • アクセス方法:転送

3.転送とリダイレクトの違いは?

  • リクエストを2回リダイレクトし、リクエストを1回転送します
  • リダイレクトアドレスバーのアドレスが変更され、転送アドレスは変更されません
  • リダイレクトは外部のWebサイトにアクセスできます転送は内部リソースにのみアクセスできます
  • 転送パフォーマンスはリダイレクトよりも優れています

おすすめ

転載: blog.csdn.net/Mr_GYF/article/details/109153716