虚荣/花式/重写URL实现,不吸引人

时间:2013-02-23 12:58:26

标签: java architecture content-management-system

我有一个网站,实施的虚假URL模块非常糟糕,并且在某些时间段内负载非常高。由于url模块中存在一些错误,系统需要经常重启。所以,我想重写一个血腥的模块,使它变得更好,减少错误......

实施虚荣URL系统是否有良好的模式?

处理虚荣URL以获得高性能时,最好的方法是什么?

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

干杯。 AKO

1 个答案:

答案 0 :(得分:1)

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

此类Filter检查网址是否为花哨,在这种情况下 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。