Kor*_*tor 85 url spring-mvc httprequest
我想根据客户端为活动请求使用的URL创建URL.有没有什么比采取当前HttpServletRequest对象更聪明,它的getParameter...()方法是重建完整的URL,包括(和仅)它的GET参数.
澄清:如果可能,我想退出使用HttpServletRequest对象.
Daf*_*aff 102
那么有两种方法可以更容易地访问这些数据,但是接口不提供通过一次调用获取整个URL的可能性.你必须手动构建它:
public static String makeUrl(HttpServletRequest request)
{
return request.getRequestURL().toString() + "?" + request.getQueryString();
}
Run Code Online (Sandbox Code Playgroud)
我不知道如何使用任何Spring MVC工具执行此操作.
如果要访问当前请求而不在任何地方传递它,则必须在web.xml中添加一个侦听器:
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
Run Code Online (Sandbox Code Playgroud)
然后使用它来获取绑定到当前Thread的请求:
((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest()
Run Code Online (Sandbox Code Playgroud)
Kor*_*tor 65
RequestContextHolder您也可以使用ServletUriComponentsBuilder其静态方法而不是直接使用:
ServletUriComponentsBuilder.fromCurrentContextPath()ServletUriComponentsBuilder.fromCurrentServletMapping()ServletUriComponentsBuilder.fromCurrentRequestUri()ServletUriComponentsBuilder.fromCurrentRequest()它们RequestContextHolder在底层使用,但提供了额外的灵活性,可以使用它们的功能构建新的URL UriComponentsBuilder.
例:
ServletUriComponentsBuilder builder = ServletUriComponentsBuilder.fromCurrentRequestUri();
builder.scheme("https");
builder.replaceQueryParam("someBoolean", false);
URI newUri = builder.build().toUri();
Run Code Online (Sandbox Code Playgroud)
小智 16
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();
}
Run Code Online (Sandbox Code Playgroud)
小智 8
在jsp文件中:
request.getAttribute("javax.servlet.forward.request_uri")
Run Code Online (Sandbox Code Playgroud)
您还可以将 a 添加UriComponentsBuilder到控制器方法的方法签名中。Spring 将注入从当前请求创建的构建器实例。
@GetMapping
public ResponseEntity<MyResponse> doSomething(UriComponentsBuilder uriComponentsBuilder) {
URI someNewUriBasedOnCurrentRequest = uriComponentsBuilder
.replacePath(null)
.replaceQuery(null)
.pathSegment("some", "new", "path")
.build().toUri();
//...
}
Run Code Online (Sandbox Code Playgroud)
使用构建器,您可以根据当前请求直接开始创建 URI,例如修改路径段。
另见UriComponentsBuilderMethodArgumentResolver
| 归档时间: |
|
| 查看次数: |
134269 次 |
| 最近记录: |