pungjoo

get...URI()에 대한 고찰 본문

JAVA

get...URI()에 대한 고찰

pungjoo.kim 2008. 6. 24. 00:37

들어 가면서
일반적으로 스프링을 쓰는 환경에서 VIEW PAGE인 JSP PAGE에서 request.getRequestURI()를 사용하면 원하는 URI를 얻지 못 합니다. 즉, 유입 URI를 돌려 주는 것이 아니라 controller에서 정의한 PAGE를 얻게 되어 결국에는 사용자가 입력한 실제 URI를 얻을 수 없게 됩니다.

그래서 일반적으로 controller에서 getRqeustURI()한 결과를 request.setAttribute(key, value)를 통해서 Value를 설정하고 VIEW PAGE인 JSP PAGE에서 getAttribute( key )를 사용합니다..

정말 얻을 수 없을까?

자자... servlet spec을 정의하는 양반들이 바보였을까?

Case 명세서

  • springframework을 사용한다.
  • 사용자는 http://some.pungjoo.com/index.pj 라고 URL 입력창에 입력함
  • 해당 요청에 대한 처리 과정을 들여다 보면 controller에서 필요한 service를 호출해 request의 attribute에 저장하고
    최종적으로 /WEB-INF/jsp/default_index.jsp를 호출하는 구조이며
    최종적으로 호출을 받은 JSP PAGE에서 사용자가 호출한 URI를 기술함.

알려진 문제점
위 명세서를 구현함에 있어서 마지막 부분을 일반적으로 다음과 같이 기술하게 됩니다.

String uri = request.getRequestURI();

그런데 위와 같이 기술하면 uri에 어떤 value가 들어 올까요?

/WEB-INF/jsp/default_index.jsp

위와 같은 결과가 나오게 됩니다. 경험 있는 분들은 그래서 다음과 같이 합니다.

request.setAttribute( "URI", request.getRequestURI() );

/WEB-INF/jsp/default_index.jsp page에서...
String uri = (String)request.getAttribute( "URI" );

servlet spec 정의하는 양반들은 바보가 아니었다.
일반적으로 uri mapping을 통해서 움직이는 framework은 내부적으로 종단의 VIEW JSP로 가기 위해서 RequestDispatcher의 include(...) 또는 forward(...)를 통해서 VIEW PAGE로 보내줍니다.

이런 상황하에서 우리네들은 request.getRequesURI()를 호출하는데 이렇게 되면 getRequestURI은 RequestDispatcher의 URI가 됩니다, 즉 부모의 URI를 돌려 주게 됩니다.

이런 상황이다 보니 servlet spec에는 다음과 같은 key/value가 request attribute에 자동으로 들어가게 됩니다. 부모 PAGE에서 자식을 호출 하는 방식에 따라서 

request.getAttribute( "javax.servlet.forward.request_uri" );
request.getAttribute( "javax.servlet.include.request_uri" );

결론
SpringFramework을 사용하는 우리네들은 VIEW PAGE에서 사용자가 요청한 URI를 얻고 싶으면 다음과 같이 하세요.

String uri = (String)request.getAttribute( "javax.servlet.forward.request_uri" ); 

@

2 Comments
댓글쓰기 폼