Spring Boot - 如何获取请求的基本URL

Lur*_*k21 5 java spring spring-mvc spring-boot

我正在运行一个spring boot,我的一些域名服务需要知道域名.

我知道我可以在控制器方法的应用层捕获它,如下所示:

 @RequestMapping(value="/myMapping",method = RequestMethod.POST)
 public ModelandView myAction(HttpServletRequest request) {

 }
Run Code Online (Sandbox Code Playgroud)

或者,如果我正在运行一个带有战争的传统Web应用程序,我可以像这样配置一个监听器:

<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
Run Code Online (Sandbox Code Playgroud)

并像这样访问它:

((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest()
Run Code Online (Sandbox Code Playgroud)

但我不想像我在控制器上捕获它那样传递参数,而且我没有使用web.xml运行战争.

我怎么能吃蛋糕呢?

Ser*_*eyB 5

如果使用Spring Security,则可以将此信息存储在SecurityContext中。诀窍是getDetails()方法,您可以在其中放置任何想要的东西。我个人使用了一个自定义对象,该对象存储了当前用户所需的基本信息。这个例子只是放一个简单的字符串代表你的域名:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.security.authentication.AbstractAuthenticationToken;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

@Component
public class DomainInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        String domain = null; // TODO extra domain from request here
        SecurityContext context = SecurityContextHolder.getContext();
        AbstractAuthenticationToken authentication = (AbstractAuthenticationToken) context.getAuthentication();
        authentication.setDetails(domain);
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后要在应用程序中的任何位置检索域(针对当前请求),请执行以下操作:

String domain = SecurityContextHolder.getContext().getAuthentication().getDetails().toString();
Run Code Online (Sandbox Code Playgroud)


Lur*_*k21 5

这就是我所做的:

import javax.servlet.http.HttpServletRequest;

import org.springframework.util.Assert;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

public class RequestFetcher {
    public static HttpServletRequest getCurrentRequest() {
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        Assert.state(requestAttributes != null, "Could not find current request via RequestContextHolder");
        Assert.isInstanceOf(ServletRequestAttributes.class, requestAttributes);
        HttpServletRequest servletRequest = ((ServletRequestAttributes) requestAttributes).getRequest();
        Assert.state(servletRequest != null, "Could not find current HttpServletRequest");
        return servletRequest;
    }
}
Run Code Online (Sandbox Code Playgroud)


Chl*_*loe 5

我不知道你所说的“我没有运行 WAR”是什么意思,但问题被标记为 Spring-MVC,它适用于 Web 应用程序。无论如何,这就是您获取请求域的方法。当浏览器发出请求时,它会发送主机名作为多域 Web 托管的 HTTP 请求标头的一部分。对于 HTTPS,服务器名称标识是相同的。

@RequestMapping(value = "/server/path")
public void request(
        @RequestHeader(name="Host", required=false) final String host,
Run Code Online (Sandbox Code Playgroud)