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>
...@@ -115,5 +115,5 @@ ...@@ -115,5 +115,5 @@
<persistence-unit-ref> <persistence-unit-ref>
<persistence-unit-ref-name>BortalEMF</persistence-unit-ref-name> <persistence-unit-ref-name>BortalEMF</persistence-unit-ref-name>
</persistence-unit-ref> </persistence-unit-ref>
</web-app> </web-app>
\ No newline at end of file
...@@ -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.
...@@ -102,12 +104,12 @@ public class HostnameFilter implements Filter { ...@@ -102,12 +104,12 @@ public class HostnameFilter implements Filter {
Principal userPrincipal = request.getUserPrincipal(); Principal userPrincipal = request.getUserPrincipal();
if (userPrincipal != null) { if (userPrincipal != null) {
String userString = userPrincipal.getName(); String userString = userPrincipal.getName();
MDC.put("user", userString); MDC.put("user", userString);
MDC.put("authtype", authType != null ? authType.name() : "null"); MDC.put("authtype", authType != null ? authType.name() : "null");
} else { } else {
MDC.put("user", "null"); MDC.put("user", "null");
MDC.put("authtype", "null"); MDC.put("authtype", "null");
} }
} }
/** /**
...@@ -223,9 +225,9 @@ public class HostnameFilter implements Filter { ...@@ -223,9 +225,9 @@ public class HostnameFilter implements Filter {
protected void parseHostname(HttpServletRequest httpRequest) protected void parseHostname(HttpServletRequest httpRequest)
{ {
// logger.info("Path info {}", httpRequest.getPathInfo()); // null // logger.info("Path info {}", httpRequest.getPathInfo()); // null
// logger.info("querystring {}", httpRequest.getQueryString()); // ln=primefaces&amp;v=4.0 // logger.info("querystring {}", httpRequest.getQueryString()); // ln=primefaces&amp;v=4.0
// logger.info("ctxpath {}", httpRequest.getContextPath()); // /MoyaWeb // logger.info("ctxpath {}", httpRequest.getContextPath()); // /MoyaWeb
// logger.info("pathTranslated {}", httpRequest.getPathTranslated()); // null // logger.info("pathTranslated {}", httpRequest.getPathTranslated()); // null
// logger.info("requestUri {}", httpRequest.getRequestURI()); // /MoyaWeb/javax.faces.resource/jquery/jquery.js.jsf // logger.info("requestUri {}", httpRequest.getRequestURI()); // /MoyaWeb/javax.faces.resource/jquery/jquery.js.jsf
// logger.info("URL {}", httpRequest.getRequestURL().toString()); // http://localhost:8080/MoyaWeb/javax.faces.resource/jquery/jquery.js.jsf // logger.info("URL {}", httpRequest.getRequestURL().toString()); // http://localhost:8080/MoyaWeb/javax.faces.resource/jquery/jquery.js.jsf
......
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!