我想根据客户端用于活动请求的URL来创建URL。有什么比使用当前的HttpServletRequest
对象和它的getParameter...()
方法来重新构建完整的URL (包括(并且只包含)它的GET参数)更聪明的吗?
澄清:如果可能,我想退出使用 HttpServletRequest
对象。
发布于 2009-09-29 06:58:25
有两种方法可以更容易地访问这些数据,但该接口不提供通过一次调用获取整个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>
然后使用此命令获取绑定到当前Thread的请求:
((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest()
发布于 2017-03-07 21:58:21
您还可以使用ServletUriComponentsBuilder
及其静态方法,而不是直接使用RequestContextHolder
:
ServletUriComponentsBuilder.fromCurrentContextPath()
ServletUriComponentsBuilder.fromCurrentServletMapping()
ServletUriComponentsBuilder.fromCurrentRequestUri()
ServletUriComponentsBuilder.fromCurrentRequest()
它们在幕后使用RequestContextHolder
,但为使用UriComponentsBuilder
的功能构建新的URL提供了额外的灵活性。
示例:
ServletUriComponentsBuilder builder = ServletUriComponentsBuilder.fromCurrentRequestUri();
builder.scheme("https");
builder.replaceQueryParam("someBoolean", false);
URI newUri = builder.build().toUri();
发布于 2015-04-13 16:51:18
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();
}
https://stackoverflow.com/questions/1490821
复制相似问题