链接检查期间maven-linkcheck-plugin警告:cookie被拒绝,非法域属性

时间:2016-02-15 16:29:45

标签: java maven cookies apache-httpclient-4.x doxia

我正在使用

生成项目网站
mvn site

Linkcheck作为报告插件激活

<reporting>
    <plugins>
        (...)
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-linkcheck-plugin</artifactId>
            <version>1.2</version>
        </plugin>
    </plugins>
</reporting>

代码是Java。

类文件的注释标题包含指向StackOverflow问题的链接,例如

/**
 * Example written by Bruno Lowagie in answer to:
 * https://stackoverflow.com/questions/26853894/continue-field-output-on-second-page-with-itextsharp
 */

在网站生成的链接检查阶段,我收到如下警告:

[ WARN] Cookie rejected: "$Version=0; __cfduid=dab443ca4b7fc1de5130856b7401f83cb1455551507; $Path=/; $Domain=.stackoverflow.com". Illegal domain attribute ".stackoverflow.com". Domain of origin: "stackoverflow.com"
[ WARN] Cookie rejected: "$Version=0; logged_in=no; $Path=/; $Domain=.github.com". Illegal domain attribute ".github.com". Domain of origin: "github.com"

我已经看过其他一些关于“Cookie被拒绝:非法域名属性”的问题。根据{{​​3}},问题不在我的最后,它是StackOverflow和GitHub正在设置一个它不允许发送的cookie,而maven-linkcheck-plugin的底层http库正在告诉我。此行为完全由this aswer指定。

链接的问题提供了一种解决方法:在httpclient中设置一个Cookie政策,基本上说,我不关心错误的Cookie, gimme gimme gimme 。我需要容忍不合规的服务器,所以我需要使用浏览器兼容性cookie规范,如RFC 2109中所述。

我的问题是:由于我不使用httpclient但使用maven,我应该在pom.xml中放置哪些内容来消除这些Cookie警告?

我找不到任何有用的东西

1 个答案:

答案 0 :(得分:1)

我也受到此问题的影响。

您提到的链接检查文档显示有一个httpClientParameters configuration option

  

httpClientParameters

     

在获取链接时要使用的额外HttpClient参数。例如:

     
<httpClientParameters>
 <property>
  <name>http.protocol.max-redirects</name>
  <value>10</value>
 </property>
</httpClientParameters>
     

请参见HttpClient preference page

底部的链接显示http.protocol.cookie-policy是HttpClient参数之一。

理论上,您可以在pom中执行以下操作以配置基础的httpclient:

<reporting>
    <plugin>
        <artifactId>maven-linkcheck-plugin</artifactId>
        <version>1.2</version>
        <configuration>
            <httpClientParameters>
                <property>
                    <name>http.protocol.cookie-policy</name>
                    <value>ignoreCookies</value>
                </property>
            </httpClientParameters>
        </configuration>
    </plugin>
</reporting>

ignoreCookiesCookiePolicy.IGNORE_COOKIES的字符串值。

实际上,这是行不通的。如您所述,这里有maven-linkcheck-plugin-> doxia-linkcheck-> httpclient层。调试报告生成后,我可以看到MLP将参数传递到doxia-linkcheck中,但是right about here发生了一些不幸的事情。

if ( this.cl == null )
{
    initHttpClient();
}

if ( this.http.getHttpClientParameters() != null )
{
    for ( Map.Entry<Object, Object> entry : this.http.getHttpClientParameters().entrySet() )
    {
        if ( entry.getValue() != null )
        {
            System.setProperty( entry.getKey().toString(), entry.getValue().toString() );
        }
    }
}

cl是将发出请求的httpclient,http是一个bean,其中包含在pom中配置的值。不再将它们放在一起,而是将Bean属性转储到系统属性空间中,并且httpclient不在此处。有一个明显的例外,http.protocol.max-redirects在代码的其他地方得到了特殊的处理,巧合的是maven-linkcheck-plugin文档中使用的示例。因此,看起来这个通用功能确实针对特定的东西,而通用用例却被忽略了。

因此,我们已经用尽了正确配置它的能力,还剩下什么?我们可以使记录器静音。如今,Maven将SLF4JSimpleLogger一起使用,但是doxia-linkcheck在log4j 1.2.14中使用了commons-logging。对于我们来说,旧的log4j很难重新配置为外部用户,但是我们可以通过在pluginManagement部分中添加maven‑linkcheck‑plugin并添加桥接依赖项来填充SLF4J:

<pluginManagement> 
    <plugin>
        <artifactId>maven-linkcheck-plugin</artifactId>
        <version>1.2</version>
        <dependencies>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>jcl-over-slf4j</artifactId>
                <version>1.7.28</version>
            </dependency>
        </dependencies>
    </plugin>
</pluginManagement>

您现在可以通过提高相关记录器的日志级别来隐藏警告:

mvn site -Dorg.slf4j.simpleLogger.log.org.apache.commons.httpclient.HttpMethodBase=error

作为奖励,插件中其余的日志记录现在使用的是maven的日志记录系统,而不是log4j,因此您可以获得彩色输出和一致的格式。

但是,您可能不想指定该系统属性来在每次生成站点时调整日志。我建议使用.mvn/jvm.config文件:

mkdir -p .mvn && cd .mvn
echo "-Dorg.slf4j.simpleLogger.log.org.apache.commons.httpclient.HttpMethodBase=error" >>jvm.config

如果您真的想将其全部保留在pom中,那么还有properties-maven-plugin

这一切都是为了更好地修复doxia-linkcheck中的某些东西,但最近它没有看到太多发展。