首先让我来描述我正在尝试做的事情,我猜这很简单。 我有一个网站与用户,并希望限制只对已登录用户访问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中做某些事情而且我在这里完全迷失了。
答案 0 :(得分:3)
前进完全发生在服务器端。浏览器不知道它。当它向/auth/view_profile
发送请求并从此响应接收HTML时,他并不关心HTML是否由servlet,JSP,两者或其他任何东西生成。它读取HTML并认为它来自路径/auth/view_profile
。因此,HTML中的所有相对路径都相对于/auth/view_profile
。
使用绝对路径来引用图像,JS和CSS路径(甚至是其他操作,大多数情况下)要容易得多。只需确保使用<c:url>
标记生成网址,以便预先添加网络应用的上下文路径:
<script src="<c:url value='/js/myScript.js'/>" type="text/javascript"/>
^-- the slash here makes the path absolute.