2

まず、私がやろうとしていることを説明しましょう。これは非常に簡単だと思います。ユーザーがいるWebサイトがあり、view_profile.jspページへのアクセスをログに記録されたユーザーのみに制限したいと考えています。私は次のようにマップされたフィルターを持っています:

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

このように見えます

        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
        }

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

<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>

そのように見えます:

    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);
            }

これにより、ユーザーは/view_profile.jsp(/ authではなくルートコンテキスト内)に移動して機能するはずですが、機能しません。何が起こるかというと、ViewProfileServletが実行され、view_profile.jspが表示されますが、view_profile.jsp上のすべてのリンクがlocalhost:8080 / auth / some-page.jspを指しているため、コンテキストはまだ/authであるように見えます。また、cssファイルはロードされておらず、要求されていません(少なくともfirebugによると)。ページのソースには、cssが想定している404GlassfishErrorが表示されます。

助けていただければ幸いです。jspで何かをするのは初めてで、ここで完全に迷子になっています。

4

1 に答える 1

3

転送は完全にサーバー側で行われます。ブラウザはそれを知りません。にリクエストを送信し、/auth/view_profileこのレスポンスからHTMLを受信する場合、HTMLがサーブレット、JSP、またはその両方によって生成されたかどうかは関係ありません。HTMLを読み取り、パスからのものであると見なします/auth/view_profile。したがって、HTML内のすべての相対パスは。に相対的/auth/view_profileです。

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

<script src="<c:url value='/js/myScript.js'/>" type="text/javascript"/>
                           ^-- the slash here makes the path absolute. 
于 2012-01-20T14:40:04.930 に答える