まず、私がやろうとしていることを説明しましょう。これは非常に簡単だと思います。ユーザーがいる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で何かをするのは初めてで、ここで完全に迷子になっています。