2017-11-05 3 views
0

저는 스프링을 사용하는 간단한 웹 응용 프로그램을 구현 중이며 암호 메커니즘을 재설정하려고 시도하고 있습니다. 나는 이것을 이렇게하기로 결정했다 : 사용자는 site/reset_password?t=token과 같은 그의 전자 메일 수신함에 대한 링크를 얻는다. 그리고 나서 그는 (GET을 사용하여) 그가 새로운 암호를 쓰는 양식을 본다. 슬프게도 나는 사용자가 자신의 새 암호 (POST 포함)를 제출할 때 몇 가지 문제를 발견했다. POST 메서드에서 그의 링크에서이 토큰이 필요합니다. GET에서 POST로 인수 전달

@RequestMapping(value = "/reset_password", method = RequestMethod.GET) 
public String resetPassowrd(@RequestParam("t") String token, Model model) { 
    try { 
     ResetPasswordForm form = new ResetPasswordForm(); 
     form.setResetPasswordToken(token); 
     model.addAttribute("resetPasswordForm", form); 
     model.addAttribute("tokenStatus",TokenStatus.OK); 
    } catch (WrongTokenException ex) { 
     model.addAttribute("tokenStatus",TokenStatus.WRONG); 
    } 
    return "token/reset_password.html"; 
} 

난 형태 오브젝트 (동일한 객체는 사용자가 자신의 암호를 함께 기입)에 전달하도록했지만, POST 방법이 필드는 널 (null)로 설정된다.

@RequestMapping(value = "/reset_password", method = RequestMethod.POST) 
public String resetPassowrd(@ModelAttribute @Validated ResetPasswordForm resetPasswordForm, BindingResult bindingResult, Model model) { 
    if (bindingResult.hasErrors()) { 
     return "token/reset_password.html"; 
    } 
    userCompanyService.changePassword(resetPasswordForm); 
    return "token/reset_password_success.html"; 
} 

토큰을 사용하여 해당 필드를 찾은 후 슬프게도이 POST로 GET의 요청에 따라 전달되지 않습니다, 나는이 방법 @RequestParam(value = "t",required = false) String token 또 다른 PARAM를 추가하는 시도 null입니다. 어떻게 작동시켜야합니까? 나는 스프링과 함께 Thymeleaf를 사용한다는 사실을 언급 할만한 가치가 있다고 생각합니다.

+0

그렇기 때문에 reset_password.html 페이지에서 사용하는 모델에 토큰을 전달합니다. 이 HTML 페이지는 토큰과 어떤 관련이 있습니까? 양식의 숨겨진 입력 필드로 추가하지 않는 한이 페이지에 포함 된 양식과 함께 마술처럼 제출하지 않습니다. –

+0

ResetPasswordForm에는 token, password, repeatedpassword의 세 가지 필드가 있습니다. '토큰/reset_password.html'에서 나는 사용자 암호 및 repeatedpassword에서 얻은 양식을 가지고 있으며 resetPasswordForm을 제출합니다. 그래서 토큰은 객체에 남아있을 것이고 그에게 아무 것도하지 않을 것이라고 생각합니다 (나는 그것을 수정하지 않습니다) . – ogarogar

+0

스프링과 웹 전반적인 작동 방식을 완전히 오해하고 있습니다. 요청을 보내면 매개 변수를 포함해야합니다. Spring은 이러한 매개 변수를 보유 할 객체를 만든 다음이 객체를 기반으로 HTML을 생성합니다. 그리고 끝났습니다. 요청이 처리되면 개체가 사라집니다. 다음 요청은 이전 요청과 독립적입니다. 한 요청에서 다른 요청으로 Spring이 기억하도록하기 위해서는 세션에 그 내용을 저장해야합니다. 그러나 당신은 정말로 그것을 일반적으로하고 싶지 않습니다. 그리고 확실히 여기 있습니다. 토큰과 함께 숨겨진 필드를 사용하고 양식과 함께 제출하십시오. –

답변

0

<input type="hidden" th:field="*{resetPasswordToken}" />을 추가하면 문제가 해결됩니다. 그 스프링은 토큰 인수를 POST 메서드에 전달한다.