有人建议不要将对象ID发送到隐藏Id标记中的视图,因为恶意用户可以编辑源html并将数据提交(发布)到错误的记录中,更好的方法是将对象存储在会话var中,直到它返回。
我已阅读此SO answer,但就这个问题而言,它并没有帮助我。
我有一个DTO OccurencePerson,它存储了出现的细节和一组人。表单控制器的设置如下:
类
@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,这样它就不会创建一个新对象?
目前,如果我删除html中隐藏的标签,其中存储了发生ID,并且人员ID并将数据提交回来,则会创建新的事件/人员。
答案 0 :(得分:0)
您可以将Id存储在视图模型中 - 但不会在页面上公开它 -
OccViewModel occViewModel - 这是您从findOcc填充的DTO,因此具有属性 -
然后,您可以将DTO映射到JPA对象
OccViewModel存储在会话中并包含ID意味着您可以重新绑定JPA模型以确保它未在其他地方更新