Commit 690b826c by Tuomas Riihimäki

JsonP filter for /rest/* urls

1 parent 8f96083b
...@@ -18,7 +18,12 @@ ...@@ -18,7 +18,12 @@
<res-ref-name>jsf/ProjectStage</res-ref-name> <res-ref-name>jsf/ProjectStage</res-ref-name>
<res-type>java.lang.String</res-type> <res-type>java.lang.String</res-type>
</resource-ref> </resource-ref>
<!-- Handle hostname filter BEFORE jsonp so errors are transmitted correctly -->
<absolute-ordering>
<name>jsonpFilter</name>
<name>hostnameFilter</name>
</absolute-ordering>
<context-param> <context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name> <param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value> <param-value>Development</param-value>
...@@ -28,7 +33,8 @@ ...@@ -28,7 +33,8 @@
req.queryString and req.userAgent to logger MDC --> req.queryString and req.userAgent to logger MDC -->
<filter> <filter>
<filter-name>MDCInsertingServletFilter</filter-name> <filter-name>MDCInsertingServletFilter</filter-name>
<filter-class>ch.qos.logback.classic.helpers.MDCInsertingServletFilter</filter-class> <filter-class>ch.qos.logback.classic.helpers.MDCInsertingServletFilter
</filter-class>
</filter> </filter>
<filter-mapping> <filter-mapping>
<filter-name>MDCInsertingServletFilter</filter-name> <filter-name>MDCInsertingServletFilter</filter-name>
...@@ -41,20 +47,14 @@ ...@@ -41,20 +47,14 @@
<filter-class>org.primefaces.webapp.filter.FileUploadFilter <filter-class>org.primefaces.webapp.filter.FileUploadFilter
</filter-class> </filter-class>
</filter> </filter>
<filter>
<display-name>HostnameFilter</display-name>
<filter-name>HostnameFilter</filter-name>
<filter-class>fi.codecrew.moya.HostnameFilter</filter-class>
</filter>
<filter-mapping> <filter-mapping>
<filter-name>PrimefacesFileupload</filter-name> <filter-name>PrimefacesFileupload</filter-name>
<servlet-name>Faces Servlet</servlet-name> <servlet-name>Faces Servlet</servlet-name>
</filter-mapping> </filter-mapping>
<filter-mapping> <!-- <filter> <display-name>HostnameFilter</display-name> <filter-name>HostnameFilter</filter-name>
<filter-name>HostnameFilter</filter-name> <filter-class>fi.codecrew.moya.HostnameFilter</filter-class> </filter> <filter-mapping>
<servlet-name>*</servlet-name> <filter-name>HostnameFilter</filter-name> <servlet-name>*</servlet-name>
</filter-mapping> </filter-mapping> -->
<servlet> <servlet>
<servlet-name>Faces Servlet</servlet-name> <servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
......
...@@ -31,9 +31,11 @@ import javax.servlet.FilterConfig; ...@@ -31,9 +31,11 @@ import javax.servlet.FilterConfig;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.ServletRequest; import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.apache.http.HttpRequest;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.slf4j.MDC; import org.slf4j.MDC;
...@@ -47,6 +49,7 @@ import fi.codecrew.moya.rest.RestApplicationEntrypoint; ...@@ -47,6 +49,7 @@ import fi.codecrew.moya.rest.RestApplicationEntrypoint;
/** /**
* Servlet Filter implementation class HostnameFilter * Servlet Filter implementation class HostnameFilter
*/ */
@WebFilter(filterName = "hostnameFilter", displayName = "hostname and authentication filter", urlPatterns = { "/*" })
public class HostnameFilter implements Filter { public class HostnameFilter implements Filter {
private static final Logger logger = LoggerFactory.getLogger(HostnameFilter.class); private static final Logger logger = LoggerFactory.getLogger(HostnameFilter.class);
...@@ -90,7 +93,6 @@ public class HostnameFilter implements Filter { ...@@ -90,7 +93,6 @@ public class HostnameFilter implements Filter {
UNKNOWN, ANON, REST, USER UNKNOWN, ANON, REST, USER
} }
/** /**
* Add user information to SLF4J MDC context, so current user can be shown * Add user information to SLF4J MDC context, so current user can be shown
* in logs. * in logs.
......
package fi.codecrew.moya.rest;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.Charset;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@WebFilter(filterName = "jsonpFilter", displayName = "Rest JsonP filter", urlPatterns = { RestApplicationEntrypoint.REST_PATH + "/*" })
public class JsonpRestFilter implements Filter {
private static final String JSONP_PARAMETER = "jsonp";
private static final Logger logger = LoggerFactory.getLogger(JsonpRestFilter.class);
private static final Charset UTF8 = Charset.forName("UTF-8");
@Override
public void init(FilterConfig filterConfig) throws ServletException {
logger.info("Jsonp filter started");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
String jsonpFunc = request.getParameter(JSONP_PARAMETER);
boolean useJsonp = jsonpFunc != null && !jsonpFunc.isEmpty();
ServletOutputStream ostream = response.getOutputStream();
if (useJsonp) {
//.... Älä käytä response.getWriter():ä... Räjähtää.
//..... Älä käytä ostream.print():ä... Tulee writellä kirjoitettujen bytejen jälkeen...
ostream.write(jsonpFunc.getBytes(UTF8));
ostream.write("(".getBytes(UTF8));
}
chain.doFilter(request, response);
if (useJsonp) {
ostream.write(");".getBytes(UTF8));
}
}
@Override
public void destroy() {
logger.info("Jsonp filter destroyed");
}
}
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!