【问题标题】:How to make servlet map a special url to a static resource?如何使 servlet 将特殊 url 映射到静态资源?
【发布时间】:2014-06-05 10:45:32
【问题描述】:

我知道,默认的 servlet 会自动返回静态资源。但是,我的 url 很特别,我不希望它看起来像 http://mysite/app/test.html。也许是这样的:

http://mysite/app/dosomething/7419698f

我想将此请求映射(或转发?)到静态 html 文件,例如 /WEB-INF/pages/dowork.html。更重要的是,7419698f 只是一个参数,http://mysite/app/dosomething/2926739e 也会映射到同一个静态文件。我知道这样的解决方法:

<servlet>
    <servlet-name>test</servlet-name>
    <jsp-file>/pages/dowork.html</jsp-file>
</servlet>
<servlet-mapping>
    <servlet-name>test</servlet-name>
    <url-pattern>/dosomething/*</url-pattern>
</servlet-mapping>

仅当 dowork.html 是合法的 jsp 文件时才有效。如果我想提供这样的图像资源,它会变成错误。

【问题讨论】:

标签: java servlets web.xml url-mapping


【解决方案1】:

default servlet 映射你的URL(你不需要声明它)

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/dosomething/*</url-pattern>
</servlet-mapping>

【讨论】:

  • 我刚开始认为我的答案是错误的,并且重定向 servlet / 过滤器是必要的。晚上我会做一些原型。
【解决方案2】:

Leos Literak 的线索是正确的。我的要求不能通过简单的 xml 配置来完成,我必须做更多的事情。

我需要一个过滤器。在 web.xml 中:

<filter>
    <filter-name>summary-fw-filter</filter-name>
    <filter-class>com.mycompany.mywebapp.filter.SummaryForwardFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>summary-fw-filter</filter-name>
    <url-pattern>/summary/*</url-pattern>
</filter-mapping>

过滤器的代码:

public class SummaryForwardFilter implements Filter{
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        HttpServletResponse response = (HttpServletResponse)servletResponse;
        String url = request.getRequestURL().toString();
        String[] urlSegments = url.split("/");
        String guid = urlSegments[urlSegments.length-1];
        if(guid.matches("^[a-fA-F0-9]{8}(-[a-fA-F0-9]{4}){3}-[a-fA-F0-9]{12}$")){
            request.getRequestDispatcher("/WEB-INF/pages/summary.jsp").forward(servletRequest, servletResponse);
            return;
        }
        response.sendError(HttpServletResponse.SC_NOT_FOUND);
    }

    @Override
    public void destroy() {
    }
}

然后,url http://mysite/mywebapp/summary/ecef22d6-7aa6-49db-b0d3-6577a63d14c8 将被映射到 /WEB-INF/pages/summary.jsp。尝试映射到非jsp文件时也可以。

guid 参数可以通过 javascript 代码检索,如下所示:

function extractGuid(value) {
    var re = /[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}/i;
    var match = re.exec(value);
    return match ? match[0] : null;
}

var guid = extractGuid(window.location.href);

【讨论】:

    猜你喜欢
    • 2016-06-09
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 2014-10-02
    • 2012-09-07
    • 2018-12-08
    相关资源
    最近更新 更多