私のJavaアプレットは、PHPで認証されたセッションをどのように使用できますか?

私は自分のPHPサーバにログインエリアを設定しました。 members.phpファイルにはログインが必要です。ログイン後、セッションが作成されます。セッションはしばらく続きます。私はセッションがまだ有効な間にJavaアプレットがmembers.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> headers = httpConn.getHeaderFields(); 
             List 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です。

1

1 答え

PHPSESSIDクッキー(またはクッキー名に使用しているもの)の値を取得し、それをHttpURLConnectionのリクエストに追加する必要があります。この MAY はシステムパラメータとして提供されますが、そうでない場合は、アプレットを起動するページにセッションIDをアプレット属性として埋め込むことができます。 (私はこの部分を特別に実験していない)

Here's a tutorial that explains how to send cookies in the URLConnection class: http://www.hccp.org/java-net-cookie-how-to.html

詳しくは、リクエストにCookieの値を設定するというセクションをご覧ください。

2
追加された
PHPのテストでは、次の値が示されました:セッション名:PHPSESSIDセッションID:917bcaa8e ------------ 329035f0640 Cookie: 'PHPSESSID': '917bcaa8e-- ---------- 329035f0640 'Cookie:' X-Mapping-kjicghkc ':' 9EE581364 ------------ 955DBE039A8 '第2のクッキーX-Mapping-kjicghkcそれ以降のキーは、Java Appletに登場するキーです。それを使うべきか、PHPSESSIDだけを探しているべきですか?
追加された 著者 Ozzy,
実際には、私はあなたが私に与えたリンクからクラスを使用した後、Webサーバーに再びアプレットをアップロードしました...今すぐ動作します!アプレットはクッキーを設定するだけでメンバーエリアを見ることができます。 cm.setCookies(conn2); はリンク内のそのクラスの魔法です。ありがとう:)
追加された 著者 Ozzy,
あなたは両方の外観が必要です。 PHPSESSIDはあなたのアプリケーションから来ています。私はそれをX-Mappingというものから推測しています - ????????ロードバランサのものですが、後者は個人的には見たことがありません。
追加された 著者 SplinterReality,
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com