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
相关产品推荐
相关产品推荐

