2

在我的网站上,我使用以下 URL:http://example.com/test%2Ftest2.htm 当我在 HandlerInterceptorAdapter 中打印 getServletPath 时,我看到解码的 servletPath: /test/test2.htm。如何获取未解码的字符串?像:/test/test2&2Ftest2.htm

4

4 回答 4

1

我想出了以下解决方案,关键是创建一个新的 URL 对象。

URL url = new URL(request.getServletPath());
String path = url.getPath();

这将返回所需的未解码字符串。

于 2012-10-31T12:01:18.267 回答
0

HttpServletRequest

getRequestURL() - 重构客户端用来发出请求的 URL。

getQueryString() - 返回路径后面的请求 URL 中包含的查询字符串。

结合 getRequestURL() 和 getQueryString() 的结果应该可以得到你想要的结果。例如

String fullURL = request.getRequestURL().append("?").append( 
     request.getQueryString()).toString();


public static String getUrl(HttpServletRequest req) {
    String reqUrl = req.getRequestURL().toString();
    String queryString = req.getQueryString();   // d=789
    if (queryString != null) {
        reqUrl += "?"+queryString;
    }
    return reqUrl;
}

或者

public static String getURL(HttpServletRequest req) {

    String scheme = req.getScheme();             // http
    String serverName = req.getServerName();     // hostname.com
    int serverPort = req.getServerPort();        // 80
    String contextPath = req.getContextPath();   // /mywebapp
    String servletPath = req.getServletPath();   // /servlet/MyServlet
    String pathInfo = req.getPathInfo();         // /a/b;c=123
    String queryString = req.getQueryString();          // d=789

    // Reconstruct original requesting URL
    StringBuffer url =  new StringBuffer();
    url.append(scheme).append("://").append(serverName);

    if ((serverPort != 80) && (serverPort != 443)) {
        url.append(":").append(serverPort);
    }

    url.append(contextPath).append(servletPath);

    if (pathInfo != null) {
        url.append(pathInfo);
    }
    if (queryString != null) {
        url.append("?").append(queryString);
    }
    return url.toString();
}
于 2012-10-31T11:35:11.533 回答
0

在 URL 中,%2F 完全等同于“/”。所以这是自动为您翻译的,我认为您无法判断这是否已完成。

这种类型的十六进制编码通常用于不允许作为 URL 字符的字符(例如,空格通常编码为 %20),但您可以通过这种方式将任何字符替换为其十六进制代码。

此技术还用于在 URL 语法中、参数名称/值中传递具有特殊含义的字符。例如“?” 和 '&' 用于分隔参数,因此如果表单/参数中使用它们,则需要对它们进行编码以准确地将它们作为数据传递给服务器。

于 2013-05-09T20:55:13.810 回答
0

解决方案:

URI uri = new URI(null, null, request.getServletPath(), null);
String encodedServletPath = uri.toString();

另见: https ://zscribble.wordpress.com/2012/04/20/urlencoder-is-not-for-url-encoding-really/

于 2015-07-15T09:13:50.783 回答