我正在尝试使用SmartGWT创建一个登录页面,并且一直在尝试使用表单身份验证来使用嵌入了Eclipse的GWT插件的Jetty服务器。我有一个页面,使用TextItems获取用户名和密码,然后一旦按下登录按钮,我需要进行身份验证。
我已经设置了我的jetty-web.xml文件来创建一个自定义领域,它目前没有做任何事情,只是告诉我它的方法被调用,所以我知道它正在工作,就像我进入那里一样我很确定我可以把剩下的都搞清楚了。
码头-web.xml中
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
<Get name="SecurityHandler">
<Call name="setUserRealm">
<Arg>
<New class="custom.realm.CustomRealm">
<Set name="name">CustomRealm</Set>
</New>
</Arg>
</Call>
<Call name="setAuthenticator">
<Arg>
<New class="org.mortbay.jetty.security.FormAuthenticator">
<Set name="loginPage">/login.html</Set>
<Set name="errorPage">/login.html</Set>
</New>
</Arg>
</Call>
</Get>
</Configure>
[编辑05/18 1:16 pm]
我的CustomRealm扩展了Jetty的HashUserRealm,如果这可能导致问题,不知道,btu想我也会提到它。
我还在web.xml文件中设置了安全约束
web.xml片段
<security-constraint>
<web-resource-collection>
<web-resource-name>Login</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<!-- <auth-constraint>
<role-name>*</role-name>
</auth-constraint> -->
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>CustomRealm</realm-name>
<form-login-config>
<form-login-page>/login.html</form-login-page>
<form-error-page>/login.html</form-login-page>
</form-login-config>
</login-config>
我很擅长这种类型的东西,tbh。我不确定我是否需要约束。注释掉了,因为当我取消注释时,页面根本不会加载。
根据我的阅读,我认为使用Jetty的安全约束应弹出一个浏览器登录对话框。这不是我想要发生的事情,而且实际上并不是这样。所以我不确定我在那里做错了什么。
我还在GWT中找到了RequestBuilder类,但这似乎没有做我想要的任何事情。我需要登录按钮以某种方式调用我的自定义领域中的身份验证方法。我想知道是否有办法做到这一点?或者至少指向正确的方向,因为我一直在寻找并且没有找到任何东西。
提前感谢。
[编辑05/18 8:56 am] 在Peter的建议之后添加我的RequestBuilder的设置方法
RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, "login.html");
StringBuilder postData = new StringBuilder();
postData.append(URL.encode("j_username")).append("=").append(URL.encode(getUsername()));
postData.append("&");
postData.append(URL.encode("j_password")).append("=").append(URL.encode(getPassword()));
rb.setRequestData(postData.toString());
rb.setHeader("Content-type", "application/x-www-form-urlencoded");
rb.setCallback(new RequestCallback() {
@Override
public void onResponseReceived(Request request, Response response)
{
if (response.getStatusCode() != Response.SC_OK)
{
onError(request, new RequestException(response.getStatusText() + ":\n" + response.getText()));
return;
}
if (response.getText().contains("Access Denied"))
{
Window.alert("Incorrect username or password entered. Please try again.");
}
else
{
System.out.println("IT WORKED!!!");
}
}
@Override
public void onError(Request request, Throwable exception)
{
Window.alert(exception.getMessage());
}
});
try
{
rb.send();
}
catch (RequestException e)
{
SC.say(e.getMessage());
}
[重新更新] 如果取消注释auth-constraint,则永远不会调用onModuleLoad方法。任何人都知道为什么会这样做?