2009-06-03 5 views
0

서블릿 API에 removeParameters() 메소드가 존재하지 않는 이유는 언제나 궁금합니다. 이 디자인의 동기는 무엇일까요? 다음은 시나리오입니다. 사용을 강제해야하는 독점 MVC 프레임 워크에서 문제점이 있습니다. 내가 리디렉션 URL을 설정하여이 될 것입니다 어떤 특정 작업의 과정을 건너 뛸 수 있습니다불멸품 - HTTP 매개 변수

doPost() { 
//create instance of action - just like struts action 
action.init 
action.preexecution 
if(redirection state is not set) 
action.process 
action.postprocess 
action.finish 
} 

유일한 방법 :이 프레임 워크는 그것의 포스트 방식으로 알고리즘을 호스팅하는 컨트롤러 서블릿을 사용합니다. 컨트롤러 서블릿은 FINAL입니다. 이제 요청 디스패처를 할 때, 액션의 사전 실행 방법을 말하면 컨트롤러는 나머지 메소드를 실행하고 나머지는 건너 뛰지 않을 것입니다. 이 동작을 변경할 수 없으며 리디렉션을 설정할 수 없으며 앞으로 나아갈 필요가 있습니다. 동일한 작업에 대한 요청을 전달하지 않는 한 정상적으로 작동합니다. 요청이 동일한 작업으로 전달되면 http 매개 변수는 모두 동일합니다. 이것은 결코 끝나지 않는 고리로 이어질 것입니다. 따라서 반복 요청이므로 다른 방식으로 처리해야한다는 추가 매개 변수를 추가해야합니다. 내 문제가 맞는지 확실하지 않지만이 게시물을 게시하는 좋은 포럼이라고 생각했습니다.

+0

removeParameter 선택 항목을 갖고 싶은 경우가 하나 있습니다. 때로 실수로 로그인하거나 나중에 노출하지 않도록 암호 매개 변수를 가져 와서 해시하고 즉시 원래 암호에 대한 참조를 숨기거나 제거하거나 삭제하려고합니다. 나는 그렇게 할 수있는 방법을 모른다. –

답변

4

EDIT : McDowell이 HttpServletRequestWrapper를 생각 나게 했으므로 아래 내용을 조금 변경하여 작업을 변경하고 있습니다 ... Thanks McD!

원하지 않는 매개 변수를 "숨기거나"추가 매개 변수를 추가하라는 요청을 꾸밀 수 있습니다.

같은

뭔가 (머리 나 상단의 오프 - 오프 조정할 API를 그래서 아무 컴파일이 될 수도 ...) 여러분의 기대에

public class MyParameterHider extends HttpServletRequestWrapper { 
    public MyParameterHider(HttpServletRequest request) { 
     super(request); 
    } 
    public String getParameter(String name) { 
     if ("parameterToHide".equals(name)) 
      return null; 
     return realRequest.getParameter(name); 
    } 
    // similar for getParameterNames and getParameterMap - don't include the hidden parm 
    // all other methods are strictly pass-through and are automatically 
    // handled by HttpServletRequestWrapper 
} 

, doFilter를 호출 할 때 단지 ParameterHider에 요청을 포장 :

dispatcher.forward(new MyParameterHider(request), response); 

패턴 FTW!

희망이 도움이됩니다.

+0

이것은 문제에 대한 좋은 해결책입니다! – Jay

+0

감사합니다. 기꺼이 도와주세요! 그냥 그렇게 과거에 비슷한 일을해야만하는 경우) –

+2

가능한 경우 HttpServletRequestWrapper를 확장하는 것이 좋습니다. 인터페이스가 과거에 변경되어 구현하기가 어려웠습니다. – McDowell

6

음 ... 목적이 없기 때문에? 요청 매개 변수는 클라이언트에서 서버로 전송됩니다. 서버는 자유롭게 무시할 수 있지만 실제로는 removeParameter() 메서드에 어떤 효과가 있습니까?

편집 : 요청 매개 변수는 서버와 클라이언트 간의 통신을위한 것입니다. 서버 내부 통신의 경우, 요청 속성 (setremoved이 될 수 있음)을 사용할 수 있습니다.

+0

귀하의 질문에 답변해야 할 더 많은 정보가있는 내 게시물을 편집했습니다 – Jay

관련 문제