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は返されなくなります.