我一直在寻找一种方法,将客户端ip以及用户ID和密码从JAAS登录页面传递到我的Web代码中的JAAS登录模块实现。 JAAS仅允许将用户标识和密码传递给登录模块。我的想法是有一个java脚本代码将ip地址附加到用户ID,然后调用表单提交。我只是没有正确的java脚本代码来执行此操作。你能帮忙吗?

网页有两个输入字段,j_userid和j_password,JAAS代码知道这些字段。那么我可以使用什么javaScript代码在表单提交之前将ip地址添加到j_userid字段。我在考虑'ip-address#userid',然后在我的登录模块中,我将从用户ID中取出ip地址。

有帮助吗?

解决方案

我创建了这两个javaScript函数。

function addIpSubmit() 
{                 
    var theForm = document.getElementById("login_form");
    var userName = theForm.username.value;
    userName = theForm.clientip.value + "#" + userName;
    theForm.j_username.value = userName;
    if( validate_required( theForm.username, "User ID is required" ) )
    {
        if(  validate_required( theForm.j_password, "Password is required" ) )
        {
            theForm.submit();
        }
    }
}  

function validate_required( field, alerttxt )
{
    with (field)
    {
        if (value==null||value=="")
        {
            alert(alerttxt);
            return false;
        }
        else
        {
            return true;
        }
    }
}

从登录按钮调用addIpSubmit。你可以看到我有一个bean将ip地址放入隐藏字段。 j_username JAAS字段也是隐藏的,并由addIpSubmit()函数填充。

<input id="clientip" type="hidden" name="clientip" value="#{loginMBean.ip}"/>
<input id="j_username" type="hidden" name="j_username" />
<input type="button" name="OtherLogin" value="Login" onclick="addIpSubmit()" />

它将ip添加到用户名并调用JAAS提交函数。然后在登录模块中,我获取了ip地址和用户名。

String userid = username;

if( username.contains( "#" ) )
{
    ip = username.split( "#" )[0];
    userid = username.split( "#" )[1];
}

请记住FacesContext.getCurrentInstance()。getExternalContext()。getRemoteUser()现在有ip#userid。

其他提示

抱歉,我认为有一种方法可以在客户端获取ip,只需使用简单的Javascript。

如果您不控制客户端和服务器之间的基础结构(负载均衡器,代理......),则可能无法在服务器端测试远程IP。 如果你确信远程ip是客户端的ip,你应该能够破解tomcat Valve或servlet过滤器。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top