2011-11-06 20 views
9

私はWinXP、Eclipse Indigo、およびGoogle WebプラグインでWebアプリケーションを作成しています。サーブレットのsendRedirect()がセッション属性を無効にします

私はユーザーからの価値(電子メールなど)を受け取り、それを処理するサーブレットSignIn.javaに渡し、電子メール値をセッションに保存します。 SignInコードはここで、非常に簡単ですそのdoGetはほとんど何をするかです:

String email = req.getParameter("email"); //getting the parameter from html form 
... 
... 
HttpSession session = req.getSession();  //create a new session 
session.setAttribute("email", email); 

これまでのところは良い、私は値がこの時点でnullていないことを確認しました。問題が発生したので、もう少し処理する必要のある別のサーブレット(ShowOnline.java)にリダイレクトします。私は

resp.sendRedirect(resp.encodeRedirectURL("/ShowOnlineServlet")); 

ShowOnline

nullセッション値を取得書くとき、私は

getServletConfig().getServletContext().getRequestDispatcher("/ShowOnlineServlet"); 

すべてがOKで書くとき

(同じメールが、私は第二の前に、今nullで保存された属性)、電子メール属性前からはnull

何が起こっていますか? sendRedirect()はブラウザに新しい要求を送信するだけで、セッションスコープには影響しません。私はクッキーをチェックしていて、それはうまくいきます(私のwebappが最初に作成した唯一のセッションなので、前回と同じセッションです。さらにセジゾンIDも気にしてチェックしました。 。

なぜsendRedirect()forward()の間に違いがありますか?簡単な解決策は、forward()を使用することですが、私はちょうど手放す前に、これの一番下に行きたいと思います。何が起こったのかを理解することが重要です。私はこのような基本コンセプトで何が起こっているのか分からないという考えが好きではないかと私は確信していません(私の初心者なので私のwebapp全体は非常にシンプルで基本的です)。

意見やアイデアは大歓迎です!

+0

私はそれが前方の代わりのsendRedirectを使用して、現時点では可能かもしれないと思いますが、私は私のセッション属性が明らかな理由もなくヌル行くだろう恐れなしのsendRedirectを使用したいと思い、後に考えます。 –

+0

@home:OPはセッションIDが前後で同じであることを確認しました。 – BalusC

+1

リダイレクトを送信せず、ブラウザから/ ShowOnlineServletに手動で移動するとどうなりますか? –

答えて

1

SignInサーブレットがリクエストパラメータ(電子メール)のみを保存している場合は、サーブレットをfilterと置き換えることもできます。 SignInFilter

SignInFilter /あなたSignInサーブレット(セッションへのリクエストパラメータからのメールをコピーする)と同じロジックが含まれていますが、チェーン内の次の項目を呼び出します(あなたShowOnlineサーブレットになる)の代わりに、任意のリダイレクトを行います前方に代わりにShowOnlineサーブレットにPOST、およびShowOnline(簡潔にするため、以下の省略サーブレットマッピング)の前に実行するために、あなたの新しいSignInFilterを設定するには、フォームを設定

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 
    throws IOException, ServletException { 

    HttpServletRequest request = (HttpServletRequest) req; 
    HttpServletResponse response = (HttpServletResponse) res; 
    HttpSession session = request.getSession(); 

    String email = req.getParameter("email"); 
    session.setAttribute("email", email); 

    chain.doFilter(req, res); // continue to 'ShowOnline' 

} 

<?xml version="1.0" encoding="UTF-8"?> 
<web-app 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    id="WebApp_ID" version="2.5"> 

    <filter> 
     <filter-name>SignInFilter</filter-name> 
     <filter-class>com.example.SignInFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>SignInFilter</filter-name> 
     <url-pattern>/ShowOnline</url-pattern> 
    </filter-mapping> 
</web-app> 
-2

限り私の知識として、のsendRedirect()は単に親ページの関連する要求&レスポンスオブジェクトを転送せずに別のページにコントロールをリダイレクトしますが、するRequestDispatcher(オブジェクト)が言及したページへのServletRequestとServletResponseを派遣しますパス引数{getServletContext()。その後、getRequestDispatcher( "path")}を実行すると、オブジェクトをそのページに転送するか、オブジェクトを含めることができます。したがって、このコンテナによって、新しいページを作成するのではなく、親ページの前の要求および応答オブジェクトを使用しなければならないことが保証されます。 特にセッション管理を使用している場合、最適なオプションはRequestDispatcherです。

質問にお答えします。

すべて: - 私が間違っている場合は、私を修正してください。

@rs

関連する問題