2011-10-09 2 views
1

서블릿 필터 (javax.servlet.Filter)를 사용하여 간단한 urlrewriter를 작성하려고합니다. 필터는 모든 요청을 검사하고 URL에 따라 서블릿 (또는 JSP)으로 재 라우팅합니다. 서블릿 필터를 사용하는 urlrewrite

: http://server/app/person/Roscoe은 내 FilterdoFilter는 요청을 검사하고, 패턴이 일치하는 경우, 새로운 HttpServletRequest를 만들고 chain.doFilter에 전달 http://server/app/person.jsp?name=Roscoe

로 번역 할 것이다. 새 HttpServletRequestjavax.servlet.http.HttpServletRequestWrapper으로 확장되며 매개 변수, URI, URL, 쿼리 문자열 및 서블릿 경로를 새 JSP (/person.jsp?name=Roscoe)처럼 덮어 씁니다. 나는 새로운 요청을 chain.doFilter에 전달함으로써 JSP로 리디렉션 될 것이라고 생각했습니다. person.jsp의 내용이 브라우저에 반환된다는 것을 제외하고는 일종의 작동합니다. person.jsp 내용을 실행하지 않고 일반 텍스트 (Content-Type: text/plain)로 반환합니다.

web.xml이 필터 및 필터 매핑 :

<filter-mapping> 
    <filter-name>MyFilter</filter-name> 
    <url-pattern>*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
</filter-mapping> 

요청을 다시 작성 서블릿 필터를 사용하는 것이 올바른이 있었다인가?

나는 기존의 urlrewriters (예 : Tuckey)를 알고 있지만 여전히 배우고 더 나은 제어를 위해 스스로 작성하려고합니다.

후속 :

config.getServletContext().getRequestDispatcher("/person.jsp").forward(req, resp); 

이 더 잘 작동하지만 내 CSS 파일 (styles.css) 여전히 : 나는 또한 (req은, 랩 된 Request가되는 경우) 수행하여 대신 chain.doFilter의 리디렉션 시도했습니다 이 http://server/app/styles.css

후속 2해야하는 반면, 원래의 URL http://server/app/person/styles.css 상대 : 경로 문제는 this question이 적용됩니다.

+1

http://www.tuckey.org/urlrewrite/을 확인 했습니까? – Adi

+1

"나는 기존의 urlrewriters (Tuckey와 같은)를 알고 있지만 여전히 배우고 더 나은 제어를 위해 내 자신의 글을 쓰고 싶습니다." –

답변

2

요청을 래핑하고 상태를 변경하는 것만으로는 충분하지 않습니다. 적절한 리소스로 전달/리디렉션해야합니다. 필터와 서블릿은 URL 패턴에 매핑됩니다. 실행중인 체인은 들어오는 요청 URL의 패턴을 기반으로 작성되었습니다. 요청에서 URL을 변경하고 체인의 다음 항목으로 전달하면 체인을 다시 작성하여 새 URL을 설명하지 않습니다. 이것이 전달/리디렉션의 용도입니다.

관련 문제