0

私はかなり標準的なSpring 3.0.7 Webアプリを持っています

構造はこんな感じ

WebContent/
    resources/
      myStaticConent/
    WEB-INF/
       views/
       myProtectedContent/

静的コンテンツの構成を使用して<mvc:resources>おり、コントローラーは WEB-INF/views から InternalViewResolver を使用してビューを取得します

現在、WEB-INF の保護されたディレクトリから非 JSP コンテンツ (JPG、PNG、HTML など) を返す必要があります。

そのため、ユーザーは http:myWebApp/myProtectedContent のような URL を入力し、保護されたコンテンツ コントローラーをヒットする可能性があります。

@Controller
public class HelloWorldController {

@RequestMapping(value="/myProtectedContent")
public String index() {
  return "myjpg.jpg";
 }
}

基本的に、ビューと同じように条件付きでファイルを提供したいと考えています。これを行う方法を知っている人はいますか?

ここで他の方法のいくつかを見ました。Inputstream を使用したスト​​リーミングは、本質的に静的なファイルにはやり過ぎのようです。別の「ビュー」タイプを登録できますか? これを (Web ブラウザー側から) 標準の http 要求応答 (現在のビューの実装など) のように表示する必要があります。

ResourceBundleResolver のような Spring の「その他の」ビュー リゾルバーよりもファイル アクセス メソッドを使用する方がよい理由がない限り、独自のファイル処理メソッドを発明することは本当に避けたいと思います。

したがって、要件は、jsp でラップしたり、JSTL ビューでファイルを解釈したりせずに、WEB-INF 内から可変ファイル タイプ (jpg、png、html) の http 要求に条件付きで応答することです。ファイルの名前は既知で静的です。コントローラーは、独自のビジネス ロジックに基づいてファイル名を決定します。

4

2 に答える 2

1

の基本的な実装の動作を再現できます。<mvc:resources/>これはorg.springframework.web.servlet.resource.ResourceHttpRequestHandler、基本的に静的ファイルのコンテンツをストリーミングします。ResourceHttpRequestHandler を気に入っorg.springframework.web.servlet.support.WebContentGeneratorて、最終変更されたヘッダーの送信とキャッシュ関連ヘッダーの送信を広範囲にサポートし、最後にストリーミングすることができます。コンテンツには、Spring が提供するユーティリティもあります。

org.springframework.util.FileCopyUtils.copy(resource.getInputStream(), response.getOutputStream());

更新しました:

@Controller
public class HelloWorldController implements ApplicationContextAware  {
    ApplicatonContext ctx = ...;

    @RequestMapping(value="/myProtectedContent")
    public void index(HttpServletRequest req, HttpServletResponse res) {
        Resource resource = ctx.getResource("classpath:staticpath/myjpg.jpg");
        FileCopyUtils.copy(resource.getInputStream(), response.getOutputStream());
    }
}
于 2012-07-23T21:30:52.567 に答える
0

できることは、新しいサーブレットを保護したいパスにマップし、要求を希望どおりに処理することです。

たとえば、web.xml では次のようになります。

<servlet>
    <servlet-name>protServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/protServlet-context.xml</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>protServlet</servlet-name>
    <url-pattern>/myProtectedContent</url-pattern>
</servlet-mapping>

このようにして、保護されたコンテンツである URL の新しいサーブレット (DispatcherServlet) をマップします。このフィールド値が 1 に等しい DispatcherServlet がすでにある場合、起動時のロード値は 2 に等しくなります。

于 2012-07-24T00:29:24.137 に答える