You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中XML-RPC携带Cookie访问MoinMoinWiki遇权限问题求助

解决方案

1. 确保Maven依赖正确

首先需要引入Apache XML-RPC的HTTP客户端适配器及Apache HttpClient依赖,才能正常使用Cookie相关类:

<dependencies>
    <!-- Apache XML-RPC核心依赖 -->
    <dependency>
        <groupId>org.apache.xmlrpc</groupId>
        <artifactId>xmlrpc-client</artifactId>
        <version>3.1.3</version>
    </dependency>
    <!-- XML-RPC HTTP客户端适配器 -->
    <dependency>
        <groupId>org.apache.xmlrpc</groupId>
        <artifactId>xmlrpc-httpclient</artifactId>
        <version>3.1.3</version>
    </dependency>
    <!-- Apache HttpClient -->
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.14</version>
    </dependency>
</dependencies>

2. 修正后的代码实现

核心是将带Cookie的自定义HttpClient绑定到XmlRpcClient的传输层,并正确配置Cookie的域名和路径:

import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.cookie.BasicClientCookie;
import org.apache.http.client.CookieStore;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
import org.apache.xmlrpc.client.XmlRpcHttpClientTransportFactory;

import java.net.URL;
import java.util.HashMap;

public class MoinMoinWikiClient {
    private final XmlRpcClient client;

    public MoinMoinWikiClient(String wikiUrl, String phpSessId, String otherCookie) throws Exception {
        String endpointUrl = wikiUrl + "/moinmoin/?action=xmlrpc2";
        XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
        config.setServerURL(new URL(endpointUrl));

        // 创建CookieStore并添加指定Cookie
        CookieStore cookieStore = new BasicCookieStore();
        URL wikiDomainUrl = new URL(wikiUrl);
        
        // 配置PHPSESSID Cookie,必须指定域名和路径才会被正确携带
        BasicClientCookie phpSessCookie = new BasicClientCookie("PHPSESSID", phpSessId);
        phpSessCookie.setDomain(wikiDomainUrl.getHost());
        phpSessCookie.setPath("/");
        
        // 配置OTHER_COOKIE
        BasicClientCookie otherCookieObj = new BasicClientCookie("OTHER_COOKIE", otherCookie);
        otherCookieObj.setDomain(wikiDomainUrl.getHost());
        otherCookieObj.setPath("/");
        
        cookieStore.addCookie(phpSessCookie);
        cookieStore.addCookie(otherCookieObj);

        // 创建带CookieStore的HttpClient
        CloseableHttpClient httpClient = HttpClients.custom()
                .setDefaultCookieStore(cookieStore)
                .build();

        // 将自定义HttpClient绑定到XmlRpcClient的传输层
        this.client = new XmlRpcClient();
        client.setConfig(config);
        client.setTransportFactory(new XmlRpcHttpClientTransportFactory(client, config) {
            @Override
            protected CloseableHttpClient getHttpClient() {
                return httpClient;
            }
        });

        // 测试权限页面请求
        String restrictedPageName = "your_restricted_page";
        HashMap<String, Object> result = (HashMap<String, Object>) client.execute("getPageInfo", new Object[]{restrictedPageName});
        System.out.println("受限页面信息:" + result);
    }
}

关键注意点

  • 必须设置Cookie的domain和path:如果不指定,HttpClient会判定Cookie与请求URL不匹配,不会自动携带。
  • 替换XmlRpcClient的传输工厂:默认XmlRpcClient使用Java原生URLConnection,不会复用你创建的带Cookie的HttpClient,必须通过XmlRpcHttpClientTransportFactory替换传输实现。
  • 移除BasicAuth配置:既然使用Cookie认证,无需再重写getBasicUserName和getBasicPassword方法,避免认证逻辑冲突。

内容的提问来源于stack exchange,提问作者RoboDude

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 11:05:21