2008-11-03 9 views
2

새로운 URL로 여러 언어를 지원하기 위해 확장하려는 웹 앱이 있습니다. 예를 들어, www.example.com/home.do는 영어이지만 www.example.com/es/home.do는 스페인어입니다. 내 첫 번째 생각은 /home.do에 /es/home.do와 같은 들어오는 URL을 다시 쓰는 필터를 만드는 것이었고 요청에 로케일을 설정했다. 이 잘 작동합니다. 필터는와의 ServletRequest를 랩하는 HttpServletRequestWrapper 언어 복귀 대해 getContextPath() 무시하는 :URL 재 작성을 위해 HttpServletRequest에서 getContextPath를 재정의하십시오.

class FakeContextRequest extends HttpServletRequestWrapper { 

    private String context = ""; 
    FakeContextRequest(HttpServletRequest request, String context) { 
    super(request); 
    // snip some validation code 
    this.context = request.getContextPath() + context; 
    } 
    @Override 
    public String getContextPath() { 
    return this.context; 
    } 
} 

해당 요청에 대한 내 필터 전달 다음과 같이

FakeContextRequest fr = new FakeContextRequest(request, lang); 
fr.getRequestDispatcher(newResourceName).forward(fr, response); 

내 문제는 그 다음 서블릿 아무튼를 제대로 앞으로 나아갈 수 없습니다. 다음 서블릿 (일반적으로 Struts ActionServlet)은 (종종 Struts Tiles를 사용하여) JSP로 전달합니다. JSP로 가면 HttpServletRequest는 여러 번 래핑되고 문제의 객체는 컨텍스트가 비어 있다고보고합니다 (루트 컨텍스트는 응용 프로그램이 실제로 배포되는 곳입니다).

이미 존재하는 모든 컨텍스트 인식 코드가 자동으로 해당 언어를 작성한 URL에 삽입 할 수 있도록 컨텍스트를 다시 작성해야합니다. 이것이 가능한가?

편집 : 나는 래핑 된 HttpServletResponse 대신 랩핑 된 HttpServletResponse를 사용하여 나의 문제를 해결했다. response.encodeURL() 메소드의 URL을 다시 작성합니다.

답변

1

getContextPath()을 재정 의하여 문제를 해결하는 것으로 충분하지는 않습니다. Struts가 커버 아래에 ServletContext.getContextPath()을 호출하거나 getRequestURI() 등을 사용한다면 어떻게 될까요?

+0

좋은 지적. 나는 또 다른 접근법을 찾아야 할 것이다. –

0

내가 아는 한, 일반적인 방법은 accept-language HTTP 헤더를 사용하는 것입니다. 프리젠 테이션 언어는 프리젠 테이션 세부 사항이며 응용 프로그램을 탐색하기 위해 일련의 URL로 나타내어서는 안됩니다.

+0

검색 엔진과 호환되지 않기 때문에 accept-language 헤더가 작동하지 않습니다. 검색 엔진은 다른 언어로 콘텐츠를 거미줄로 보내기 위해 고유 한 링크가 필요합니다. –

0

response.encodeURL() 및 친구에서 URL 재 작성을 수행하여 문제를 해결했습니다. 요청 개체는 요청 체인 전체에서 래핑되고 대체되지만 응답 개체는 무방비 상태로 처리됩니다. 이것은 매우 안정적으로 작동합니다.

+0

이것이 UrlRewriterFilter 프로젝트에서 사용 된 방법이라고 생각합니다. http://tuckey.org/urlrewrite/ –

관련 문제