2016-08-17 18 views
0

私のスプリングコントローラは、ビューアページ内のすべての静的コンテンツをロードするためにスプリングコンテナによって行われた間違いでない場合、/resources/*で始まるURI以外の任意のURIタイプの取得リクエストを取る必要があります。春のRequestMappingで特定のURIパターンを無視するには?

現在の構成では、URI /または/exampleとの要求のために誰かがURIなどにタイプミスをした場合正常に動作し、この

@RequestMapping(method = RequestMethod.GET, value="/*") 

のようなものです。 /example/random/charそれはかなり明白であるとvalue="/**"

@RequestMapping(method = RequestMethod.GET, value="/**") 

を作るために私をリード見つからない例外トレースページ(404)を投げて、その後URI /または/exampleとのリクエストが私のビューページで.js, .css or .pngファイル私の静的なコンテンツをロードすることはできません。これにより、春は内部的にこれらのファイルをURLパターンで読み込むように呼び出すという結論に至りました。 http://localhost:8080/resources/my.jpg

注: -私は故意にtomcatを設定してプロジェクト名を削除しました。

更新 @dimitrisliのコメントは、私のプロジェクトについて少し詳しく説明する必要があることを認識させます。

基本的にURLリダイレクトコンポーネントです。ユーザーはget requestを使用してアプリケーションを呼び出すだけで、実際のページにリダイレクトされます。

たとえば、ユーザーが私のブラウザにURLを入力すると、http://localhost:8080/sampleとしましょう。私のアプリケーションでは、URLを分割して文字列sampleを取得し、db内の実際のURLを検索する必要があります(sampleは実際に長いURLのエイリアス名です)。 URLが存在する場合は、実際のページにリダイレクトされます。他のページは存在しませんというメッセージが表示されます。

答えて

1

(コメントに基づいて更新)

これは404エラーを処理する方法です。

オプションweb.xmlで1

メインページに転送するには、次のものがあります。

<error-page> 
    <error-code>404</error-code> 
    <location>/</location> 
</error-page> 

またはカスタムエラー特定のページ:

<error-page> 
    <error-code>404</error-code> 
    <location>/my-custom-error-page</location> 
</error-page> 

オプション2

は、コントローラ層でキャッチオールエラーハンドラを定義します。あなたは(リソース)とあなたの説明を除外したいフォルダの名前に基づいて

@ExceptionHandler(Exception.class) 
public String handleAllExceptions(Exception e) { 
    log.error("There was an exception thrown! ", e); 
    return "index"; 
} 

(.jsファイル/の.css/.PNG )私はあなたのWebプロジェクトの静的コンテンツを参照していると仮定しています。

あなたは(静的データのためのプロジェクトのディレクトリ規約に従ってください)以下のように明示的にdispatcher servlet xmlで静的コンテンツを定義する必要があります。

<mvc:resources mapping="/resources/**" location="/resources/" /> 
<mvc:resources mapping="/css/**" location="/resources/css/" /> 
<mvc:resources mapping="/images/**" location="/resources/images/" /> 
<mvc:resources mapping="/js/**" location="/resources/js/" /> 
<mvc:resources mapping="/fonts/**" location="/resources/fonts/" /> 
+0

ご回答ありがとうございますが、それは私の懸念事項ではありません。私はすでにこれをしています。 @Override public void addResourceHandlers(ResourceHandlerRegistryレジストリ){ \t \t registry.addResourceHandler( "/ resources/**")。addResourceLocations( "/ resources /"); } – Satyaprakash

+0

あなたの懸念事項は何ですか?リソースの詳細を定義した場合、すべての静的コンテンツはwebappによって処理され、@RequestMappingを経由しません。 – dimitrisli

+0

はい、正しくありますが、値= "/ *"のときはRequestMappingを経由しませんが、 value = "/ **" – Satyaprakash

0

プロジェクトにresource handlerを追加する必要があるように聞こえます。これにより、あなたの/resourcesフォルダ内のファイルを通過させることができます。参考のためにいくつかのコード例がある別のpostがあります。

registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");

別のオプションは、あなたのコントローラメソッドにそれを作る前に、すべてのURIをキャッチインターセプタを実装することであってもよいです。これにより、単一のコントローラメソッドですべてを実行するのではなく、実際にコントローラに到達する前に、DBに物事が存在することを確認するロジックを追加できます。拡大するHandlerInterceptorAdapterは、調べるべきことかもしれません。

+0

"リソースハンドラ"を設定する最初の提案は既にあります。しかし、「インターセプタ」に関する2番目の提案は、私にとって非常に意味があるように見えます。私はこれを試す必要があります。ありがとう。 – Satyaprakash

+0

さらに、 'registry.setOrder(Ordered.HIGHEST_PRECEDENCE);'を追加して、優先順位が最も高いことを確認してください。 – itsthejash

+0

'registry.setOrder(Ordered.HIGHEST_PRECEDENCE);'私のために働かなかった。これは、複数のリソースを処理するときに便利です。 – Satyaprakash

関連する問題