Estoy intentando crear un sitio web simple usando Clojure/Compojure y quiero alimentar aplicar un filtro de servlet a la solicitud/respuesta (es decir, una instancia javax.servlet.Filter estándar) .Uso de javax.servlet.Filter con Compojure
p. Ej. si el código fuente actual es:
(defroutes my-app
(GET "/*"
(html [:h1 "Hello Foo!!"]))
)
Me gustaría añadir un filtro de la siguiente manera:
(defroutes my-app
(GET "/*"
(FILTER my-filter-name
(html [:h1 "Hello Foo!!"])))
)
Donde mi-filter-name es cierto caso arbitrario de javax.servlet.Filter.
¿Alguna idea de cómo hacerlo de manera efectiva y elegante?
¿Desea aplicar el filtro a todas las rutas o solo algunas? En el primer caso, puede ser más fácil colocar el filtro sobre el Anillo/Compuesto, en el nivel del servlet. En el segundo caso, debe escribir (con reify o proxy) un adaptador que convierta un filtro en un middleware. – cgrand
Gracias muy útil. Me gustaría hacer el segundo, pero no parece posible porque los parámetros de solicitud/respuesta que necesita el filtro no se pasan como parámetros al sistema de middleware. Estoy intentando el primero - ¡publicaré una respuesta si la hago funcionar! – mikera
Para hacer lo segundo, también necesita crear objetos que implementen HttpServletRequest/Response en la parte superior de los mapas de solicitud/respuesta. O para usar la implementación existente (por ejemplo, http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/mock/web/MockHttpServletRequest.html) pero creo que es más sencillo implementarlos con reify que lidiar con un objeto simulado con estado, como dice Rich Hickey "¡Esos objetos simulados, te están burlando!" – cgrand