java - 从 Servlet/Filter 重定向不起作用

标签 java servlets servlet-filters

我在重定向方面遇到问题 - 它根本不适用于有效路径。 现在我在 Servlet 中使用页面转发,但我需要在过滤器中进行重定向。

所有页面都位于“pages”文件夹中,并具有 .jspx 扩展名

我尝试了以下方法(此路径适用于转发):

httpResponse.sendRedirect("/pages/login.jspx");

浏览器 URL 为 http://[localhost]/pages/login.jspx,它显示 Tomcat 的 404 页面,上下文路径(在我的例子中为“/hotel”)缺失网址,所以,如果我添加它:

httpResponse.sendRedirect("/hotel/pages/login.jspx");

没有发生重定向,浏览器网址没有更改,并且我看到了浏览器的 404 页面(此程序无法显示网页)。

我做错了什么?

用于测试此问题的过滤器具有以下映射:

@WebFilter(filterName = "SecurityFilter", urlPatterns = "/*")

最佳答案

重定向的 URL 确实相对于最初请求的 URL。要动态添加上下文路径,建议使用 HttpServletRequest#getContextPath()而不是对其进行硬编码,因为上下文路径值可以通过服务器特定的配置在外部进行更改。

至于您的具体问题,我不确定我是否正确理解“浏览器的404页面”,也许您的意思是浏览器默认错误页面,当服务器无法访问或请求已在无限循环(但是应该在浏览器默认错误页面的实际消息中明确说明,至少 Chrome 和 Firefox 是这样做的)。

假设您的过滤器映射到 /* ,它实际上是在无限循环中重定向,因为登录页面的请求 URL 反过来也与过滤器的 URL 模式匹配。

您需要将过滤器置于更具体的 URL 模式上,该模式覆盖登录页面,例如上/secured/*所有受限制的页面都被移到那里(或将其映射到 /pages/* 并将登录页面放在那里),按如下方式修复过滤器:

String loginURL = request.getContextPath() + "/pages/login.jspx";

if (needsToRedirect && !request.getRequestURI().equals(loginURL)) {
    response.sendRedirect(loginURL);
}
else {
    chain.doFilter(request, response);
}

关于java - 从 Servlet/Filter 重定向不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10917242/

相关文章:

java - Spring Data for ElasticSearch 保存方法即使在更新时也会增加计数(不正确)

java - Sitemesh 2.4 版本是否已损坏?

java - 即时应用程序 - 具有可能 firestore 错误的功能模块 默认 FirebaseApp 在此过程中未初始化

java - 虚拟机中的本地主机地址

java - 如何将 Java Servlet 与 Play 框架 Web 套接字混合?

java - servlet 服务方法的目的

java - 是否可以在 visual studio 中调试 JNI DLL?

java - Servlet 初始化内部的 Init 过滤器

java - 使用 Spring Security 实现无缓存

java - 在 GWT 中返回 JSON