SetDisallowedFields를 사용할 때 "ADD"및 "업데이트"의 하나의 컨트롤러 인 Spring MVC?

StackOverflow https://stackoverflow.com/questions/826385

  •  05-07-2019
  •  | 
  •  

문제

그래서 나는 새로운 것을 "추가"하거나 기존의 것을 "업데이트"할 수있는 간단한 형식을 가지고 있습니다.

내가 원하는 것은 추가 및 업데이트를 처리 할 수있는 하나의 컨트롤러를 갖는 것입니다. 처음에 이것은 새로운 것을 추가 할 때 "ID"필드가 허용되지 않도록 Initbinder에서 setDisallowedFields를 사용하는 문제를 고려할 때까지 이것은 단순 해 보입니다.

현재 Initbinder 메소드를 제외하고 동일한 코드가있는 두 개의 컨트롤러가 있습니다.

제안이나 조언이 있습니까? (나는 당신이 나에게 좋은 이유를 줄 수 있다면 두 개의 컨트롤러를 유지하고 싶다는 주장에 열려 있습니다)

도움이 되었습니까?

해결책

실제로 추가 및 업데이트시 "ID"필드를 허용하지 않아야합니다. 그렇지 않으면 악성 사용자는 업데이트 요청의 "ID"요청 매개 변수의 값을 조작하고 양식으로 표시된 것과 다른 레코드를 업데이트 할 수 있습니다 (ACL 또는 기타 도메인 수준 보안이 없다고 가정 함).

그러나 단순히 "ID"필드를 허용하지 않으면 컨트롤러는 ID를 NULL로 취급합니다. 이는 삽입 할 때 작동하지만 업데이트 할 때는 작동하지 않습니다 (예 : 지속 메커니즘에 따라 업데이트 대신 새 레코드를 삽입하려고 시도 할 수 있습니다. '다시 사용). 따라서 컨트롤러가 요청 사이에 도메인 오브젝트 (ID뿐만 아니라 모든 허용되지 않은 필드)의 부탁 할 수없는 값을 기억하여 모든 올바른 값을 서비스 계층 또는 기타 비즈니스 로직으로 보낼 수 있습니다. 이것은 다음과 같이 유형 수준 @sessionattributes 주석을 사용하여 수행됩니다 (명확성을 위해 생략 된 기타 주석).

@SessionAttributes("thing") // the name of your domain object in the model
public class ThingController {

    public void setDisallowedFields(WebDataBinder binder) {
        binder.setDisallowedFields("id", "someOtherUneditableField");
    }

    // request handling methods go here as before
}

더 나은 보안을 위해 허용 된 필드가 아닌 허용 된 필드를 설정하십시오. 어느 쪽이든, 요청에서 기존 필드 값이 무시되는 모든 것을 채우려면 @sessionattributes 주석이 필요합니다.

다른 팁

방법 서명 initBinder 가져옵니다 HttpServletRequest:

protected void initBinder(HttpServletRequest request, 
    ServletRequestDataBinder binder)

아마 당신은 가질 수 있습니다 initBinder() 요청 매개 변수를 확인하여 조건부로 설정 해야하는지 확인하십시오. setDisallowedFields?

(도움이되지 않으면 문제를 올바르게 이해하지 못할 것입니다 ...)

단일 컨트롤러 로이 작업을 수행하는 방식은 내 명령 개체에 부울이 새 개체인지 아닌지를 나타내는 것입니다. OnSubmit에서는 부울에게 추가 또는 업데이트 작업을 수행 해야하는지 확인할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top