77hp
120
2019-04-16 15:35:32 작성 2019-04-16 15:36:40 수정됨
8
137

파라미터 값 유효성 검사 후 에러 메시지


질문이 길어요 ㅠㅜ


사이트 이용자가 파라미터 값을 임의로 수정해서 에러를 발생키는 경우를 방지하려고 합니다.

이럴 때 유효성 검사를 꼭 해야되는데 프론트에서 자바스크립트로 유효성을 검사하지만 

고의적으로 에러를 발생시키려는 사용자에게는 프론트에서 처리하는 것 만으로는 부족하겠죠.


제가 사용하는 방식은 JSR-303와 Hibernate에서 제공하는 유효성 검사 어노테이션을 사용합니다.

@Autowired
ProFileServicelmpl proFileServicelmpl;
@Autowired
MemberProFile memberProFile;

@RequestMapping(value = "/member/profile", method = RequestMethod.GET) // 회원정보 수정 폼
public String changeInfoForm(Model model){

  profile = proFileServicelmpl.myInformation("회원번호");
  
  // 문제 발생 지점...
  model.addAttribute("profile", profile);
  if(!model.containsAttribute("profile")) {
    model.addAttribute("profile", new Profile());
  }
  return "/member/profile";
}
@RequestMapping(value = "/member/profile", method = RequestMethod.POST) // 회원정보 수정
public String changeInfo(@Valid @ModelAttribute Profile profile, BindingResult binding,
	RedirectAttributes redirectAttributes) {

  if (binding.hasErrors()) {
    redirectAttributes.addFlashAttribute("org.springframework.validation.BindingResult.profile",
					binding);
    redirectAttributes.addFlashAttribute("profile", profile);
    return "redirect:/member/profile";
  }
}
public Class Profile{
  @NotEmpty(message="휴대전화를 입력해주세요!")
  private String phone;
  @NotEmpty(message="주소를 입력해주세요!")
  private String password;
}
<form:form action="member/profile" modelAttribute="profile" commandName="profile" method="POST">
  <form:input path="phone" placeholder="전화번호" />
  <form:errors path="phone" />
  
  <form:input path="address" placeholder="주소" />
  <form:errors path="address" />
</form:form>

위 방식으로 에러 메시지를 페이지에 전달하려고 했지만 페이지 이동을 리다이렉트로 처리하기 때문에

사용자가 입력했던 값을 유지하면서, 에러 메시지를 출력하려고 하는데 에러 메시지가

넘어가지 않습니다....


그래서 에러 메시지를 자바로 처리하는 방식을 포기하고, 한 생각이

일반적인 에러(빈칸, 숫자만 입력, 특수문자 불가)는 자바스크립트로 alert 알림으로 처리하고,

고의적으로 에러를 발생시키는 사용자에게 에러에 맞는 페이지(404, 500 등등...)로 이동시키는

방법으로 하려고합니다.


위 코드 처럼 사용자가 입력했던 값을 유지하면서, 에러 메시지를 출력의 해결방법이나

다른 차선책이 있는지 궁금합니다.

또 대체적으로 유효성 검사후 에러 메시지를 어떤 방식으로 처리하는지 알고 싶습니다.


(스프링은 4.3을 사용중입니다)

0
0
  • 답변 8

  • 사는게힘듭니다
    1k
    2019-04-16 15:50:42

    사용자가 임의로 말도안되는 데이터로 수정시 말도안되는 데이터를 입력양식태그에 남기고싶으시다는건가요?

    0
  • 77hp
    120
    2019-04-16 15:56:00 작성 2019-04-16 15:56:28 수정됨

    사는게힘듭니다 님 답변남겨주셔서 감사합니다.


    네 Post가 되면 입력양식태그에 입력했던 데이터를 남기고 에러 메시지를 출력하려고 합니다. 

    예를 들어 전화번호를 입력할 때 - 빼고 입력받아야 하는 폼이 있다고 가정하면

    입력양식태그에는 그대로 010-1234-5678 이런식으로 남기고

    입력 폼 아래에는 에러 메시지가 출력되고 싶습니다.

    0
  • 사는게힘듭니다
    1k
    2019-04-16 16:09:45

    전화번호 입력양식 네임값이 abc 라 할때

    $(document).ready(function(){

            $("[name='abc']").val( "${param.abc}" ) 

    })

    0
  • dogi
    136
    2019-04-16 17:36:49

    대체적으로 JSR-303와 하이버네이트를 혼용해서 쓰는 경우는

    메시지를 국제화 할 경우에 자주 쓰는 방법이구요.

    저렇게 썻을 경우에 ajax로 던지면 에러 메시지를 가져오지 못하기 때문에 동기화로 전송하시는 건가요.

    아니면 다른 이유가 있으신가요.


    0
  • 77hp
    120
    2019-04-16 17:57:11

    사는게힘듭니다

    리다이렉트 처리가 되서 파라미터 값을 유지가 안되서, 입력폼에 남겨지지 못하는

    문제입니다. ㅠㅜ


    0
  • 77hp
    120
    2019-04-16 18:16:33

    dogi 님 감사합니다.

    JSR-303와 하이버네이트는 국제화에 자주 쓰이는 방법인걸 몰랐습니다...

    구글에 스프링 유효성 검사라고 검색하면 나오는 결과중에 가장 편할거 같은 방법을 사용했습니다.


    비동기화 때문에 저렇게 전송한것은 아니고요.

    실력 미달로 책 + 구글에 있는 소스 긁어오다 보니깐 저렇게 작성됬습니다.

    하하...


    0
  • dogi
    136
    2019-04-17 10:09:04

    네 그렇군요.

    간단하게 설명드리자면, 서버&클라이언트 검증을 동기화를 한다던지, 메시지를 국제화를 한다던지 이런 용도가 아니면 굳이 저 방식까지 쓸 필요는 없구요.

    클라이언트 단에서 단순히 자바스크립트로 처리하고, ajax로 던집니다. 서버단에서는 bindingResult로 JSR-303에 클라이언트 단에서 한 처리만큼 처리를 해줍니다(사실 null값만 처리해도 ... )

    그리고 에러가 있을 시 기존 페이지로 던져주기만 하면 되지않을까요.

    유효성은 빡빡하게 생각하면 끝도 없이 어려운 숙제입니다.. ( 암호화도 해야하고 등등 .. )

    0
  • dogi
    136
    2019-04-17 10:12:49

    그리고 클라이언트 단에서 자바스크립트 처리하기 번거로우시면 동적으로 유효성 처리해주는 API는 많습니다. 파슬리(parsley)나 Jquery validation 참고하시면 될 것 같습니다.

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.