2012-01-20 9 views
2

まず、私がやろうとしていることを説明しましょう。 私はユーザーがいるWebサイトを持ち、view_profile.jspページへのアクセスをログに記録されたユーザーに限定したいとします。Javaフィルタを経由してRequestDispatcherで転送する

<url-pattern>/auth/*</url-pattern> 

index.jspページ上のユーザーがリンクをクリックしますと、このフィルタが実行され、この

 try { 
     HttpSession session = ((HttpServletRequest)request).getSession(); 
     UserBean user = (UserBean)session.getAttribute("currentUser"); 
     if (user != null && user.isValid()){ 
      System.out.println("Filter: context -> " + ((HttpServletRequest)request).getContextPath()); //returns "" 
      chain.doFilter(request, response); 
     } 
     else{ 
      ((HttpServletResponse)response).sendRedirect("/login.jsp"); //works fine 
     } 

次のようになります:

<a href="./auth/view_profile?profile=${sessionScope.currentUser.username}"> 
//yeah, he will 'view' himself - it's just an example 

私はにマッピングされたフィルタを持っていますユーザをViewProfileServletにマップされたサーブレットに移動させて、次の場所にマップされていると仮定します。

<url-pattern>/auth/view_profile</url-pattern> 
そのように見える

:今度はそれがないと仕事、(ない/払いのルートコンテキストでは、)/view_profile.jspにユーザーを取る必要があります

try { 
     String username = (String) request.getParameter("profile"); 

     // here is getting info from database and setting request attributes 
     // works fine 

       //response.sendRedirect("/view_profile.jsp"); 
       System.out.println("ViewProfileServlet: In context -> " + getServletContext().getContextPath()); // returns "" 
       dis = getServletContext().getRequestDispatcher("/view_profile.jsp"); 
       // i've tried request.getRequestDispatcher. no difference 
       System.out.println("ViewProfileServlet: forward to '/view_profile.jsp'"); 
       dis.forward(request, response); 
      } 

。 viewProfileServletが実行され、view_profile.jspが表示されますが、view_profile.jsp上のすべてのリンクがlocalhost:8080/auth/some-page.jspを指しているため、コンテキストがまだ/ authであるようです。また、cssファイルはロードされておらず、(少なくともFirebugによると)リクエストさえされていません。また、ページソースには、cssが存在すると思われる404 Glassfish Errorが表示されます。

私は非常に助けていただければ幸いです.JSPで何かしているのは初めてです。私はここで完全に迷っています。

答えて

3

前方は完全にサーバー側で発生します。ブラウザはそれについて知らない。 /auth/view_profileに要求を送信し、この応答からHTMLを受信すると、サーブレット、JSP、またはそのほかの何かによってHTMLが生成されたかどうかは気にしません。 HTMLを読み込み、それがパス/auth/view_profileから来たものとみなします。したがって、HTML内のすべての相対パスは、/auth/view_profileに相対的です。

絶対の参照画像、JS、CSSパス(およびほとんどの場合でも、他のアクション)へのパスははるかに簡単です。 <c:url>タグを使用してURLを生成すると、web-appのコンテキストパスが先頭に追加されます。

<script src="<c:url value='/js/myScript.js'/>" type="text/javascript"/> 
          ^-- the slash here makes the path absolute. 
+0

回答ありがとうございます。私はにCSSへのパスを変更しましたが、1秒間それは 'localhost:8080/auth/css/styles.css'を要求します。完全に消える。結果は同じです。 – michauwilliam

+0

パスは絶対パスでなければなりません: '/'で始まります。 –

+0

ありがとう:) Cssが動作します。しかし、ページ上のリンクについてはどうすればよいですか?とにかく/ auth/contextを指し示さないようにしていますか?私はを試みましたが、それでも/auth/logout.jspを指しています。 – michauwilliam

関連する問題