如何在 Glassfish V3 中重写/重定向 URL?

如何在 Glassfish V3 中重写/重定向 URL?

我想通过删除文件扩展名和缩短 URL 来简化访问 Glassfish V3 应用程序的 URL。

我已经将我的应用程序设置为默认应用程序,因此无需在 URL 中包含上下文根。

我想要:
* 删除文件扩展名
* 缩短文件夹结构深处文件的 URL

我想使用模式匹配而不是基于每个文件来执行此操作(网站目前很小,但会经常更改和增长)。

我想要做的一些例子:
* foo.com/bar.html -> foo.com/bar
* foo.com/folder1/folder2/bar2.html -> foo.com/bar2

任何帮助都将不胜感激。谢谢。

干杯,

答案1

取自http://www.sun.com/bigadmin/sundocs/articles/urlrdn.jsp看起来这就是你要找的东西。

域内的 URL 重定向

您可以使用 redirect_ 属性的 url-prefix 元素将 URL 转发到同一域中的另一个 URL。

以下步骤说明如何允许网站访问者输入http://www.mywebsite.com/myproduct1并重定向或转发至http://www.mywebsite.com/mywarname/products/myproduct1.jsp

  1. 登录到 Sun Java System Application Server 或 GlassFish 的管理控制台。
  2. 在管理控制台中,展开“配置”节点。
  3. 展开服务器配置节点。

    如果您正在运行开发人员域(没有集群功能的域),请忽略此步骤。

  4. 展开 HTTP 服务。

  5. 展开虚拟服务器。
  6. 单击服务器。
  7. 在编辑虚拟服务器页面上,单击添加属性按​​钮。
  8. 在名称列中,键入redirect_1
  9. 如果您使用的是应用程序服务器 9.0,请from=/<context-root>/myproduct1 url-prefix=/mywarname/mypages/products/myproduct1.jsp在值列中键入。

    笔记- 您在此处提供的值<context-root>需要与 web.xml 或 application.xml 文件中指定的上下文根的值相匹配。

    如果您使用的是应用程序服务器 9.1,请from=/myproduct1 url-prefix=/mywarname/mypages/products/myproduct1.jsp在值列中键入。

答案2

在这种情况下,您应该编写一个 javax.servlet.Filter 实现,它可以识别缩短的 URL 并将请求转发到真实目标。

/**
 *
 * @author vrg
 */
@WebFilter(filterName = "SimplifiedUrlRequestDispatcher", urlPatterns = {"/*"})
public class ShortenedUrlRequestDispatcher implements javax.servlet.Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //reading configuration from filterConfig
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest httpRequest = (HttpServletRequest) request;
        String shortURI = httpRequest.getRequestURI();
        String realURI = getRealURI(shortURI);
        if (realURI == null) {
            //in this case the filter should be transparent
            chain.doFilter(request, response);
        } else {
            //forwarding request to the real URI:
            RequestDispatcher rd = request.getRequestDispatcher(realURI);
            rd.forward(request, response);
        }
    }
    /**
     * Calculates the real URI from the given URI if this is a shortened one,
     * otherwise returns null.
     * @param shortURI
     * @return 
     */
    private String getRealURI(String shortURI) {
        //TODO implement your own logic using regexp, or anything you like
        return null;
    }

    @Override
    public void destroy() {
    }

}

答案3

很好!很好的入门书,但还有一件事——RequestDispatcher rd = request.getRequestDispatcher(realURI);使用 servlet 路径操作,获取带有应用程序名称的 URI,会出现错误。所以——req.getServletPath()在没有上下文的情况下给出正确的路径,调度程序就可以正常工作。

相关内容