Jettyのサーブレットにリクエストを送ると302を返されてハマったメモ

かなり悩んだ.

具体的な症状としては,Android上のアプリケーションからHttpClientを用いて

http://localhost:8080/someservice

で動作しているサーブレットにContent-Type:multipart/form-dataでデータのアップロードをするときだけ302が返されるというもの.Content-Typeを指定していない場合は正常につながりました.

まったく理由がわからず色々試していたところ,

http://localhost:8080/someservice/

という感じにURLの終端に"/"を付けるとうまくいく事が発覚.調べてみると,Webサーバの仕様上(?) "/"で終わっていないURLに対してリクエストをした際Null Path Redirectionという現象が発生する為,クライアントに302が返されていたらしい.(どこかに書いてたんだけど,ソースを失念した・・)


ここで動かしているサーブレットはJetty+Mavenで作っていて,以下のような設定を書くことでこの症状を回避できました.

<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure 
1.2//EN" "http://jetty.mortbay.org/configure_1_2.dtd">
 
<Configure class="org.mortbay.jetty.handler.ContextHandler">
   <Set name="AllowNullPathInfo" type="boolean">true</Set>
</Configure>

この内容を src/main/webapp/WEB-INF/jetty-web.xml とかに保存します.更にpom.xml内で,

<plugin>
  <groupId>org.mortbay.jetty</groupId>
  <artifactId>maven-jetty-plugin</artifactId>
  <configuration>
    <jettyEnvXml>
      ${basedir}/src/main/webapp/WEB-INF/jetty-web.xml
    </jettyEnvXml>
  </configuration>
</plugin>

といったように上で作ったjetty-web.xmlを読み込むようにします.これでリクエスト先URLの終端が"/"で終わっていなくても302は返されなくなります.