【发布时间】:2013-04-29 15:16:39
【问题描述】:
最近我正在尝试学习 Spring。我创建了一个简单的 webapp,它基本上应该有两种类型的用户:
- 客户
- 管理员
您可以将应用程序想象成一个经典的购物网络应用程序,管理员有权添加新商品,客户可以查看列出的商品并将其添加到他们的购物车中。 我现在的问题是关于系统的一般架构,这应该是 Spring Framework 的最佳实践示例之一。
我可以在这里列出有关此架构决策的要点,您可以告诉我您是否会以其他方式进行:
1- 我有 2 个不同的调度程序 servlet。因此,public 下的 url 将用于客户,而 admin 将用于管理员。
<servlet-mapping>
<servlet-name>public-dispatcher</servlet-name>
<url-pattern>/public/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>admin-dispatcher</servlet-name>
<url-pattern>/admin/*</url-pattern>
</servlet-mapping>
2- 在 Spring-Security.xml 我有这样的管理员身份验证:
<intercept-url pattern="/admin/**" access="ROLE_ADMIN" />
(url /admin/ 下的所有操作都将受密码保护)
3-每个Servlet都有一个viewResolver指向不同的文件夹,里面包含jsps:
/WEB-INF/admin-jsp/ (admin jsps)
/WEB-INF/public-jsp/ (customer jsps)
4- 假设我有这些域对象:Item、ShoppingCart、Customer 等。对于每个域对象,我都有一个控制器类,即 ItemController,它处理关于一个项目的整个请求(客户和管理员) .
@Controller
@RequestMapping("/item")
@SessionAttributes({"cart"})
public class ItemController { ...
当我一一考虑时,这些决定中的每一个都是有意义的。但实际上,很明显,由于我没有看到任何大型 Spring 应用程序(互联网包含许多小代码部分,无法了解整体),所以这里有问题..
例如:我可以将此 url 称为客户 /public/item/addNewItem(实际上是为管理员提供的),并且该方法将被执行,因为 ItemController (/item) 对每个人都是可见的。但是由于我在 2 个不同的位置有 jsps,所以 spring 会抛出 View 不存在的错误。 同样作为管理员,当我可以调用 url /admin/item/addToCart....
什么是最好的拱门。实施整体?我应该在安全配置中定义更多的 url 吗?例如:
<intercept-url pattern="/admin/**" access="ROLE_ADMIN" />
<intercept-url pattern="/admin/addNewItem" access="ROLE_ADMIN" />
或
我应该为不同的角色定义不同的控制器吗?
@RequestMapping("/public/item")
@SessionAttributes({"cart"})
public class PublicItemController { ...
@RequestMapping("/admin/item")
public class AdminItemController { ...
或
还有什么办法吗?在一个有很多角色、控制器等发生的大系统中应该如何完成。
【问题讨论】:
标签: spring spring-mvc architecture controller spring-security