2011-10-31 6 views
1

Java 웹 응용 프로그램 개발자로서 URL 재 작성을 사용해야하는시기와 URL 재 작성 및 전달의 차이점은 무엇입니까?Java 서블릿의 컨텍스트에서 URL 재 작성과 전달의 차이점은 무엇입니까?

다른 웹 사이트에서 검색 한 결과, SEO 사람들이이 질문에 다르게 대답하는 것처럼 누구에게 이야기하고 있는지에 따라 모순되는 정보가 나타납니다.

AFAIK 두 경우 모두 클라이언트 (브라우저)에 변경 사항에 대한 정보가 제공되지 않으며 최종 사용자는 클라이언트가 서버에서 휴면을 반환 할 때 클라이언트가 원래 요청한 URL과 정확히 동일한 URL을 보게됩니다.

이 질문은 리디렉션 및 전달이 완전히 다른 두 가지 방법 인 forward method 및 sendRedirect 메서드가 정의 된 Java Servlet API의 컨텍스트에 있습니다. 이 질문은 forward (Servlet API의 forward 메소드로 정의 된)와 URL 재 작성의 차이점에 관한 것입니다. 질문은 대답이 Java 서블릿의 컨텍스트에 있어야한다고 분명하게 명시합니다. 가장 중요한 것은 자바 웹 애플리케이션 개발 컨텍스트에서 다시 URL 재 작성을 사용해야 할 때입니다.

+0

귀하의 가정이 잘못되었습니다. 포워딩/리디렉션은 3xx를 브라우저로 보내어 새로운 URL로 이동하여 수행됩니다. –

답변

6

"전달"이라는 용어는이 질문에서 모호합니다. JSP/서블릿 세계에서 MVC 개념에서 "전달"은 요청 URL (브라우저 주소 표시 줄에서 볼 수 있음)이 서블릿 (web.xml 또는 의 URL 패턴과 일치)을 효과적으로 호출하여 모델을 준비하고 JSP를 뷰로 사용하여 모델을 표시합니다. 그 JSP는 차례로 "전달"에 의해 호출되었습니다. 이것은 RequestDispatcher#forward()에 의해 이루어집니다 : 이것은 참으로 브라우저의 주소 표시 줄에 JSP의 URL을 반영하지 않습니다

request.getRequestDispatcher("/WEB-INF/foo.jsp").forward(request, response); 

. 이것은 전적으로 서버 측에서 발생합니다. 기본적으로 서블릿은 JSP를 "로드"하고 요청/응답을 전달하여 HTML 생성 작업을 수행 할 수 있도록합니다. 위 예제의 JSP는 /WEB-INF 폴더에 숨겨져있어 브라우저 주소 표시 줄에 전체 경로를 입력하려는 최종 사용자가 액세스 할 수 없습니다.

일반적으로 웹 개발 세계에서 "전달"이라는 용어는 URL 리디렉션과 본질적으로 동일한 "URL 전달"에서 알려진 입니다. 차례로 브라우저 주소 표시 줄이 변경됩니다. 이것은 JSP/서블릿 세계에서 공식적으로 "리디렉션"으로 알려져 있습니다 (대부분의 시동기는 처음에는이를 전달과 혼동하지만). 이것은 HttpServletResponse#sendRedirect()에 의해 수행됩니다

response.sendRedirect("another-servlet-url"); 

기본적으로, 서버는 클라이언트가 주어진 Location에 대한 새로운 GET 요청을해야 Location 헤더와 HTTP의 3nn 응답하여 클라이언트를 알려줍니다.위 효과적으로 다음과 같습니다 :

response.setStatus(302); 
response.setHeader("Location", "another-servlet-url"); 

는 클라이언트가 작업을 지시하고있다합니다 (웹 브라우저)가있어로서, 당신은이 URL 변화가 다시 브라우저의 주소 표시 줄에 반사되는 참조하십시오.


용어 "URL 재 작성"도 모호합니다. JSP/서블릿 세계에서 URL 재 작성은 세션 ID를 URL에 추가하여 쿠키가없는 브라우저가 서버와 세션을 계속 유지할 수 있도록하는 형식입니다. URL에 ;jsessionid=somehexvalue 속성을 본 적이있을 것입니다. 이것은 기본적으로 자동으로 수행되지 않지만 대부분의 Servlet 기반 MVC 프레임 워크는 자동으로 처리합니다. 이것은 HttpServletResponse#encodeURL() 또는 encodeRedirectURL()에 의해 수행됩니다

String encodedURL = response.encodeURL(url); // or response.encodeRedirectURL(url) 
// Then use this URL in links in JSP or response.sendRedirect(). 

(차례로 모호한 용어 "URL 인코딩"당신이 일반적으로 percent encoding 생각하는 것으로 -again- 어느 이것에 대한 기능을 제공하는 더 서블릿 API가 없습니다.. 이것은 일반적 JSTL의 <c:url><c:param> 또는 같은 서블릿 기반 MVC 프레임 워크가 제공하는 UI 요소에 의한 JSP에, MVC-기술적으로 더 정확한을 URLEncoder#encode() 수행하거나 될 JSF의 <h:outputLink>)

에서 일반적인 웹 개발 (특히 Apache HTTPD/PHP 사용자의 경우) "URL 재 작성"은 Apache HTTPD의 mod_rewrite이 수행하는 작업 중 클라이언트 측의 URL 변경을 반영하지 않고 들어오는 URL을 콘크리트 리소스로 매핑하는 것으로 알려져 있습니다. JSP/서블릿 세계에서도 이것이 가능하며 일반적으로 을 사용하는 Filter 구현으로 수행됩니다. 잘 알려진 구현은 the Tuckey's URLRewriteFilter입니다.


나는 아파치 HTTPD/PHP 세계에서 나의 뿌리를하면서 난 그냥 확실히, JSP/서블릿으로 시작했을 때 이것은 또한 오랫동안 저를 혼동 것을 인정한다.

2

재 작성은 요청이 처리되기 전에 URL을 수정하여 URL이 다른 URL처럼 처리되도록하는 (종종 서블릿 앞에 오기 전에) 레이어입니다. 서블릿은 재 작성된 URL이 요청 된 것처럼 하나의 요청을 통해 응답하며 일반적으로 재 작성을 모르는 상태입니다.

Forwarding (or redirection)some 3xx error codes (클라이언트가 리디렉션을 허용 한 경우)을 통해 서버에서 지시 할 때 브라우저에서 (일반적으로 자동으로) 수행됩니다. 이 경우 두 개의 요청이 제공됩니다 (반드시 서블릿 둘 다 필요하지는 않음). 첫 번째는 오류 코드와 리디렉션 할 URL로 응답하고 두 번째는 클라이언트가 리디렉션 한 후 적절한 요청을 제공합니다.

+3

포워딩에 대한 귀하의 대답은 전달이 아닌 리디렉션에 적용됩니다. – ace

+1

@ace : 게시 한 기사의 첫 번째 문장을보십시오. * URL 리디렉션 (URL 전달이라고도 함) ... * 동일한 개념입니다. 그것이 포워딩의 의미가 아니라면, 당신이 말하는 "포워딩"의 정의가 무엇인지 분명히 밝혀야합니다. –

+0

Mark. 내 대답도 읽었는지 모르겠지만 구체적인 질문에 대한 명백한 혼란을 정리하기 위해 그것을 읽으시기를 권합니다. JSP/Servlets과 긴밀하게 일한 적이없는 것 같습니다. – BalusC