0

jsp ページ内に、別のクエリ文字列を含むリンクがあります。主にページングの目的で使用しました。

<a href='/test?page=1&code=${code}'>Page 1</a>
<a href='/test?page=2&code=${code}'>Page 2</a>
<a href='/test?page=3&code=${code}'>Page 3</a>

この jsp ページに初めてロードすると、すべて正常に動作します。リンクをクリックした瞬間に、以下のエラーが表示されます。

java.io.IOException: Server returned HTTP response code: 400 for URL: https://graph.facebook.com/oauth/access_token?client_id=xxx&scope=user_photos&redirect_uri=http://xxx.herokuapp.com/test&client_secret=xxx&code=xxx

このエラーがクエリ文字列にリンクされているかどうか疑問に思っていますか? JSP ページでページングが本当に必要なので、この問題を回避する方法はありますか?

私のサーブレットの中で...

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {

    String code = req.getParameter("code");
    String page = req.getParameter("page");

    if(page == null){
        page = "1";
    }

    String MY_ACCESS_TOKEN = "";

    String redirect = "http://xxx.herokuapp.com/test";
    String en_redirect = URLEncoder.encode(redirect, "UTF-8");
    String en_code = URLEncoder.encode(code, "UTF-8");

    String authURL = "https://graph.facebook.com/oauth/access_token?client_id=xxx&scope=user_photos&redirect_uri=" + en_redirect + "&client_secret=xxx&code="
            + code;

    URL url = new URL(authURL);
    String result = readURL(url);
    String[] pairs = result.split("&");

    for (String pair : pairs) {
        String[] kv = pair.split("=");
        if (kv[0].equals("access_token")) {
            MY_ACCESS_TOKEN = kv[1];
        }
    } // end of for loop
4

1 に答える 1

0

パラメータ redirect_uri の値を HTML エンコードする必要があります。これは、特殊文字を % に変換し、その後に 16 進数を付けるプロセスです。同様のスペースは %20 になります。これは、プライマリ URL ではなく 2 番目の URL の一部であるアンパサンドをエンコードするために重要です。

 parameter = java.net.URLEncoder.encode( parameter );

特にアンパサンドが含まれている可能性がある場合は、すべてのパラメーターに対してこれを行うことをお勧めします。

于 2013-09-12T19:53:09.433 に答える