Spring Bootで特定のパターンの代わりにすべてのリクエストをマップする 質問する

Spring Bootで特定のパターンの代わりにすべてのリクエストをマップする 質問する

Spring Boot アプリケーション内に VueJS シングル ページ アプリケーションがあり、URL が で始まるリクエストではなく、すべてのリクエストを vue-router で処理するようにしたいと考えています/rest/**

^(?!/rest/).*そこで、で始まらないすべてのものに一致する正規表現を記述し/rest/、次のようなリクエスト マッピングを作成しようとしました。

@Controller
public class MainController {

@RequestMapping(value = "/{path:^(?!/rest/).*}")
    public String forwardRequests() {
        return "forward:/";
    }
}

しかし、動作しません。何が間違っているのでしょうか?

編集

REST コントローラー ファイルがあります:

@RestController
@RequestMapping(path = "/rest/project")
public class ProjectController {

    @Autowired
    private ProjectService projectService;

    @GetMapping(value = "/{id}")
    public Project getProjectById(@PathVariable Long id) {
        return projectService.getProjectById(id);
    }
}

これはプロジェクトの詳細を含む JSON を返します。 のようなページがいくつかあるので/login、 vue でルーティングを処理する/projektyためにそれらを に転送する必要がありますindex.html。次のようにできることはわかっています。

@Controller
public class MainController {

    @RequestMapping(value = {"/login", "/projekty"}, method = RequestMethod.GET)
    public String forwardRequests() {
        return "forward:/";
    }
}

うまく動作しますが、すべての URL を明示的に指定したくありません。そのため、正規表現を使用するようにしています。また、変数を間違って使用していると思いますpathが、方法がわかりません。

Angular JS のセキュリティとセキュリティ チュートリアルセクションUsing "Natural" Routes

ベストアンサー1

そうですね、@JDB が言ったように、パスを比較して最適な一致を見つけます。したがって、私のAPIAntPathMatcherのようにパスが指定されているエンドポイントについて心配する必要はありません。/rest

以下を追加できます:

@RequestMapping(value = "/{path:[^\\.]*}")
public String redirect() {
  return "forward:/";
}

そして、すべてのリクエスト (例: /login) は に正しく転送されindex.html、JavaScript が処理できるようになります。

問題は、 のような URL にあります/project/edit/33。これらはこの正規表現に一致しないため、 が表示されますWhitelabel Error Page 404 Not Found。次のように記述できます。

@RequestMapping(value = "/**/{path:[^\\.]*}")
public String redirect() {
  return "forward:/";
}

正常に動作しますが、セキュリティが有効になっている場合は、次の/ouath/token結果が返されます。

{  
   "timestamp":"2018-02-05T09:13:28.104+0000",
   "status":405,
   "error":"Method Not Allowed",
   "exception":"org.springframework.web.HttpRequestMethodNotSupportedException",
   "message":"Request method 'POST' not supported",
   "path":"/oauth/token"
}

したがって、OAuth URL を除外する必要があります。

@RequestMapping(value = {"/{path:[^\\.]*}", "/**/{path:^(?!oauth).*}/{path:[^\\.]*}"}, method = RequestMethod.GET)
public String forward() {
    return "forward:/";
}

そしてそれはうまく動作します。

フレームワークが提供する他のエンドポイントで問題がある場合は、/health正規表現を次のように変更できます。/**/{path:^(?!oauth|health).*}/{path:[^\\.]*}

見た目はひどいですが、機能します。誰かがここにもっと良い、よりクリーンな解決策を投稿してくれると信じています。

おすすめ記事