JAVAでCookie情報をサーバに通知する方法

このQ&Aのポイント
  • JAVAのプログラミングでサーバにCookie情報を通知する方法について解説します。
  • JavaのHttpURLConnectionクラスを使用して、Cookie情報をサーバに送信する方法をご紹介します。
  • Cookie情報をHTTPリクエストヘッダーに設定し、サーバに送信することでCookie情報を通知することができます。
回答を見る
  • ベストアンサー

JAVAでCookie情報をサーバに通知する方法

JAVAのプログラミングでサーバに対してCookie情報を通知するコードを書こうとしています。 HttpCookie cookie = new HttpCookie("name", "value"); urlconn.setRequestMethod("GET"); urlconn.setInstanceFollowRedirects(false); urlconn.setRequestProperty("Accept-Language", "ja;q=0.7,en;q=0.3"); このように宣言したcookieをパケットに付けてサーバに送るにはどのようにしたらよいのでしょうか。 cookie.xxx() のようなメソッドがあるのかな?と思っていましたが、それにあたるようなメソッドはみあたりませんでした。

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

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

  • ベストアンサー
  • teketon
  • ベストアンサー率65% (141/215)
回答No.1

修正しました。HTTPCookieは一度Request、Responseが返ってきてから使用します。 提示いただいているプログラムは、Requestを置くる前なので、次のようになると思います。 URL url = new URL( "http://okwave.jp/" ); URLConnection urlconn= url.openConnection(); urlconn.setRequestMethod("GET"); urlconn.setInstanceFollowRedirects(false); //追加 urlconn.setRequestProperty("Cookie", "name=value"); urlconn.setRequestProperty("Accept-Language", "ja;q=0.7,en;q=0.3"); 参考URLの情報がプログラムでクッキーを扱う参考になるかと思います。

参考URL:
http://docs.oracle.com/javase/jp/1.5.0/guide/deployment/deployment-guide/cookie_support.html

関連するQ&A

  • cookie使用サイトへのJAVAによるアクセス

    JAVAであるサイトの情報を集めるようなソフトを作りたいのですが、 そのサイトが年齢認証をcookieで行っているみたいで接続しても403エラーが出てしまいます。 cookieを手動で設定していますがこれはあってるはずです。 afg = 0; domain = "www.toranoana.jp" ;path = "/"; どのようにすればちゃんと接続できるようになるでしょうか?よろしくおねがいします。 以下にソースをさらします。 なお接続先は18歳未満禁止の年齢制限がかかっているので注意してください。 import java.net.*; import java.io.*; import java.util.*; public class HttpClientHttpURLConnection { public static void main(String[] args) throws MalformedURLException, ProtocolException, IOException, URISyntaxException{ URL url = new URL("http://www.toranoana.jp/mailorder/cot/pagekit/0000/00/03/000000030983/index.html"); URI uri = new URI("www.toranoana.jp/"); HttpCookie cookie = new HttpCookie("afg", "0"); cookie.setDomain("www.toranoana.jp"); cookie.setPath("/"); HttpURLConnection urlconn = (HttpURLConnection)url.openConnection(); urlconn.setRequestMethod("GET"); urlconn.setInstanceFollowRedirects(false); urlconn.setRequestProperty("Accept-Language", "ja;q=0.7,en;q=0.3"); CookieManager manager = new CookieManager(); manager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); manager.getCookieStore().add(uri,cookie); CookieHandler.setDefault(manager); CookieStore store = manager.getCookieStore(); List<HttpCookie> cookies = store.getCookies(); for (int i = 0; i < cookies.size(); i++) { HttpCookie cookie1 = cookies.get(i); System.out.println("Cookie[" + i + "]: " + cookie1); } urlconn.connect(); Map headers = urlconn.getHeaderFields(); Iterator it = headers.keySet().iterator(); System.out.println("レスポンスヘッダ:"); while (it.hasNext()){ String key = (String)it.next(); System.out.println(" " + key + ": " + headers.get(key)); } System.out.println("レスポンスコード[" + urlconn.getResponseCode() + "]" + "レスポンスメッセージ[" + urlconn.getResponseMessage() + "]"); System.out.println("\n---- ボディ ----"); BufferedReader reader = new BufferedReader(new InputStreamReader(urlconn.getInputStream())); while(true){ String line = reader.readLine(); if(line == null){ break; } System.out.println(line); } reader.close(); urlconn.disconnect(); } }

    • ベストアンサー
    • 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
  • サーバーAからサーバーBへPOSTする方法

    お世話になっております。 WEBアプリケーションを作成しているのですが、 問題が解消されずに困っております。 どなたかわかる方、ご教授いただけないでしょうか。 【質問】 サーバーAからサーバーBへデータをPOSTする方法を教えてください。 【詳細】 現在サーバーAのサーブレットより、サーバーBのサーブレットへデータをPOSTで渡そうとしています。 そして、サーバーBのサーブレットが持つdoPostメソッドにて、渡したデータ処理を実施したいです。 forwardとsendRedirectを考えたのですが、 forwardだと他サーバーへデータを渡すことができないようです。 また、sendRedirectだとdoGetメソッドが実行されるため、おそらくGetが行われていると考えられます。 現在、Javaだけでコーディングを実施しているため、Javaでの実現方法を教えていただけると非常に助かります。 大変困っておりますので、わかる方はぜひご教授ください。

    • ベストアンサー
    • Java
  • javaでWebサーバー

    今学校の課題でjavaで簡単なWebサーバーを作っています トップディレクトリのdocrootフォルダ下のファイルにアクセスできるようにしました 内容は以下の様です import java.io.File; import java.net.Socket; import java.net.ServerSocket; /** * 簡単なWebサーバ. */ public class HTTPServer { /** * サーバソケット */ private ServerSocket server; /** * Webサイトのトップディレクトリ */ private String docRoot; /** * サーバーソケットを作成する。 * @param port このサーバが受け付けるポート番号 * @param docRoot Webサイトのトップディレクトリ */ private HTTPServer(int port, String docRoot) throws java.io.IOException { server = new ServerSocket(port); this.docRoot = docRoot; } /** * サーバのサービスを行うメソッド. */ private void doService() { System.out.println("Starting Server Service!!"); while (true) { try { Socket client = server.accept(); ClientHandler clientHandler = new ClientHandler(client, docRoot); clientHandler.doService(); } catch (Exception e) { // スタックトレースの表示 e.printStackTrace(); } } } /** * サーバ起動のための主メソッド. * 起動方法:トップディレクトリにて * <pre> * java -cp lib pro3.HTTPServer ポート番号 * </pre> */ public static void main(String[] args) { if (args.length != 1) { System.err.println("usage: java HTTPServer port_number"); System.exit(1); } int port = -1; try { port = Integer.parseInt(args[0]); // 文字列を整数へ変換 } catch (Exception e) { System.err.println("Invalid port number."); System.exit(1); } // Webサイトのトップディレクトリ(カレントディレクトリのdocroot)を求める. String docRoot = System.getProperty("user.dir") + File.separator + "docroot"; try { HTTPServer server = new HTTPServer(port, docRoot); server.doService(); } catch (Exception e) { // スタックトレースの表示 e.printStackTrace(); } } } doServiceで指定したファイルを読んで返したりしています ここで質問なのですが このサーバーを動かしている時に http://localhost:ポート/index.html でアクセスするたびにindex.htmlをきちんと出力してくれます しかしソースを読む限りだとループしているようには思えないのですが どのように繰り返しを行っているのですか?

    • ベストアンサー
    • Java
  • CをJavaに変換

     プログラミング初心者です C言語どうしのソケットプログラムのServer側をJava言語に書き換えC言語(Windows版)とJava言語での通信プログラムを行おうとしています。  C言語の最初の宣言で #include <stdio.h> #include <winsock2.h> #include <ws2tcpip.h> のところはJavaではどのように書き換えればいいのでしょうか? ご返答お願いします。

    • ベストアンサー
    • Java
  • セッションについて(サーバーサイドJava)

    Ajaxフレームワーク(DWR)を使いJavaScriptからJavaのメソッドを 呼び出すプログラム(一部)でセッション管理についてです。 下記のプログラムの様にコンストラクタでセッションのオブジェクト を作成し、(クライアント)JavaScriptからJavaのaddMember()を実行してセッションの 設定を行なった場合、複数のクライアントからアクセスがあった時でも そのクライアント数に応じたセッションが作成されるでしょうか? それともコンストラクタでセッションのオブジェクトが一つしか作成 されていない為、クライアントがaddMember()を実行するたびに セッションの設定が上書きされるのでしょうか? もし上書きする場合で改善する場合はaddMember()の中で context = WebContextFactory.get(); session = context.getSession(); session.setAttribute("userName", name); session.setAttribute("loginId", id); の様にセッションオブジェクトを作成してから 設定した方がいいのでしょうか? 以下Java(サーバー)プログラムです。 @RemoteProxy(name="DataManager", scope=ScriptScope.APPLICATION) public class DataManager{ private WebContext context; private HttpSession session; public DataManager(){ memberList = new ArrayList<Data>(); context = WebContextFactory.get(); session = context.getSession(); }//コンストラクタ ///JavaScriptから呼び出すメソッド @RemoteMethod public String addMember(String nameStr){ String id = this.createId(); String name = this.strEscape(nameStr); /////このメソッドが実行されるたびにセッションが上書きされる? session.setAttribute("userName", name); session.setAttribute("loginId", id); ---------------------[途中まで]-----------------------------

    • ベストアンサー
    • Java
  • Javaのプログラムの質問です。

    Javaのプログラムについての質問です。 Listインターフェースの実装クラスの自作と、作成したクラスの全メソッドを呼び出すサンプルを作成せよ、という問題です。  注意点として、java.util.Listの実装クラスは使用出来ません(ArrayListなど)。実装するメソッドは、コードの中に番号を振ってあります。 import java.util.Collection; import java.util.Iterator; import java.util.ListIterator; import java.util.List; class LocalList implements List{  private int Count;  private String Data[];  private Iterator ite;  private ListIterator lite;  // コンストラクタ  void mylist(){   Data = new String[10];   Count = 0;  }  (1)  public boolean add(Object str){   if(Count >= 10){    return false;   }   Data[Count ++] = new String((String)str);   return true;  }  public void add(int i,Object str){  }        public boolean addAll(Collection c){   return false;  }        public boolean addAll(int i,Collection c){   return false;  }    (2)  public void clear(){   Count = 0;  }  public boolean contains(Object str){   return false;  }          public boolean containsAll(Collection c){   return false;  }  public boolean equals(Object str){   return false;  }    (3)  public Object get(int i){   return (i >= Count);  }  public int hashCode(){   return -1;  }  public int indexOf(Object str){   return -1;  }  public boolean isEmpty(){   return false;  }  public Iterator iterator(){   return ite;  }     public int lastIndexOf(Object str){   return -1;  }     public ListIterator listIterator(){   return lite;  }     public ListIterator listIterator(int i){   return lite;  }    (4)  public Object remove(int i){   return (i >= Count);  }    public boolean remove(Object str){   return true;  }         public boolean removeAll(Collection c){   return false;  }         public boolean retainAll(Collection c){   return false;  }    (5)  public Object set(int i,Object str){   return Data[i];  }    (6)  public int size(){   return Count;  }  public List subList(int i,int j){   return this;  }  public Object[] toArray(){   return Data;  }  public Object[] toArray(Object[] a){   return Data;  } } class Main {  public static void main(String[] args) {   mylist sub = new mylist();   sub.add("ビルドバーニングガンダム");   sub.add("ライトニングガンダム");   sub.add("ウイニングガンダム");   sub.add("ガンダムフェニーチェリナーシタ");   sub.add("R・ギャギャ");   for(int i = 0; i < sub.size(); i++){      System.out.println(sub.get(i));   }   // 改行   System.out.println();   // setメソッド   sub.set(1,"ガンダムエピオン");   for(int i = 0; i < sub.size(); i++){    System.out.println(sub.get(i));   }   // 改行   System.out.println();   // sizeメソッド   System.out.println("\r\n" + "機体数は" + sub.size() + "です" + "\r\n");   // removeメソッド   sub.remove(1);   for(int i = 0; i < sub.size(); i++){       System.out.println(sub.get(i));   }   // clearメソッド   sub.clear();   System.out.println("\r\n" + "機体数が" + sub.size() + "になったので負けです");    } } setメソッドとremoveメソッド以外は起動するのようになったのですが、この2つがうんともすんとも動きません。ジェネリクス型を使うという考え方もあるらしいのですが、ネットで調べてもピンと来ず寸詰まり状態になってしまっています。後少しだと思うのですが。。。。 どなたかご教授頂けないでしょうか?よろしくお願い致します。

  • LinuxでJAVAプログラムの実行のパスについて

    基本的な事とは思うのですが、うまく行かないので ご教授下さい。宜しくお願いします。 ローカルのWINDOWS(eclipse使用)でうまく行くのですが、 Linuxサーバ上でうまく実行できません。 階層は以下のように Aproject/bin/jp/co/hoge/aaa.class Aproject/src/jp/co/hoge/aaa.java Aproject/conf/xxx.prop とbin・src・confが同じレベルにあります。 aaa.java内でxxx.propを読み込む際、相対パスで"conf/xxx.prop" と指定してローカルではきちんと読み込めます。 aaa.javaのパッケージ宣言は package jp.co.hoge; となっていまして、linuxサーバ上で実行する時は、binをカレントで "java jp/co/hoge/aaa"としているので xxx.propを読み込むためには、"../conf/xxx.prop"としなければ ならず、どうしたら良いのかわからなくなってしまいました。 サーバ上で実行する時に今のようにbinをカレントに実行するのでは なく、その上のAprojectの階層をカレントに実行すれば、 パスは"conf/xxx.prop"でいいと思うのですが、 "java bin/co/hoge/aaa"としても実行できません。 どのようにして実行すればうまくパスをあわせる事ができる のでしょうか?? eclipseの設定がまずいのでしょうか? 宜しくお願い致します。

    • ベストアンサー
    • Java
  • javaのプログラミングについての質問です。

    Javaのプログラムについての質問です。長くなってしまいますがご容赦下さい。 Listインターフェースの実装クラスの自作と、作成したクラスの全メソッドを呼び出すサンプルを作成せよ、という問題です。以下が現在までに作成したコードになります。 注意点として、java.util.Listの実装クラスは使用出来ません(ArrayListなど)。実装するメソッドは、コードの中にコメントを振ってあります。 import java.util.List; import java.util.Collection; import java.util.Iterator; import java.util.ListIterator; class Mylist implements List{   private int Count;   private String Data[];   // コンストラクタ   public Mylist(){    Data = new String[10];    Count = 0;   } /** 実装するaddメソッド @return boolean APIの設定に従う @param e エレメント(要素) **/   public boolean add(E e){    Data[Count] = (String)e;   Count++;   return true;   }   public void add(int i,Object str){   }   public boolean addAll(Collection c){     return false;   }   public boolean addAll(int i,Collection c){     return false;   } /** 実装するclearメソッド **/   public void clear(){     Count = 0;   }   public boolean contains(Object str){     return false;   }   public boolean containsAll(Collection c){     return false;   }   public boolean equals(Object str){     return false;   } /** 実装するgetメソッド @return E エレメント(要素) @param i 指定されたインデックス番号 **/   public E get(int i){      /*     エレメントeに、String型Data[i]を     キャストして格納*/     E e = (E)Data[i];     return e;   }   public int hashCode(){     return -1;   }   public int indexOf(Object str){     return -1;   }   public boolean isEmpty(){     return false;   }   public Iterator iterator(){     return null;   }   public int lastIndexOf(Object str){     return -1;   }   public ListIterator listIterator(){     return null;   }   public ListIterator listIterator(int i){     return null;   }    /**   * 実装するremoveメソッド   * @return E エレメント(要素)   * @param index 指定されたインデックス番号   **/   public E remove(int index){ /* Dataを最大まで回し、iをインクリメントしたData[i++]を String型Dataに格納する*/ for(int i = index; i < Data.length; i++){ Data[i] = Data[index++]; } Count--; E e = (E)Data; return e; } public boolean remove(Object str){ return false; } public boolean removeAll(Collection c){ return false; } public boolean retainAll(Collection c){ return false; } /** * 実装するsetメソッド * @return E エレメント(要素) * @param i 指定されたインデックス番号 * @param element 置き換える要素 **/ public E set(int i,E element){ // String型Dataにelementをキャストして格納 Data[i] = (String)element; // エレメントeにData[i]をキャストして格納 E e = (E)Data[i]; // 値を返す return e; } /** * 実装するsizeメソッド * @return int 指定されたインデックス番号 **/ public int size(){ return Count; } public List subList(int i,int j){ return this; } public Object[] toArray(){ return Data; } public Object[] toArray(Object[] a){ return Data; } } class Main { /** メインメソッド **/ public static void main(String args[]) { Mylist sub = new Mylist(); /* addメソッドを実装し、機体名を要素とする。 addを最大まで回し、getメソッドで要素を取り出して表示する*/ sub.add("ビルドバーニングガンダム"); sub.add("ライトニングガンダム"); sub.add("ウイニングガンダム"); sub.add("ガンダムフェニーチェリナーシタ"); sub.add("R・ギャギャ"); sub.add("ユニコーンガンダム"); for(int i = 0; i < sub.size(); i++){ System.out.println(sub.get(i)); } // sizeメソッド System.out.println("\r\n" + "機体数は" + sub.size() + "です" + "\r\n"); // setメソッド sub.set(0,"ガンダムエピオン"); for(int i = 0; i < sub.size(); i++){ System.out.println(sub.get(i)); } // 改行 System.out.println(); // removeメソッド sub.remove(1); for(int i = 0; i < sub.size(); i++){ System.out.println(sub.get(i)); } // clearメソッド sub.clear(); System.out.println("\r\n" + "機体数が" + sub.size() + "になったので負けです"); } } コンパイルして実行すると、removeメソッドで指定した箇所ではなく、要素の1番最後が削除されています。思うに、removeメソッドを実装する所のfor(int i = index; i < Data.length; i++){の中の条件が違うと思うのですが。。。。 また、現在addには10個箱を作成するようにしていますが、11個目をメインクラス内で用意した場合、例外ではなく新たに箱を作らなければならない、という後だしジャンケン的な事を言われて、思わず「じゃあArrayListでいいじゃないか」と思ってしまいました。 気を取り直してこの3連休で終わらせたいと思っています。ここまでで現状コードの完成は50%かそれ以下だとは思いますが、どなたか上記2点について御教授頂けないでしょうか。よろしくお願い致します。

  • PHPでフォームが送信できません…。

    PHPでフォームが送信できません…。 以下のプログラムをCentOS release 5.5 (Final)上で動かそうとしています。 TestCookieIn.phpは表示されるのですが、このスクリプトにあるフォームに「A」と入力してSubmitしても、次のTestCookieOut.phpが表示されない(ブラウザの画面が真っ白になる)のです。TestCookieOut.phpの先頭あたりに「print("Debug")」といったコードを埋め込んでみても「Debug」という文字列が表示されず、どうやらTestCookieOut.php自体が実行されていないようなのです。 ローカルのWindows Vista+xampp 1.7.3では動いていたので、何か違いがあるのでしょうか。 なおソースと、TestCookieIn.phpをSubmitした時のHTTPヘッダは以下の通りです。 詳しい方、どうかご教授下さい。お願い致します。 -------------------------------- ・TestCookieIn.php <html> <head> <title></title> </head> <body> <form action="./TestCookieOut.php" method="POST"> <input type="text" name="NAME" size="30" value="<?php print($_COOKIE['TestCookieVariable_COOKIE_NAME']); ?>"/><br/> <input type="submit" value="Exec." /> </form> </body> </html> -------------------------------- ・TestCookieOut.php <?php setCookie('TestCookieVariable_COOKIE_NAME', $_POST['NAME'], time() + (60 * 60 * 24 * 7)); ?> <html> <head> <title></title> </head> <body> <?php print($_POST['NAME']); ?> <a href="./TestCookieIn.php">前の画面に戻る</a> </body> </html> -------------------------------- ・TestCookieIn.phpをSubmitした時のHTTPヘッダ(IPアドレスやユーザー名などはダミーですが) -------------------------------- http://xxx.xxx.xx.xx/~usrid/dirname/TestCookieOut.php POST /~usrid/dirname/TestCookieOut.php HTTP/1.1 Host: xxx.xxx.xx.xx User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 (.NET CLR 3.5.30729) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ja,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7 Keep-Alive: 115 Connection: keep-alive Referer: http://xxx.xxx.xx.xx/~usrid/dirname/TestCookieIn.php Content-Type: application/x-www-form-urlencoded Content-Length: 6 NAME=A HTTP/1.1 200 OK Date: Tue, 06 Jul 2010 22:30:47 GMT Server: Apache/2.2.3 (CentOS) X-Powered-By: PHP/5.1.6 Content-Length: 0 Connection: close Content-Type: text/html; charset=UTF-8 --------------------------------

    • ベストアンサー
    • PHP

専門家に質問してみよう