새로운 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을 다시 작성합니다.
좋은 지적. 나는 또 다른 접근법을 찾아야 할 것이다. –