我已经继承了JAVA Spring MVC Web应用程序。我是Spring MVC的新手,也是JAVA的新手。但是我的首要任务是将应用程序的URL添加到已经通过代码生成的电子邮件中。
基本上,这是用户单击链接并直接转到特定页面的一种方式。但是,当我尝试在这里看到的涉及HttpServletRequest
,更重要的是getRequestURL()
的所有各种事物时。
我只能在Controller接管后获取URL。我需要的是我将称为参照URL的东西-我在浏览器中看到的应用程序URL。
控制器是REST服务,它返回localhost:8181/etc/etc
,甚至不包含该站点的域。我尝试了各种方法,例如getHeader("Referer")
等。同样,它们只是返回后控制器URL。我尝试添加代码以获取正确的URL pre-Controller,然后将其传递给Controller方法。仍然给了我后控制器URL。
答案 0 :(得分:0)
您需要某种HandlerInterceptorAdapter
/ HandlerInterceptor
。
在preHandle
方法内,您可以保留HttpServletRequest
对象。
@Override
public boolean preHandle(
final HttpServletRequest request,
final HttpServletResponse response,
final Object handler
) throws Exception {
// Obtain only the hostname, with the associated port
final String hostOnly = request.getHeader("Host");
// Obtain the request URL, excluding query parameters
final String completeUrl = request.getRequestURL().toString();
// ... Continue towards the method handler
}
request.getRequestURL()
返回一个StringBuffer
,您可以使用它来操作URL,然后再从中构建一个String
。
如果需要,可以将相同的URL检索概念应用于@Controller
/ @RestController
处理程序方法。只需插入HttpServletRequest
作为输入参数即可。
@GetMapping
public ResponseEntity<?> myHandlerMethod(
final HttpServletRequest request,
/* other parameters */) {
...
}
您甚至可以接受WebRequest
或NativeWebRequest
@GetMapping
public ResponseEntity<?> myHandlerMethod(
final WebRequest request,
/* other parameters */) {
final String host = request.getHeader("host");
...
}
@GetMapping
public ResponseEntity<?> myHandlerMethod(
final NativeWebRequest request,
/* other parameters */) {
final HttpServletRequest nativeRequest = request.getNativeRequest(HttpServletRequest.class);
final String host = request.getHeader("host");
...
}
根据您的评论进行编辑。
@PostMapping(value = "myurl/{x}/(y)", produces = ...")
public ResponseEntity<String> doSomething(
final HttpServletRequest request,
@PathVariable("x") final String x,
@PathVariable("y") final String y) {
final String hostOnly = request.getHeader("Host"); // http://yourdomain.com:80
if (service.sendEmail(x, y, hostOnly)) {
return new ResponseEntity<>("...");
}
...
答案 1 :(得分:0)
将类型UriComponentsBuilder
的参数传递到您的控制器方法中,并将使用用户最初用于发出请求的基本上下文预填充该参数。然后,您可以执行以下操作:
String uri = MvcUriComponentsBuilder.relativeTo(uriBuilder)
.withMethodName(MyController.class, "someMethod", parameterValue)
.toUriString();