【问题标题】:Vanity/Fancy/Rewrite URL implementation that does not suckVanity/Fancy/Rewrite URL 实现不烂
【发布时间】:2013-02-23 12:58:25
【问题描述】:

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

有没有很好的模式来实现 Vanity URL 系统?

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

查看源代码的最佳库是什么?

干杯。 赤子

【问题讨论】:

  • 你用的是什么框架?
  • OSGi 兼容,自制框架
  • 你的意思是裸 servlet?
  • 对于某些部分使用 Sling,在其他地方添加 Spring MVC,但主要部分是裸 servlet。

标签: java architecture content-management-system


【解决方案1】:

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

Filter 这样的Filter检查 URL 是否是一个花哨的 URL,在这种情况下会 forward 对适当资源的请求(URL 调度程序或命名的)。您需要保存传入init(FilterConfig)filterConfig.getServletContext() 以创建请求调度程序。如果 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多