2011-12-19 3 views
1

PHPサーバーにログインエリアを設定しました。 members.phpファイルにはログインが必要です。ログイン後、セッションが作成されます。セッションはしばらく続きます。私はセッションがまだ有効な間にJavaアプレットがmembers.phpページにアクセスできるようにこの作業をしたいと思います。私のJavaアプレットは、PHPで認証されたセッションをどのように使用できますか?

私はJavaアプレットをmembers.phpページに埋め込んでいます。それはHttpURLConnectionリクエストを行いますが、私がレスポンスを得ると、PHPサーバによってログインページにリダイレクトされたことがわかります。

これを正しく設定するにはどうすればよいですか?ここで

は、Javaアプレットのコードです:

import java.applet.Applet; 
import java.awt.Dimension; 
import java.io.BufferedReader; 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.URLConnection; 
import java.util.List; 
import java.util.Map; 

import javax.swing.JFrame; 
import javax.swing.JTextArea; 

public class phpConnectApplet extends Applet { 

    private static final long serialVersionUID = 1L; 

    public void init() { 
     URL url = null; 
     try { 
      url = new URL("http://www.example.com/members.php"); 
      URLConnection urlConn = url.openConnection(); 
      HttpURLConnection httpConn = (HttpURLConnection) urlConn; 
      httpConn.setDoOutput(true); 
      httpConn.setDoInput(true); 
      httpConn.setUseCaches(false); 
      httpConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
      DataOutputStream output = new DataOutputStream(httpConn.getOutputStream()); 
      String content = "action=blah"; //just to test the PHP file 
      output.writeBytes(content); 
      output.flush(); 
      output.close(); 

      DataInputStream in = new DataInputStream(urlConn.getInputStream()); 
      BufferedReader input = new BufferedReader(new InputStreamReader(in)); 
      String str, result = ""; 
      while ((str = input.readLine()) != null) { 
       result = result + str + "\n"; 
      } 
      input.close(); 

      Map<String, List<String>> headers = httpConn.getHeaderFields(); 
      List<String> values = headers.get("Set-Cookie"); 
      String cookieValue = null; 
      for (String v:values) { 
        if (cookieValue == null) 
         cookieValue = v; 
        else 
         cookieValue = cookieValue + ";" + v; 
      } 
      System.out.println(cookieValue); 

      JFrame f = new JFrame("App Title"); 
      f.add(new JTextArea(result)); 
      f.setMaximumSize(new Dimension(400,300)); 
      f.pack(); 
      f.setLocationRelativeTo(null); 
      f.setVisible(true); 
     } catch (MalformedURLException me) { 
      me.printStackTrace(); 
     } catch(IOException ie) { 
      ie.printStackTrace(); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

} 

このため、出力は、ログインページの出力HTMLが含まれている1のJTextFieldとJFrameのです。

答えて

2

PHPSESSIDのCookie(またはCookie名として使用しているもの)の値を取得し、HttpURLConnectionのリクエストに追加する必要があります。このMAYはシステムパラメータとして渡されますが、そうでない場合は、アプレットを起動するページにセッションIDをアプレット属性として埋め込むことができます。 http://www.hccp.org/java-net-cookie-how-to.html

が具体的に要求でクッキーの値を設定するというセクションを参照してください。

は、ここでのURLConnectionクラスにクッキーを送信する方法について説明チュートリアルです(私は特にこの部分で実験していません)。

+0

PHPでのテストを行って、これらの値を示した: 'セッション名:\t PHPSESSID セッションID:\t 917bcaa8e ------------ 329035f0640' 'クッキー:\t 'PHPSESSID':\t " 917bcaa8e ------------ 329035f0640 ' Cookie:\t' X-mapping-kjicghkc ':\t' 9EE581364 ------------ 955DBE039A8 ' 第2クッキーX -Mapping-kjicghkcとその後のキーは、Java Appletに登場するものです。それを使うべきか、PHPSESSIDだけを探しているべきですか? – Ozzy

+0

あなたはそれを見て両方が必要です。 PHPSESSIDはあなたのアプリケーションから来ています。私はそれをX-Mappingというものから推測しています - ????????ロードバランサのものですが、後者は個人的には見たことがありません。 – SplinterReality

+0

実際、あなたが私に与えたリンクからクラスを使用した後、Webサーバーにアプレットをもう一度アップロードしました...今すぐ動作します!アプレットはクッキーを設定するだけでメンバーエリアを見ることができます。 'cm.setCookies(conn2);'はリンク内のそのクラスの魔法です。ありがとう:) – Ozzy

関連する問題