我想创建网址的网址使用的客户的活动的请求。有什么聪明不是采取目前的 HttpServletRequest 对象和它的 getParameter...() 方法到重建完整的网址,包括(并且只有),它获得的参数。

澄清:如果可能的我要辞职从使用 HttpServletRequest 对象。

有帮助吗?

解决方案

那么有两种方法来访问这些数据更容易,但界面不提供的可能性有一个调用来获取整个URL。你必须手动建立它:

public static String makeUrl(HttpServletRequest request)
{
    return request.getRequestURL().toString() + "?" + request.getQueryString();
}

我不知道的方式与任何Spring MVC的设施来做到这一点。

如果你想不经过它无处不在访问当前请求你将不得不在web.xml中添加一个侦听器:

<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

和然后使用此来获得绑定到当前线程的请求:

((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest()

其他提示

而不是使用 RequestContextHolder 直接,也可以使用 ServletUriComponentsBuilder 和其静态的方法:

  • ServletUriComponentsBuilder.fromCurrentContextPath()
  • ServletUriComponentsBuilder.fromCurrentServletMapping()
  • ServletUriComponentsBuilder.fromCurrentRequestUri()
  • ServletUriComponentsBuilder.fromCurrentRequest()

他们使用 RequestContextHolder 发动机罩下,但提供额外的灵活性以建立新的网址使用的能力 UriComponentsBuilder.

例如:

ServletUriComponentsBuilder builder = ServletUriComponentsBuilder.fromCurrentRequestUri();
builder.scheme("https");
builder.replaceQueryParam("someBoolean", false);
URI newUri = builder.build().toUri();

Java的URI类可以帮助你摆脱这样的:

public static String getCurrentUrl(HttpServletRequest request){
    URL url = new URL(request.getRequestURL().toString());
    String host  = url.getHost();
    String userInfo = url.getUserInfo();
    String scheme = url.getProtocol();
    String port = url.getPort();
    String path = request.getAttribute("javax.servlet.forward.request_uri");
    String query = request.getAttribute("javax.servlet.forward.query_string");

    URI uri = new URI(scheme,userInfo,host,port,path,query,null)
    return uri.toString();
}

在JSP文件:

request.getAttribute("javax.servlet.forward.request_uri")

你还可以添加一个 UriComponentsBuilder 该方法的签名你的控制器的方法。春季会注的一个实例建造者创建的,从目前的请求。

@GetMapping
public ResponseEntity<MyResponse> doSomething(UriComponentsBuilder uriComponentsBuilder) {
    URI someNewUriBasedOnCurrentRequest = uriComponentsBuilder
            .replacePath(null)
            .replaceQuery(null)
            .pathSegment("some", "new", "path")
            .build().toUri();
  //...
}

使用建设者你可以直接开始创建Uri根据当前的请求,例如修改路段。

也参看 UriComponentsBuilderMethodArgumentresolver

如果您需要的网址,直到主机名,而不是路径使用Apache的通用库StringUtil,并从URL中提取子,直到第三的indexOf /

public static String getURL(HttpServletRequest request){
   String fullURL = request.getRequestURL().toString();
   return fullURL.substring(0,StringUtils.ordinalIndexOf(fullURL, "/", 3)); 
}

示例如果 fullURL https://example.com/path/after/url/然后 输出https://example.com

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top