开发者

Converting GET method url's to logical permanent links

I have a J2EE application with a web service which goes like

http://servername/service?task=getFile&id=25

How can I convert these type of urls to

http://servername/service/getFile/25
http://servername/service/getF开发者_如何学JAVAile/26

etc?

Please provide your suggestions.


You can use the UrlRewriteFilter in order to achieve this. You will just have to write the rules for rewriting, similar to mod_rewrite. For example:

<rule>
    <from>^/products/([0-9]+)$</from>
    <to>/products/index.jsp?product_id=$1</to>
</rule>


To the point, you thus want to forward the friendly URL to an unfriendly URL (so that you don't need to change existing request parameter collecting logic of the servlet) and to redirect the unfriendly URL to an friendly URL (so that the friendly URL get reflected in the browser address bar of the client).

The best place for this is a Filter. To access the HttpServletRequest, just downcast ServletRequest to HttpServletRequest. You can get the query string by getQueryString() and you can get the pathinfo by getRequestURI(). Here's a kickoff example:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    throws IOException, ServletException
{
    HttpServletRequest httpreq = (HttpServletRequest) request;
    String query = httpreq.getQueryString();
    if (query != null) {
        // Unfriendly URL invoked. Convert params to pathinfo and redirect.
        StringBuffer newURL = httpreq.getRequestURL();
        for (String param : query.split("&")) {
            newURL.append('/').append(param.substring(param.indexOf('=') + 1));
        }
        ((HttpServletResponse) response).sendRedirect(newURL.toString());
    } else {
        // Friendly URL invoked. Convert pathinfo to params and forward.
        String[] parts = httpreq.getRequestURI().replace(httpreq.getContextPath(), "").split("/");
        String newURL = String.format("%s?task=%s&id=%s", parts[1], parts[2], parts[3]);
        httpreq.getRequestDispatcher(newURL).forward(request, response);
    }
}

You can of course also grab the aforementioned UrlRewriteFilter.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜