【发布时间】:2023-03-23 00:40:02
【问题描述】:
我的项目包含多种类型的网站,例如博客、论坛和网站。
我有博客、论坛和网站(以及更多)的特定控制器
我希望在网站类型之间共享某些控制器,例如登录控制器。
但我只希望登录控制器与论坛和站点共享。
我使用过滤器添加请求标头“partType”,它具有价值站点、论坛或博客。
我的登录控制器的@RequestMapping 是:
@RequestMapping(value="/dash/login", headers={"partType=forum","partType=site" })
这会导致映射:
{[/dash/login/dologin],methods=[GET || POST],headers=[partType=forum && partType=site]}
注意 &&(和)。是否有可能获得 || (或)在这里?
因为“partType”标头从来都不是论坛和站点,但我确实希望登录控制器支持 partType 论坛和站点,但不支持博客,所以我不能只从 requestmapping 注释中删除标头属性。
【问题讨论】:
-
如果没有默认设置,您必须为此编写自己的规则并重写
RequestMappingHandlerMapping的一部分以便它们进行配置。 -
干杯@M。 Deinum ,确实我已经在查看 RequestMappingHandlerMapping 但是覆盖这个的问题是 mvc:annotation-driven 在这样做时被禁用,从而使 spring 查找控制器和方法的所有好处变得无用。使用 java config 时有一个技巧,但我仍然坚持使用 xml config。
-
附带说明:我找到了一个次优的解决方案,使用拦截器 preHandle() 将“partType”附加到 uri 并使用 RequestDispatcher 转发带有新 uri 的请求。这可行,但我担心性能下降,因为现在每个请求都由 RequestDispatcher 转发。
-
无论您使用基于 XML 还是 Java 的配置,解决方案都是一样的。检测控制器是通过组件扫描完成的,实际处理它们的是
RequestMappingHandlerAdapter,所以没有问题(除了从命名空间/注释中丢失默认配置和检测到的东西)。 -
最简单的解决方案是为每个标头创建 2 个处理程序映射方法,并让它们在控制器上调用相同的(内部)方法。
标签: spring spring-mvc