1

私の同僚と私は、を介して機能するPerlWebプロジェクトを保守および開発していmod_perlます。

現在、ある種のMVCパターンを実装した主要なレガシーコードリファクタリングを行っています。

特に、私のタスクは、すべてのHTTP応答ヘッダーが処理され、メインコントローラー内のブラウザーに返送されることを確認することです。たとえば、リダイレクトが必要な場合、ページハンドラーは例外をスローし、メインコントローラーはそれをキャッチして対応するヘッダーを生成します。

私がクッキー処理を実装し始めるまで、それはすべてうまく見えました。その前は、次のように、コードは必要なときに出力するCookieヘッダーを出力していました。

# $response is an instance of the CGI class
print $response->redirect(
    -uri => "/some_uri/",
    -cookie => $response->cookie(
         -name => 'user_id',
         -value => $user->{'id'},
         -path => '/', -expires => '+1M'));

$responseそして今、オブジェクトにその情報を保存させたいので、後ですべてのヘッダーを一緒に送信できます。私はそれがそのようなものになるだろうと思いました:

sub page_handler {
    # ...
    $response->cookie(-name => 'user_id',
         -value => $user->{'id'},
         -path => '/', -expires => '+1M');
    return;
}

# And then, inside the controller

sub controller {
    # ...
    # the same $response instance 
    print $response->header();
    print $output;
    # ....
    exit();
}

しかし、クラスオブジェクトは、メソッドCGIで作成したすべてのヘッダーを格納しているわけではないようです。header一部のヘッダーは存続しているように見えますが、他のヘッダーは存続していないようですre.pl

$ use CGI;        
$ my $response = CGI->new();
$CGI1 = CGI=HASH(0xa6efba0);
$ $response->header();
Content-Type: text/html; charset=ISO-8859-1

$ $response->header(-type => 'text/plain', -charset => 'UTF-8', -status => '200 OK');
Status: 200 OK
Content-Type: text/plain; charset=UTF-8

$ $response->header();
Content-Type: text/html; charset=UTF-8 

最後の出力は前の出力と同じか、ヘッダーをまだ設定していない最初の出力と同じであると予想しました。部分的に変わるとは思っていませんでした。

そのため、私は質問をします。CGI.pmオブジェクトの一部のヘッダー情報が保持されるのに、別のヘッダー情報は保持されないのはなぜですか。

オブジェクトを間違って使用していますか?意図したとおりに使用できる方法はありますか?

PS:長い質問で申し訳ありませんが、私がやりたいことをあなたに理解してもらいたいと思いました。

PPS:また、このあたりの多くの人がCGIから離れてCatalystを使用することを推奨していることを私は知っています。これは、残念ながら、現時点ではオプションではありません。レガシーコードが多すぎて、mod_perlから完全に離れることを望んでいるからです。これは、特定の機能にのみ必要です。

4

1 に答える 1

0

あなたの質問に答えるために、ヘッダーメソッドは情報を保存せず、永続的なものは何もありません。

ヘッダー「オブジェクト」の例が持続している場合、TFMを読み取ると次のことが役立ちます。

-charsetパラメーターを使用して、ブラウザーに送信される文字セットを制御できます。指定しない場合、デフォルトはISO-8859-1です。副作用として、これはcharset()メソッドも設定します。[強調鉱山]

いくつかのパラメータを使用してヘッダーを呼び出し、それをデフォルトとして呼び出すと、「永続化」するのは文字セットだけです。

あなたのクッキーの問題については、$ response-> cookie();を保存する必要があると思います。どこか。TFMは、cookie()サブがデータをどこにでも保存するとは言っておらず、単にcookieを作成すると言っています。

私はSinanに同意しますが、例外をスローすることは、特にCGI.pmのリダイレクトサブをカバーするためのクレイジーな話です。私はそれを再考したいと思います。または、完全に逆になり、例外処理のみを使用してWebアプリ全体を記述します-途中でいくつかの良い笑いがあります:o)

于 2011-03-18T02:03:08.087 に答える