您好,我正在升级站点,从 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
来监听旧扩展名 *.nsf
的 url-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/