最近我正在尝试学习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-假设我有这些域对象:项目、购物车、客户等。对于每个域对象,我都有一个控制器类,即 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 { ...
或者
还有什么办法吗?在一个有很多角色、控制器等发生的大系统中应该如何完成。