gpt4 book ai didi

jsf-2 - 无需 Servlet API 即可使用 JSF API 获取用户 IP 地址

转载 作者:行者123 更新时间:2023-12-04 21:53:08 26 4
gpt4 key购买 nike

我通过一个简单的表格获得了一些用户数据。在处理相应 backing bean 的 action 方法中的数据时,我目前正在通过这种方式获取用户的 IP 地址:

HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
String ipAddress = request.getHeader( "X-FORWARDED-FOR" );
if ( ipAddress == null ) {
ipAddress = request.getRemoteAddr();
}

还有另一种方式,一种更“JSF”的方式,我不需要挂上 HttpServletRequest ?我读了很多次不得不使用 javax.servlet.*@ManagedBean不是一个好的设计,但我找不到其他任何东西。

最佳答案

不,没有。 ExternalContext 没有委托(delegate)给 ServletRequest#getRemoteAddr() 的方法.

最好的办法是用实用方法将其隐藏起来。 JSF 实用程序库 OmniFaces在许多其他有用的方法中,正是 Faces 中的这种方法。实用程序类: Faces#getRemoteAddr() 这也考虑了转发地址。

source code在这儿:

/**
* Returns the Internet Protocol (IP) address of the client that sent the request. This will first check the
* <code>X-Forwarded-For</code> request header and if it's present, then return its first IP address, else just
* return {@link HttpServletRequest#getRemoteAddr()} unmodified.
* @return The IP address of the client.
* @see HttpServletRequest#getRemoteAddr()
* @since 1.2
*/
public static String getRemoteAddr() {
String forwardedFor = getRequestHeader("X-Forwarded-For");

if (!Utils.isEmpty(forwardedFor)) {
return forwardedFor.split("\\s*,\\s*", 2)[0]; // It's a comma separated string: client,proxy1,proxy2,...
}

return getRequest().getRemoteAddr();
}

请注意 X-Forwarded-For header 表示一个逗号分隔的字符串,您自己的代码没有考虑到这一点。

关于jsf-2 - 无需 Servlet API 即可使用 JSF API 获取用户 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15674315/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com