Spring URL映射冲突

时间:2012-04-19 08:55:44

标签: spring model-view-controller url url-rewriting mapping

目前我正忙着为我们的网店实施新的网址结构。新的url结构应该针对搜索引擎进行更优化。我们还希望我们的旧结构仍然有效,并将使用301重定向到新结构。

问题是:新结构有时与旧网址冲突。

旧网址映射示例:

@RequestMapping(value = "/brand/{categoryCode}/{categoryName}/{brandGroup}.do", method = RequestMethod.GET)

新结构:

@RequestMapping(value = "/brand/{brandGroup}/{superCategoryName}/{categoryName}.do", method = RequestMethod.GET)

正如您所看到的,url具有相同数量的值,因此旧映射将捕获新映射,反之亦然。

解决此问题的最佳方法是什么?使用url过滤器将旧的重写为新的url结构?

2 个答案:

答案 0 :(得分:3)

您可以使用URL router in Spring MVC;您可以在应用程序中定义冲突路线,并使用路线优先级(匹配请求获胜的第一条路线)处理它们并优化请求匹配。

您的路线配置文件可能如下所示:

GET /brand/{<[0-9]+>categoryCode}/{categoryName}/{brandGroup}.do oldcontroller.oldAction
GET /brand/{<[a-zA-Z]+>brandGroup}/{superCategoryName}/{categoryName}.do newController.newAction

答案 1 :(得分:0)

在Spring Boot中,映射@PathVariable时可以使用正则表达式,这对于解决URL冲突很有用:

@RestController
public class TestController {

    @PutMapping("/test/{id:^[1-9][0-9]*}") // id must be a number greater that 1
    public void method1(@PathVariable long id, @RequestBody DataDto1 data) {
    }

    @PutMapping("/test/foo")
    public void method1(@Valid @RequestBody DataDto2 data) {
    }
}