Spring Session存储对象

时间:2017-09-04 10:52:10

标签: java spring hibernate spring-boot spring-data-jpa

有人建议不要将对象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并将数据提交回来,则会创建新的事件/人员。

1 个答案:

答案 0 :(得分:0)

您可以将Id存储在视图模型中 - 但不会在页面上公开它 -

OccViewModel occViewModel - 这是您从findOcc填充的DTO,因此具有属性 -

  • 编号
  • 其他值

然后,您可以将DTO映射到JPA对象

OccViewModel存储在会话中并包含ID意味着您可以重新绑定JPA模型以确保它未在其他地方更新