【发布时间】:2014-09-16 10:16:57
【问题描述】:
我正在尝试向这个标准的 spring url 发布一个帖子,以模拟身份验证:
http://www.whateverAddress.is:8080/Test/j_spring_security_check
如果我使用插件海报,它可以正常工作,我输入两个参数 j_username 和 j_password 以及一个标头参数 X-Requested-With=XMLHttpRequest ,实际上我得到了一个 json 结果。
如果我尝试通过 Java 中的代码、Google 中的大量示例来实现,它似乎不起作用。目前我正在使用此代码,但我没有得到任何回报:
HttpClient httpClient = new DefaultHttpClient();
List<NameValuePair> postParams = new ArrayList<NameValuePair>();
postParams.add(new BasicNameValuePair("j_username", "username"));
postParams.add(new BasicNameValuePair("j_password", "password"))
HttpPost httpPost = new HttpPost("http://www.whateverAddress.is:8080/Test/j_spring_security_check");
httpPost.setEntity(new UrlEncodedFormEntity(postParams, HTTP.UTF_8));
httpPost.addHeader("X-Requested-With", "XMLHttpRequest");
HttpResponse response = httpClient.execute(httpPost);
HttpEntity entity = response.getEntity();
String responseString = EntityUtils.toString(entity, "UTF-8");
System.out.println(responseString);
如果我打印响应,(不是实体)我有以下内容:
HTTP/1.1 302 找到 [服务器:Apache-Coyote/1.1,Set-Cookie:grails_remember_me="";过期=周四,1970 年 1 月 1 日 00:00:10 GMT;路径=/测试,设置Cookie:JSESSIONID=247CF8B70D589F053DE4C937F2E16B9D;路径=/测试/; HttpOnly,位置:http://www.whateverAddress.is:8080/Test/login/authfail?ajax=true,内容长度:0,日期:2014 年 9 月 16 日星期二 12:04:12 GMT]
这是代码 302,就像我被重定向而不是代码 200 和 json,正如海报插件向我展示的那样。
更新 我创建了一个触发 ajax 发布请求的按钮,正如我应该能够从 java 代码端执行的那样,这里是代码:
$(function() {
$('#btnPush').on('click', function() {
$.ajax({
url: 'http://www.whateverAddress.is:8080/Test/j_spring_security_check',
type: 'POST',
data: {
j_username: 'username',
j_password: 'password'
},
success: function(data, textStatus, jqXHR) {
alert('Success!!!');
},
error: function(jqXHR, textStatus, errorThrown) {
alert('Fail!');
}
});
});
});
查看发送的请求,我看到标头和收到的 JSON,一切都很好。如果我在 java 端复制相同的标头,仍然没有任何反应。我想念一些东西
最后更新 - 关闭 基本上,一旦发布完成,我们需要使用 auth cookie 跟随重定向来获取正确的信息:
def headers = ["X-Requested-With": "XMLHttpRequest"]
def postParams = ["j_username": user, "j_password": pwd]
def url = "http://www.whatever.is:8080/test/j_spring_security_check"
def returnstring = doHttpPost(url, postParams, headers)
private String doHttpPost(String url, Map<String, String> params, Map<String, String> headers) {
HttpClient client = new DefaultHttpClient()
HttpPost post = new HttpPost(url)
String result
try {
List<NameValuePair> urlParameters = new ArrayList<NameValuePair>()
headers?.each {
post.setHeader(it.key, it.value)
}
params?.each {
urlParameters.add(new BasicNameValuePair(it.key, it.value))
}
if (params) {
post.setEntity(new UrlEncodedFormEntity(urlParameters))
}
HttpResponse response = client.execute(post)
if (response.getStatusLine()?.getStatusCode() == 200) {
result = response.getEntity().getContent()?.text
}
if (response.getStatusLine()?.getStatusCode() == 302) {
String redirectUrl = response.getHeaders("Location")?.value[0]
result = doHttpGet(redirectUrl, ["Cookie": response.getHeaders("Set-Cookie")?.value[0]])
}
} catch (Exception ex) {
log.error(ex)
} finally {
post.getEntity().consumeContent()
return result
}
}
【问题讨论】:
-
您在登录尝试后被重定向到
loginUrl。安全 Servlet/过滤器似乎无法识别请求是作为 AJAX 发送的。尝试添加更多标头以使服务器正确识别它。 -
我尝试复制相同的标题但没有成功
-
你是对的对不起,修复它。这只是为了解释。
标签: spring jakarta-ee grails spring-security grails-2.0