【问题标题】:Simulate post in grails - spring authetication在 grails 中模拟帖子 - 弹簧身份验证
【发布时间】: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
        }
    }

【问题讨论】:

标签: spring jakarta-ee grails spring-security grails-2.0


【解决方案1】:

您似乎正在使用 android SDK 进行调用。这就是我用来将数据发布到 REST API(由 Grails 提供支持)的方法:

HttpClient httpClient = getHttpClient();
List<NameValuePair> postParams = new ArrayList<NameValuePair>();
postParams.add( new BasicNameValuePair( "j_username", "username" ) );
postParams.add( new BasicNameValuePair( "j_password", "password" ) )
HttpPost httppost = new HttpPost( url );
httppost.setEntity( new UrlEncodedFormEntity( postParams, HTTP.UTF_8 ) );
httpPost.addHeader( "X-Requested-With", "XMLHttpRequest" );
HttpResponse hr = httpClient.execute( httppost );
JSONObject res = readStreamUsingReader( hr );

【讨论】:

  • 非常感谢,这是一个更好的代码。我更新了我原来的帖子。不幸的是,即使我得到了服务器的回复,我仍然无法获得我应该得到的 json。看我的原帖。非常感谢
猜你喜欢
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 2012-08-16
相关资源
最近更新 更多