2017-09-04 62 views
0

有人建议,不应将对象ID发送到隐藏的Id标记中的视图,因为恶意用户可以编辑源html并将数据提交(发布)回错误记录,并且更好的方法是将对象存储在会话变量中,直到它返回。春季会议存储对象

我已阅读此SO answer但它并没有帮助我在这个问题上。

我有一个DTO OccurencePerson存储发生的细节和人的集合。形式控制器的设置是这样的:

CLASS

@Component 
@Controller 
@SessionAttributes(value = { "user", "occModelView" }) 
public class FormController { 

GET HANDLER

@GetMapping("/occurence/{occeno}") 
public String findOcc(@PathVariable String occno, @ModelAttribute("occViewModel") OccViewModel occViewModel, Model model, HttpSession session, SessionStatus sessionStatus) { 

    Occurence occ = occurenceRepository.findByoccno(occno); 
    occViewModel.setOccurence(occ); 
    occViewModel.setPersons(occPersonRepository.findOccPersonByEpisode(occurence.getId())); 

    model.addAttribute("occViewModel", occViewModel); 
    session.setAttribute("occViewModel", occViewModel); 
    sessionStatus.equals(occViewModel); 
    return "occurence"; 

POST HANDLER

@PostMapping("newOccurence") 
public String episodeSubmit(@Valid @ModelAttribute OccViewModel occViewModel, BindingResult result) { 
    if (result.hasErrors()) { 
     List<ObjectError> errors = result.getAllErrors(); 
     for(ObjectError error : errors) { 
     } 
     return "occurence"; 
    } else { 
     occService.saveNewOccurence(occViewModel.getOccurence(), occViewModel.getPersons()); 
     return "redirect:/dash"; 

如何使用session vars从Hibernate返回一个对象,然后将该对象返回给Hibernate,使其不创建新对象?

现在,如果我删除存储发生id的html中的隐藏标签,并将个人id和数据提交回来,它会创建一个新的发生/人员。

+1

有几点注意事项:1.您可以使用“merge()”而不是save/persist更新现有对象的值。 2.恕我直言,可以在视图中使用对象标识符,系统必须授权访问权限3.只是一个想法 - JSF使用加密和签名的视图状态在请求之间传递视图模型。 – gusto2

+0

您的关系是否在JPA中正确注释?你可以发布内部occService.saveNewOccurence(),因为我认为你将这些对象附加到休眠会话中。 – aksappy

回答

0

你将存储的标识在视图模型 - 而不是将其暴露在页面上 -

OccViewModel occViewModel - 这是你的DTO从findOcc稀少,所以才会有属性 -

  • 编号
  • 其他值

然后你有你的DTO的映射到JPA对象

OccViewModel存储在会话中并包含ID的事实意味着您可以重新引用JPA模型以确保它未在其他位置更新