java - 经过Java Filter后用RequestDispatcher转发

标签 java jsp servlets servlet-filters requestdispatcher

首先让我描述一下我想要做的事情,我猜这很简单。 我有一个包含用户的网站,并且希望仅允许登录的用户访问 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 路径(大多数时候甚至是其他操作)要容易得多。只需确保使用 <c:url>标记来生成 URL,以便在前面添加 Web 应用程序的上下文路径:

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

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

相关文章:

具有最近一小时值的 Java 计数器

java - android Intent 构造函数中 `this`和 `ActivityClass.this`有什么区别?

java - 使用 Java 代码将文本插入到由 XPath 表达式定位的 XML 节点中

java - 将没有任何循环的二维数组的 C++ 递归填充实现转换为 Java?

javascript - 为什么 `onclick()`在表单提交之前被调用?

java - 如何在现有背景图像上添加侧边菜单(导航菜单)

javascript - 刷新 tiles 中的 jsp

java - 如何在Servlet中写入txt文件并在请求时自动下载

java - JSP 中的 session.getAttribute() 给出空值

java - 使用cookies API获取sessionId而不访问session