java - 从丢失的页面重定向到新页面

标签 java jsp tomcat redirect

您好,我正在升级站点,从 Notes 迁移到 Java JSP,并且需要支持从旧 url 到新 url 的重定向。所以/site/oldpage.nsf?home 需要重定向到/site/newpage.jsp。

在 Tomcat 中,我设置了一个错误页面来重定向: 404 /avi_redirect.jsp

在 avi_redirect.jsp 中我有:

pageContext.forward(  "/newpage.jsp" );

但是因为我需要对很多页面执行此操作,所以我需要知道旧页面名称,即/site/oldpage.nsf?home。
知道我怎么能得到这个吗?响应和 header 没有它。查询字符串有参数但没有 url。

最佳答案

最好为此使用过滤器,而不是 JSP(否则您可能会遇到 IllegalStateException)。还不如使用 redirect 而不是转发(否则旧 URL 将保留在地址栏中)。也宁愿使用 301重定向而不是(默认)302(否则旧 URL 仍将被搜索机器人编入索引)。

因此,您需要创建一个 Filter 来监听旧扩展名 *.nsfurl-pattern 并基本上实现它如下所示:

private static final Map<String, String> urlMapping = new HashMap<String, String>();

static {
    urlMapping.put("/site/oldpage.nsf?home", "/site/newpage.jsp");
    // Put more here.
}

public doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException) {
    HttpServletRequest httpReq = (HttpServletRequest) request;
    String oldUrl = httpReq.getRequestURL().append("?").append(httpReq.getQueryString()).toString();
    String newUrl = urlMapping.get(oldUrl);
    response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
    response.setHeader("Location", newUrl);
}

您看到我已经重构了 URL 以包含查询字符串(? 之后的部分)。

理想情况下,新的 JSP 文件的结构和命名方式与原来的完全相同,只是扩展名不同。这样您就不需要映射,而只需在 URL 上替换一个字符串就足够了:

String newUrl = oldUrl.replace(".nsf", ".jsp");

关于java - 从丢失的页面重定向到新页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2236110/

相关文章:

java - 如何在 Java 中实现成员明智比较?

java - 从 src/groovy 中的 spock 单元测试测试代码访问 grailsApplication

java - 如何通过 Controller POST 请求更新 View 中的某些属性

tomcat - 配置负载均衡器后 Nginx 不工作

Spring Web Controller 在 .html 扩展名下返回 XML

tomcat - 以编程方式识别 Tomcat 的 JDK 版本

java - Java 中的斐波那契内存/动态编程

java - "Cannot attach empty file"- 将内存中的图像共享到 Gmail 时

java - IntelliJ IDEA找不到Tomcat Lib目录

JSP <c :out/> - The default attribute doesn't work?