gpt4 book ai didi

java - 通过 Java 过滤器后使用 RequestDispatcher 转发

转载 作者:行者123 更新时间:2023-12-04 06:00:41 30 4
gpt4 key购买 nike

首先让我描述一下我想要做什么,我猜这很简单。
我有一个包含用户的网站,并且希望将 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 中做某事,我完全迷失在这里。

最佳答案

转发完全发生在服务器端。浏览器不知道它。当它向 /auth/view_profile 发送请求时,并从该响应接收 HTML,他并不关心 HTML 是由 servlet、JSP、两者还是其他任何东西生成的。它读取 HTML 并认为它来自路径 /auth/view_profile .因此,HTML 中的所有相对路径都相对于 /auth/view_profile .

使用起来要容易得多 绝对引用图像的路径、JS 和 CSS 路径(甚至其他 Action ,大部分时间)。只要确保使用 <c:url>标记以生成 URL,以便预先添加 Web 应用程序的上下文路径:

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

关于java - 通过 Java 过滤器后使用 RequestDispatcher 转发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8942652/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com