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运行战争.
我怎么能吃蛋糕呢?
如果使用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)
这就是我所做的:
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)
我不知道你所说的“我没有运行 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)
| 归档时间: |
|
| 查看次数: |
18459 次 |
| 最近记录: |