@RequestMapping(value = "/products/create", method = RequestMethod.POST)
public ModelAndView create(@Valid ProductForm productForm, BindingResult bindingResult,
HttpServletRequest request) {
SessionContext sessionContext = (SessionContext) request.getAttribute("sessionContext");
ModelAndView mav = new ModelAndView("products/new");
mav.addObject("errors", bindingResult.getAllErrors());
mav.addObject("productForm", productForm);
int newProductId = -1;
if (!bindingResult.hasErrors()) {
List<Product> products = productService.find...(...);
if (products != null...) {
bindingResult.addError(new ObjectError("Products", "..."));
}
// only try and create if no errors so far
if (!bindingResult.hasErrors()) {
newProductId = productService.create(..., productForm);
if (newProductId <= 0) {
bindingResult.addError(new ObjectError("Products", "..."));
}
}
}
if (bindingResult.hasErrors()) {
return mav;
}
return new ModelAndView("redirect:/products/show/" + newProductId);
}
所以上面描述了事物的UI方面(使用Spring MVC)。服务层设计,在哪里检查权限,以及如何处理UI层
现在,我应该如何设计服务层,因此在本例中,ProductServiceImpl具有创建方法,该方法将创建产品并将其保存在数据库中。
我要检查的权限,根据用户的角色等
我可以给这个UI层首先检查用户是否有权限创建一个产品:
if(permissionService.hasPermission(.....)) {
newProductId = productService.create(....)
}
但这种关系这个逻辑到UI层,我想应该是在创建方法本身:
public class ProductServiceImpl implements ProductService {
@Autowired
PermissionService permissionService;
..
@Override
public int create(...., final ProductForm productForm) {
boolean canCreateProduct = productService.hasPermissions(.....);
if(canCreateProduct) {
Product product = ..... (productForm);
productDao.save(product);
return product.getId();
}
}
}
但我不明白的问题是,如果I p在ProductServiceImpl.create方法中检查权限,我如何向UI层报告您没有权限执行此操作?
如果你说我应该抛出一个异常,那么我的UI层看起来非常混乱,因为我会根据我需要执行的各种检查来处理这么多异常。
我应该在这里做什么?
我对AOP并不熟悉,这个应用程序在这些检查方面非常轻,所以我宁愿把它放在服务层或UI等。 – Blankman
正如你在你的问题中已经提出的,把在创建方法中检查并在检查失败时抛出异常是最好的选择。 – Torious
好吧,这是开始有意义的,我执行权限检查,以防止页面加载在第一位,但如果他们尝试绕过,如果我抛出一个例外,这将是很好,因为它会是一个罕见的情况下对吗? – Blankman