1

我有一个网站,Vanity URL 模块的实现非常糟糕,并且在某些时间段内负载非常高。由于 url 模块中的一些错误,系统需要每隔一段时间重新启动一次。所以,我想重写一个血腥的模块,让它变得更好,更少错误……

是否有一个很好的模式来实现 Vanity URL 系统?

处理 Vanity URL 以获得高性能时的最佳方法是什么?

查看资源的最佳图书馆是什么?

干杯。赤子

4

1 回答 1

1

我不确定您的应用程序的具体实现细节,但作为一般草图,我会写一个Filter映射到感兴趣的 URL 空间(也许是/*)。

Filter检查 URL 是否是一个花哨的,在这种情况下,将forward请求适当的资源(URL 调度程序或命名的资源)。您需要保存filterConfig.getServletContext()传入的内容init(FilterConfig)才能创建请求调度程序。如果 URL 不是花哨的,过滤器将调用chain.doFilter(req, resp),然后提供非映射资源。

public class ExceptionFilter implements Filter {
    private ServletContext servletContext;

    public void destroy() {}
    public void doFilter(ServletRequest req, 
                         ServletResponse resp, 
                         FilterChain chain) 
      throws IOException, ServletException {        
        String mapping = getMappingFor((HttpServletRequest)req);
        if(mapping!=null) servletContext.getRequestDispatcher(mapping).forward(req,resp);
        else chain.doFilter(req, resp);
    }

    public void init(FilterConfig filterConfig) throws ServletException {
       this.servletContext = filterConfig.getServletContext();
    }

    private String getMappingFor(HttpServletRequest req) {...}

如何getMappingFor实现取决于应用程序,但它可能会打开到数据库的连接并询问 URL /foo/bar 是否已映射,返回映射的 URL 或null是否没有映射。如果已知映射不会更改,则可以缓存已检索到的那些映射。

您可能会使用更详细的实现,例如根据给定的 URL 或数据库中的信息设置一些请求属性,然后将请求转发给知道该做什么的某个 servlet。

于 2013-02-23T13:26:05.807 回答