首先让我描述一下我正在尝试做的事情,我猜这很简单。我有一个包含用户的网站,并且希望仅对已登录的用户访问 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 的 servlet 映射到:
<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 显示,尽管上下文似乎仍然是 /auth,因为 view_profile.jsp 上的所有链接都指向 localhost:8080/auth/some-page.jsp。此外,没有加载 css 文件,甚至没有请求它们(至少根据 firebug),并且页面源显示 404 Glassfish 错误,其中 css 应该是。
我将非常感谢任何帮助,这是我第一次在 jsp 中做某事,我完全迷失在这里。