9

リクエスト マッピングを使用したコントローラーがあり@RequestMapping("/**") ます。それはどういう意味ですか?

上記のマッピングから特定の URL パターンを除外したい場合、どうすればよいですか?

誰かがそれに光を当てることができますか?

4

2 に答える 2

16

正規表現の「否定先読み」構造を使用することで、「URL 除外」または「URL に一致しない」を実現できました。

ハンドラーが静的リソース (CSS/Images/JS など) とエラー ページ以外のすべてを処理するようにします。

エラーページ、つまりresourceNotFoundの処理を防ぐには、次のようにする必要があります

  1. web.xml /web-app/error-page を編集して、エラー URL の前に /error/ を付けます。
  2. 新しいマッピングを処理する WEB-INF/spring/webmvc-config.xml /beans/mvc:view-controller/@path を編集します
  3. WEB-INF/spring/webmvc-config.xml /beans/bean[@class=**SimpleMappingExceptionResolver] を編集して、すべての例外を error/... にマップします。

コントローラーで以下を使用します

@Controller
@RequestMapping(value = { "/" })
public class CmsFrontendController {

  @RequestMapping(value = { "/" }, headers = "Accept=text/html")
  public String index(Model ui) {
      return addMenu(ui, "/");
  }

  @RequestMapping(value = { "{path:(?!resources|error).*$}", "{path:(?!resources|error).*$}/**" }, headers = "Accept=text/html")
  public String index(Model ui, @PathVariable(value = "path")String path) {
      try {
          path = (String) request.getAttribute(
                  HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
          return addMenu(ui, path);
      } catch (Exception e) {
          log.error("Failed to render the page. {}", StackTraceUtil.getStackTrace(e));
          return "error/general";
      }
  }
}
于 2012-07-02T11:59:37.420 に答える
8

あなたの URL は、「/**」に一致するすべてのリクエストをインターセプトします。これを定義している場所によっては、なぜこれを行う必要があるのか​​ わかりません。クラス レベルでは、これはベース パスを定義する必要があり、メソッド レベルでは特定の関数に絞り込む必要があります。

パターンを除外したい場合は、'/**' を指定するコントローラーよりも高い優先度で注文された別のコントローラーを定義できます。

春のソースからの2つの良い参考文献は次のとおりです。

  1. http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html

  2. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html

于 2012-01-25T06:20:45.740 に答える