JavaサーブレットからGoogleの画像を取得する方法

このQ&Aのポイント
  • Javaサーブレットからgoogleへ接続し、googleのページをブラウザへ返す際、画像のパスが、サーブレットのURLに置き換わってしまう現象について説明します。
  • 画像のURLを取得する方法や、画像のパスをサーブレットのURLに置き換える方法についても解説します。
  • さらに、URL接続とデータの読み込み、書き込みの処理についても説明します。
回答を見る
  • ベストアンサー

Java サーブレット 画像

サーブレットからgoogleへ接続し、googleのページをブラウザへ返す際、画像のパスが、サーブレットのURLに置き換わってしまいます。 (現象↓) http://localhost:8080/intl/ja_jp/images/logo.gif (やりたいこと↓) http://img0.gmodules.com/ig/f/vcbK_2Vv3S8/intl/ALL_jp/logo.png 上記の(やりたいこと)ようにするには、どうしたら良いでしょうか。 URL url = new URL("http://www.google.co.jp/"); HttpURLConnection urlconn = (HttpURLConnection) url.openConnection(); BufferedInputStream in = new BufferedInputStream(urlconn.getInputStream()); ServletOutputStream sout = response.getOutputStream(); int data; while ((data = in.read()) != -1) { sout.write(data); } sout.close(); urlconn.disconnect();

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

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

  • ベストアンサー
  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

Googleはアクセスするブラウザによって ダウンロードするものが違うのよ。 そのため、USER-AGENTが未指定・または特定できない場合 こういう現象が起きるわ。 例えばInternetExplorerのUSER-AGENTを指定してあげれば 想定通りの結果を得られるわよ。 指定方法はURLConnectionに・・・ あ、調べれば判るからいらないわね。

muu731u
質問者

お礼

ご回答ありがとうございます。 ご指摘の通り、ユーザーエージェントを設定することで、 解決することができました! ありがとうございます。 urlconn.setRequestProperty( "User-Agent", userAgent );

関連するQ&A

  • HttpURLConnectionを使ったHTTP

    HttpURLConnectionを使ったHTTP通信について質問です。 POSTメソッドで、JSON形式のデータを送信しています。 送信先URLは自作のサーブレットです。 HTTP接続はできましたが、サーブレット側でJSON形式のデータをどのように取得すればよいかが分かりません。 JSON形式ではなく「p1=aaa&p2=bbb」のようなパラメータであれば、getParameter("p1")で取得できるのですが・・・ ソースの抜粋は以下の通りです。 <クライアント側>--------------------------------------------------- URL url = new URL("サーブレットのURL"); HttpURLConnection uc = (HttpURLConnection) url.openConnection(); uc.setDoOutput(true); uc.setRequestMethod("POST"); String postStr = "{\"id\": \"blog\"}"; OutputStream os = uc.getOutputStream(); PrintStream ps = new PrintStream(os); ps.print(postStr); ps.close(); InputStream is = uc.getInputStream(); ------------------------------------------------------------------- <サーブレット側>--------------------------------------------------- public void doPost(HttpServletRequest request, HttpServletResponse response)     throws IOException, ServletException {     // ここでpostStr の内容を取得したい! } ------------------------------------------------------------------- JAVAの知識が浅いため、分かりにくい質問になっていたらすいません。 ご存知の方、よろしくお願いします。

  • JavaでPOSTでデータ送信時のボディについて

    javaでHTTP通信をする際にメソッドをPOSTにしてボディにパラメータを設定する仕方がいまいちわかりません。 調べてみても、POSTはGETのようにURLに付加するのではなくボディ部に設定すればよいというのはわかったのですが。実際どういうソースで設定できるのか例が見つからなく困っています。 なんとなくの判断ですが、 message = "httpテスト"; URL url = new URL("http://~~~/xxx.html"); HttpURLConnection http = (HttpURLConnection)url.openConnection(); http.setRequestMethod("POST"); http.setDoOutput(true); http.setRequestProperty("Content-Type", "~~~"); http.setRequestProperty("Content-Length", Integer.toString(message.length())); ↓↓↓(1) BufferedWriter outer = new BufferedWriter(new OutputStreamWriter(http.getOutputStream())); outer.write(message); outer.flush(); outer.close(); ↑↑↑(1) http.connect(); 上記(1)の箇所でボディへの設定ができているのかなという判断をしているのですが、あっていますでしょうか?? よろしくお願いします。

    • ベストアンサー
    • Java
  • Javaを使ったチャットシステムについて

    はじめまして。 チャットシステムを作ろうと思い他の方が制作されたソースコードを拝見させて頂いたのですがよくわかりませんでした。 よろしければ教えて頂けないでしょうか? よくわからなかったのは読込・書込処理の部分です。 どういう流れで会話のやり取りが行われているのかよくわかりません。 例えば、Aさんが書き込んでBさんがその書き込みを見るまで、のような一連の流れです。 ・読込処理 URL wi_url = new URL(p_url+"chat1.cgi"); URLConnection wi_connect = wi_url.openConnection(); wi_connect.setDoInput(true); wi_connect.setDoOutput(true); wi_connect.setUseCaches(false); OutputStream wo_stream = wi_connect.getOutputStream(); BufferedWriter wo_buffer = new BufferedWriter(new OutputStreamWriter(wo_stream)); wo_buffer.write("read", 0, 4); wo_buffer.flush(); wo_buffer.close(); InputStream wi_stream = wi_connect.getInputStream(); BufferedReader wi_buffer= new BufferedReader(new InputStreamReader(wi_stream)); ・書込処理 URL wo_url = new URL(p_url+"chat2.cgi"); URLConnection wo_connect = wo_url.openConnection(); wo_connect.setDoOutput(true); wo_connect.setDoInput(true); wo_connect.setUseCaches(false); OutputStream wo_stream = wo_connect.getOutputStream(); BufferedWriter wo_buffer = new BufferedWriter(new OutputStreamWriter(wo_stream)); wo_buffer.write(w_data, 0, w_data.length()); wo_buffer.flush(); wo_buffer.close(); InputStream wi_stream = wo_connect.getInputStream(); BufferedReader wi_buffer = new BufferedReader(new InputStreamReader(wi_stream));

  • サーブレットについて

    public class Server extends HttpServlet { PrintWriter out; BufferedReader in; String s; public void doGet(HttpServletRequest req, HttpServletResponse res)throws ServletException,IOException { in = new BufferedReader(new InputStreamReader(req.getInputStream())); out = new PrintWriter(res.getOutputStream(),true); //文字列受信 s = in.readLine(); //送信 out.println(s); } } tomcatはマルチスレッドだと聞いたわけですが、このプログラムで、例えば、トムがアクセスしてきて、 s=in.readLine(); が実行されている間に2番目に接続してきたネコが out=new PrintWriter(); を実行してしまって out.println(s);で後から接続してきたネコに送信されるとゆうこともあるわけでしょうか?

    • ベストアンサー
    • Java
  • HttpURLConnection転送で漢字表示

    お世話になっております。 掲題の質問について、ご教示いただけないでしょうか。 【質問】 サーバーAのサーブレットA1より、 サーバーBのサーブレットB2へ漢字をPOSTしようとしています。 エンコードはサーブレットA1,B2ともにShift_JISを使用しています。 しかし、A1より送信した漢字のデータをB2で表示させると"?"になってしまいます。 どなたかサーブレットB2でもShift_JISとして、漢字表示させる方法をご教示ください。 【サーブレットA1の該当箇所】 URL url = new URL("サーブレットB2のURL"); HttpURLConnection conn = (HttpRLConnection) url.openConnection() ; conn.setRequestMethod("POST"); conn.setRequestProperty("Accept-Language","ja"); conn.setDoOutput(true); PrintWriter writer = new PrintWriter(new OutputStreamWriter(conn.getOutputStream() , "Shift_JIST") ; writer.print("data=漢字"); 【サーブレットB2の該当箇所】 public void doPost(HttpServletRequest req, HttpServletResponce resp){ try{ req.setCharacterEncoding("Shift_JIS"); resp.setContentType("text/html;charset=Shift_JIS"); System.out.println( req.geParameter("data") ); }catch(Exception e){ System.out.println(e); } } 以上、宜しくお願いいたします。

    • ベストアンサー
    • Java
  • httpsサイトからのhtmlソース取得

    以下のようなコードを書いてみましたところ、httpサイト (1) からはhtmlソースが全行取得できたのですが、httpsサイト (2) からは途中約1/3以降からしか得られませんでした。 ところが、httpsサイトでも (3) を試したところ全部取得できます。何がいけないのか~何を調べればよいのか~が分からず困惑しております。ご教示いただけましたら幸いです。 import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.net.URL; import java.net.HttpURLConnection; import javax.net.ssl.HttpsURLConnection; public class GetHtmlTest { public static void main(String[] args) { try { URL u = new URL("http://stocks.finance.yahoo.co.jp/stocks/detail/?code=2371.T"); // (1) HttpURLConnection con = (HttpURLConnection) u.openConnection(); // (1) InputStreamReader isr = new InputStreamReader(con.getInputStream(), "UTF-8"); // (1) // URL u = new URL("https://www.sbisec.co.jp/ETGate"); // (2) // HttpsURLConnection con = (HttpsURLConnection) u.openConnection(); // (2) // InputStreamReader isr = new InputStreamReader(con.getInputStream(), "SJIS"); // (2) // URL u = new URL("https://www.monex.co.jp/Login/00000000/login/ipan_web/hyoji"); // (3) // HttpsURLConnection con = (HttpsURLConnection) u.openConnection(); // (3) // InputStreamReader isr = new InputStreamReader(con.getInputStream(), "SJIS"); // (3) BufferedReader br = new BufferedReader(isr); String line; StringBuilder sb = new StringBuilder(); while ((line = br.readLine()) != null) { sb.append(line).append(System.getProperty("line.separator")); } System.out.println(sb.toString()); br.close(); isr.close(); } catch (IOException e) { e.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • Javaの問題について...

    import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.net.UnknownHostException; import javax.swing.JTextArea; public class html_getter { public static void main(String[] args){ Object o1 = null; try { o1 = new Getter5(new URL("http://www.google.com/")); } catch (MalformedURLException e) { e.printStackTrace(); } ((Getter5)o1).Show(); } } class Getter5{ private String charset = "Shift_JIS"; private JTextArea htmlArea; public Getter5(URL url){ htmlArea = new JTextArea(); try { URLConnection uc = url.openConnection(); BufferedInputStream bis = new BufferedInputStream(uc.getInputStream()); BufferedReader br = new BufferedReader(new InputStreamReader(bis, charset)); htmlArea.setText("");//初期化 String line; while ((line = br.readLine()) != null) { htmlArea.append(line + "\n"); } } catch (MalformedURLException ex) { htmlArea.setText("URLが不正です。"); ex.printStackTrace(); } catch (UnknownHostException ex) { htmlArea.setText("サイトが見つかりません。"); } catch (IOException ex) { ex.printStackTrace(); } } public void Show(){ System.out.println(htmlArea.getText()); } } このプログラムはURLの指定先からHTMLを取ってきて表示するプログラムなのですが、 これに「indexOfとString s1を使ってURLの指定先のHTMLから自分の入力した文字列があるかどうかを判断するプログラム」を作りたいのですがどうすれば作れるでしょうか?

  • javaについて

    こういうプログラムを組んだんですが、うまく実行できません。 どんな改善をしたらよいでしょうか? import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class Sample { public static void main(String[] args) { String htmlSrc = getHTMLSrc("http://search.yahoo.co.jp/search?p=java", "UTF-8"); htmlSrc = htmlSrc.replaceAll("<.+?>| ", ""); htmlSrc = htmlSrc.replaceAll(".*件-", ""); htmlSrc = htmlSrc.replaceAll("秒.*", "秒"); System.out.println(htmlSrc); } private static String getHTMLSrc(String strURL, String charSet) { StringBuffer sb = new StringBuffer(); HttpURLConnection conn = null; BufferedReader br = null; try { URL url = new URL(strURL); conn = (HttpURLConnection)url.openConnection(); InputStreamReader isr = new InputStreamReader(conn.getInputStream(), charSet); br = new BufferedReader(isr); String tmp = ""; while ((tmp = br.readLine()) != null) { sb.append(tmp); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (br != null) { br.close(); } if (conn != null) { conn.disconnect(); } } catch (IOException e) { e.printStackTrace(); } } return sb.toString(); } } 以下のエラーが表示されるんですが、どうしたらよいでしょうか?? 環境が悪いのでしょうか?? java.net.ConnectException: Operation timed out

    • ベストアンサー
    • Java
  • JAVAで、SSL通信

    現在、Javaで、別のサーバから、sslで、htmlファイルを 取得するプログラムを作成しようとしています。 環境と、プログラムは、以下のようになっております。 皆さんお忙しいと思いますが、なにとぞご教授お願いいたします。 【環境】 OS:Solaris8 WAS:WebSphere5.0 コンパイラ:WebSphere5.0に存在するコンパイラ 【プログラム】 import java.net.*; import java.io.*; import javax.net.ssl.*; public class JSSETEST2 { public static void main(String[] args) { try { URL url = new URL("https://www.kamata.com/"); HttpsURLConnection conection = (HttpsURLConnection)url.openConnection(); PrintWriter out = new PrintWriter( conection.getOutputStream() ); out.close(); BufferedReader in = new BufferedReader( new InputStreamReader( conection.getInputStream() ) ); String line; while( (line = in.readLine() ) != null ){ System.out.println( line ); } in.close(); } catch(Exception e) { e.printStackTrace(); } } } 【実行】 java -Djava.protocol.handler.pkgs=com.ibm.net.ssl.internal.www.protocol JSSETest 【結果】 java.lang.ClassCastException: com.ibm.net.ssl.internal.www.protocol.https.HttpsURLConnection at JSSETEST2.main(JSSETEST2.java:9)

    • ベストアンサー
    • Java
  • basic認証を何度も行うには

    いつもお世話になります。 htmlにて入力されたID、パスワードを元に、サーブレットからあるページへアクセスし、そのページではbasic認証となっているのですが、java.net.Authenticatorクラスを使用してbasic認証を行う、という簡単なWebアプリケーションを作成しています。 サーブレットでは以下の実装を行っているのですが(抜粋)、 -------------------------ここから String username = req.getParameter("username"); String password = req.getParameter("password"); Authenticator.setDefault(new HttpAuthenticator(username, password)); URL url = new URL("[basic認証が必要なページのURL]"); HttpURLConnection connection = (HttpURLConnection)url.openConnection(); -------------------------ここまで この実装では、一度認証が成功すると、以降、どのようなID、パスワードを入力しても(間違ったものを入力しても)認証に成功してしまいます。 正しいID、パスワードの時のみ認証に成功させるようにするにはどうすればよいでしょうか。 宜しくお願い致します。

    • ベストアンサー
    • Java

専門家に質問してみよう