ServletからのURLアクセス時のHEAD情報について

このQ&Aのポイント
  • Servletから他のURLにアクセスし、送信したRequestのHEAD情報と受信したResponseのHEAD情報と受信本文のログを保存する方法について教えてください。
  • 現在、HttpURLConnectionクラスを使用していますが、送受信情報がクラスに隠蔽されてしまっているため、送信する電文そのものを表示することができません。
  • 上記の送信Requestと受信Responseを扱う方法についてのアドバイスをいただきたいです。
回答を見る
  • ベストアンサー

ServletからのURLアクセス時のHEAD情報について

こんにちは、yakatoと申します。 現在、Servletから他のURLにアクセスし、送信したRequestのHEAD情報と受信したResponseのHEAD情報と受信本文のログを保存しようとしています。 今の所、HttpURLConnectionクラスを使用しているのですが、送受信情報がクラスに隠蔽されてしまっているようで、以下のように送信している電文そのものを表示する事が出来ません。 GET http://*********.com/*****.htm HTTP/1.1 \r\n Host: *********.com \r\n User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) \r\n     .     .     . \r\n このような形式で送信Requestと受信Responseを扱う方法をご存知でしたらご教授下さい。 よろしくお願い致します。

  • Java
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • mura333
  • ベストアンサー率42% (3/7)
回答No.1

ちょっと自信がないのですが、HttpURLConnectionではResponseは取れるのですが、Requestが取れません(やり方が悪いのかもしれませんが)。 Responseのやり方は、getHeaderFieldKeyとgetHeaderFieldで取れました。しかし、getRequestPropertiesでRequestが取れると思ったのですが、取れませんでした。 これだと解決できないので、Jakarta Commons HttpClientを使うことはできますか? コードの断片を載せますので、参考にしてください。 HttpClient client = new HttpClient(); client.getHostConfiguration().setHost(hostName, port, schemeName); HttpMethodBase method = new GetMethod(pageName); client.executeMethod(method); System.out.println("----------"); Header[] reqs = method.getRequestHeaders(); for (int i=0; i<reqs.length; i++) { System.out.print(reqs[i].toString()); } System.out.println("----------"); Header[] resps = method.getResponseHeaders(); for (int i=0; i<resps.length; i++) { System.out.print(resps[i].toString()); } System.out.println("----------");

参考URL:
http://jakarta.jp/commons/httpclient/
yakato
質問者

お礼

ありがとうございます。 お返事遅くなってすみません。 ご教授頂いたコードを実行した所、Request・Response共に取得する事が出来ました。 HeaderやQueryStringの扱いもHttpURLConnectionと比べて使いやすいので利用しようと思います。 本当にありがとうございました。

関連するQ&A

  • HTTPステータス 404 - /servlet/Testが表示される

    はじめまして。Javaの初心者です。 どうしてもわからないことがあります。それは、 最初にTest.jspを実行して送信ボタンを押すと、 サーブレットからforwardされてきた「あああああ」 が表示されるのですが、再び送信ボタンを押すと、 「HTTPステータス 404 - /servlet/Test」が表示 されます。なぜなのでしょうか?また、どのようにす れば、404エラーを出すことがなく実行できるのが どうか教えてください。お願いします。 ************************************************* <%-- Test.jsp --%> <%@ page contentType="text/html; charset=Shift_JIS" %> <html> <head> <title>Test</title> </head> <body> <form method="POST" action="/servlet/Test"> <input type="submit" name="submit" value="送信"/><br/> </form> <% if(request.getParameter("submit") != null) { %> <hr/> <%= (String)request.getAttribute("b") %> <% } %> </body> </html> ************************************************* import java.io.IOException; import javax.servlet.*; import javax.servlet.http.*; public final class Test extends HttpServlet { public void doPost ( HttpServletRequest request, HttpServletResponse response ) throws IOException,ServletException { request.setAttribute("b","あああああ"); ServletContext sc = this.getServletContext(); RequestDispatcher rd = sc.getRequestDispatcher("/Test.jsp"); rd.forward(request,response); } } *************************************************

    • ベストアンサー
    • Java
  • Headリクエスト、ディズパッチャについて

    以下、あるソフトウェアで、このような条件のときに不具合が出るという内容なのですが、理解できないのです。 wwwブラウザ等から、Http Headリクエストを送り、サーブレットが受けます。 リクエストオブジェクトをレスポンスオブジェクトをコンテナが生成します。 それを通じて、HttpServlet実装のdoHeadが呼び出され、その後、オーバーライドされたdoGetメソッドにリクエストオブジェクトとレスポンスオブジェクトが渡され(ここが疑問、doHeadをオーバーライドせずにこんなことができるのか?doHeadから明示的にdoGetを呼べばできそうだが、doHeadをオーバーライドしている場合は除くのだそうです) その渡されたリクエストオブジェクトとレスポンスオブジェクトをRequestDispatcherのfowardメソッドでディスパッチしようとするとレスポンスオブジェクトをHttpServletResponseFacadeにキャストしようとするのだが、実際にはNoBodyResponseである為キャストに失敗。java.lang.ClassCastExceptionが出る。 (1)HEADリクエストが出来ない HttpURLConnection.setRequestMethod("HEAD"); のようにしてURLに送ってみたのですが、 「ドキュメントにデータが含まれていません」 というエラーが出てしまいました。 htmlから<form name="form" method="head" action="URL">のようにした所、「Getメソッドが無いのにGetメソッドが呼ばれている」というエラーになってしまいました。 (2)doHeadを通過してdoGetに行くという図で示されているのですが、どういうことかわからないです。どうやって実現するのか? 何か思いつくことがあったら教えていただけると助かります。

    • ベストアンサー
    • Java
  • XMLのスコープの範囲を教えてください。

    1:<Response> 2: <header:Header xmlns:header="http://ABC"> 3:  <Args> 4:   <Arg key="User-Agent" value="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)">true</Arg> 5:  </Args> 6:  <Status>Success</Status> 7:  <StatusMsg /> 8: </header:Header> 9:</Response> 以上のようなXMLがあると、2行目のxmlns:header="http://ABCのスコープは、8行目まで全て続くと考えてよろしいのでしょうか? 私は、 1:<Response> 2: <header:Header xmlns:header="http://ABC"> 3:  <header:Args> ←変更 4:   <header:Arg key="User-Agent" value="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)">true</header:Arg>  ←変更 5:  </header:Args> ←変更 6:  <header:Status>Success</header:Status>  ←変更 7:  <header:StatusMsg />  ←変更 8: </header:Header> 9:</Response> もしくは 1:<Response> 2: <Header xmlns="http://ABC"> ←変更 3:  <Args> 4:   <Arg key="User-Agent" value="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)">true</Arg> 5:  </Args> 6:  <Status>Success</Status> 7:  <StatusMsg /> 8: </Header> ←変更 9:</Response> って書くのが普通ではないのかなと考えています。 どうかご教授お願いします。

    • ベストアンサー
    • XML
  • TomcatのServletについて

    TomcatのServletについて TomcatのServletでエラーが出て困っています。 エラーは405で、「HTTPのGETメソッドは、このURLではサポートされていません。」と表示されます。 このときのServletとweb.xmlは以下の通りです。 -----<Servlet>----------------------------------- public class MyServlet extends HttpServlet { private static final long serialVersionUID = 1L; public MyServlet() { // TODO Auto-generated constructor stub super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/plain; charset=windows-31j"); response.setCharacterEncoding("windows-31j"); PrintWriter writer = response.getWriter(); writer.println("log check"); } } -------------------------------------------------- -----<web.xml>----------------------------------- <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="true"> <display-name>Welcome to Tomcat</display-name> <description> Welcome to Tomcat </description> <servlet> <servlet-name>Test</servlet-name> <servlet-class>servlet.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Test</servlet-name> <url-pattern>/test.do</url-pattern> </servlet-mapping> </web-app> -------------------------------------------------- テスト用のServletを動かしてみると、 エラーが出てしまって、どうすればいいか困っています。 なんとかご助言をお願いいたします。 まだまだ情報が足りないかもしれません。 そのようなご指摘もお願いいたします。 よろしくお願いいたします。

  • 【servlet】フォワードを使った画面遷移

    java,サーブレット初学者です。表題の通り、フォワード を使って画面遷移を試みています。 以下のコードを記述しリンクをクリックすると確かに画面遷移はできるのですが、 フォワードが出来ているならURLの最後が【/Test1】になるのではないかと考えました。 ですが実際は【/NewFile2】となっているため、フォワードが出来ていないのかと思います。 どの様にしたら前者のような結果になるでしょうか。 ご教授頂きたいです。 サーブレット↓ package sample; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/Test1") public class Test1 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { RequestDispatcher br = request.getRequestDispatcher("html/NewFile2.html"); br.forward(request, response); } } 遷移前の画面↓ <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>テスト</title> </head> <body> <h2>sample</h2> <p>テストです</p> <a href ="/servlet_dayo/html/NewFile2.html">画面遷移する</a> </body> </html> 遷移先↓ <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>テスト</title> </head> <body> <p>遷移先</p> </body> </html> サーバー:Tomcat8.5 os:macos を使用しています。どうぞよろしくお願いします。 ※OKWAVEより補足:「Webシステム開発」についての質問です。

    • ベストアンサー
    • Java
  • Servletレスポンスデータの出力について

    段階的にレスポンスデータを出力する方法がもしあれば教えていただけますか? ただし、JavaScript、Appletは使ってはいけません。あくまでもservletまたはcore javaで実現可能かどうか。 Use Case: レスポンスデータを作成するのに何十秒またはそれ以上時間がかかる場合がある。作成済みのデータを少しでも早くユーザに返したい。例えば、リクエストを受け取るとすぐ以下のようなレスポンスデータを送信する <blink>データ作成中・・・</blink> その後、レスポンスデータを2,3回に分けて返す。 今までWebアプリをほとんど作ったことがないので、もし全然的はずれな質問でしたらお許しください。実現不可能な場合は仕様を変えるつもりでいます。よろしくお願いします。

    • ベストアンサー
    • Java
  • servletからjspへオブジェクトの配列情報を送る方法

    いつもお世話になっております。echo2002です。 さて、今回は以下のような処理を行いたいのですが、可能なのでしょうか? ”servletで作成したオブジェクトの配列をjspにforwardして表示させる” こんなような処理を考えています。 構成:FileListServletクラス, FileInfomationクラス, disp.jsp FileInfomationクラスではファイル名やファイルサイズなどの情報を持ち、 それぞれgetなどのアクセサメソッドを持つとします。 FileListServletクラスでの処理 FileInfomationクラスの配列を作成し、各情報をsetする。 HttpServletRequestにsetAttributeでFileInfomation情報を付加し、 disp.jspへforwardする。 ※以下の方法を考えています。 request.setAttribute("fileinfo1", fileinfo[0]); request.setAttribute("fileinfo2", fileinfo[1]); request.setAttribute("fileinfo3", fileinfo[2]); ・・・ (配列でsetAttributeできるのかわからなかったので、  とにかくファイルの数分setAttributeしてみました) getServletContext().getRequestDispatcher("/disp.jsp").forward(req, res) わからないこと: disp.jspでどのようにFileInfomationの情報を取得し、 内容を参照できるのかがよくわからないのです。 jspの暗黙オブジェクトrequestを使用して、request.getParameterをすると、 返ってくる値がStringのようなので、FileInfomationクラスにならないんですよね? 突っ込みどころ満載の質問かと思いますが、何かアドバイス頂ければと思います。 オブジェクトの配列をsetAttributeしてjspで読み出せる方法があれば、 それもご教授いただけますでしょうか。 よろしくお願いいたします。jsp難しいです・・・。

    • ベストアンサー
    • Java
  • JSPからServletへの遷移

    今回、eclipseで開発をすることになりました。 しかしながら、動的Webプロジェクトという使い慣れないプロジェクトでの作成を しなくてはならなくなり、混乱しています。 tomcatとWTPのことについては、先の質問で教えて頂き解決したのですが、 もう一つ困ったことがあったので、再度質問させて頂きます。 --------------------------------------- 環境 Windows7 Ultimate eclipse Indigo tomcat 5.5 --------------------------------------- まずは、JSPを作成し、それを実行し、ブラウザ上に表示することは出来ました。 その後にServletに<form action ="/test" method = "POST">という形で投げるのですが、 それがうまくいかず、404エラーが出てしまいます。 階層としては、JSPはSample(プロジェクト名)/WebContent/NewFile.jspに配置しています。 そして、Servletについては、Sample(プロジェクト名)/src/test/Test.javaに配置しています。 web.xmlについては、Sample(プロジェクト名)/WebContent/WEB-INF/web.xmlにあります。 まず、JSPのソースは以下の様に書かれています。 ----------------------------------------------------- <%@ page contentType="text/html;charset=Windows-31J" language="java"%> <%@ page pageEncoding="Windows-31J"%> <html> <head><title>タイトル</title></head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <%request.setCharacterEncoding("Windows-31J");%> <body> <form method="POST" action="/test"> <%--ここに処理を記述 --%> <input type = "submit" name="submit" value = "送信"> </form> </body> </html> ----------------------------------------------------- Servletについては、以下の様に、型だけ記述しています。 ----------------------------------------------------- package test; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class Test */ public class Test extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public Test() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } } ---------------------------------------------------- そして、web.xmlについては、以下の様に記述しています。 ---------------------------------------------------- <?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>SampleWeb</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>test</servlet-name> <servlet-class>test.Test</servlet-class> </servlet> <servlet-mapping> <servlet-name>test</servlet-name> <url-pattern>/test</url-pattern> </servlet-mapping> </web-app> ----------------------------------------------------- その状態で、JSPの中から <form action ="/test" method = "POST"> <input type ="submit" name = "submit" value="送信"> </form> とやっても、404が出てしまいます。 Java自体が久々で、根本的に間違っているかもしれませんが、 ご教授お願い致します。

    • ベストアンサー
    • Java
  • HTTPのリクエストヘッダを独自に生成する方法を教えてください。

    どうしても実現方法がわからずに困っています。 ぜひお力添えをお願いいたします。 HTTPのリクエストヘッダに User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) のような形で情報が入っていると思います。 これと同じように、独自で作った以下のようなものを入れたいのですが、何をどうすればよいのでしょうか。 uid: 1234 実行環境は、 OS:Windows2003サーバ Webサーバ:IIS その他にActivePerlがインストールされていますので、Perlを使うことが可能です。 不可能であるということがわかるだけでもありがたいです。 お知恵を拝借させてください。

  • 電文とは

    現在、プロジェクトでJavaで電文を取り扱うという話を聞いているのですが、イマイチピンと こないので質問させてください。 電文とは「通信プログラムで送受信されるデータ」という記述を某所でみたのですが 電文とはHTTP通信のことでしょうか。Webアプリでリクエストパラメータを送信するとXMLが responseとして返ってくる場合、これは電文のやりとりを行ったことになるのでしょうか。 HTTP通信でない電文はありますでしょうか。

    • ベストアンサー
    • Java