Hi.
I have modified StrutsPrepareAndExecuteFilter, StrutsPrepareFilter and
StrutsExecuteFilter to enable excluding of uri-patters. The filter-config is as
follows:
<filter>
<filter-name>struts2-prepare</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter</filter-class>
<init-param>
<description>Comma separated list of patterns
(java.util.regex.Pattern) to be excluded from Struts2-processing</description>
<param-name>excludedPatterns</param-name>
<param-value>/lang/.*,/pages/.*</param-value>
</init-param>
</filter>
Attached is a patch against trunk(revision 747785).
My original plan was to be able to configure this by setting a property
specifying the pattern(s) in struts.properties or struts.xml, but nobody
proposed a solution for how I could use those properties from the
servlet-filters when I asked...
--
Andreas Joseph Krogh <[email protected]>
Senior Software Developer / CEO
------------------------+---------------------------------------------+
OfficeNet AS | The most difficult thing in the world is to |
Rosenholmveien 25 | know how to do a thing and to watch |
1414 TrollÄsen | somebody else doing it wrong, without |
NORWAY | comment. |
| |
Tlf: +47 24 15 38 90 | |
Fax: +47 24 15 38 91 | |
Mobile: +47 909 56 963 | |
------------------------+---------------------------------------------+
Index: src/main/java/org/apache/struts2/dispatcher/ng/filter/StrutsPrepareAndExecuteFilter.java
===================================================================
--- src/main/java/org/apache/struts2/dispatcher/ng/filter/StrutsPrepareAndExecuteFilter.java (revision 747785)
+++ src/main/java/org/apache/struts2/dispatcher/ng/filter/StrutsPrepareAndExecuteFilter.java (working copy)
@@ -21,6 +21,7 @@
package org.apache.struts2.dispatcher.ng.filter;
import org.apache.struts2.StrutsStatics;
+import org.apache.struts2.RequestUtils;
import org.apache.struts2.dispatcher.Dispatcher;
import org.apache.struts2.dispatcher.ng.PrepareOperations;
import org.apache.struts2.dispatcher.ng.ExecuteOperations;
@@ -31,14 +32,31 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
+import java.util.regex.Pattern;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Collections;
/**
* Handles both the preparation and execution phases of the Struts dispatching process. This filter is better to use
* when you don't have another filter that needs access to action context information, such as Sitemesh.
+ * <pre>
+ <filter>
+ <filter-name>struts2-prepare</filter-name>
+ <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
+ <init-param>
+ <description>Comma separated list of patterns (java.util.regex.Pattern) to be excluded from Struts2-processing</description>
+ <param-name>excludedPatterns</param-name>
+ <param-value>/lang/.*,/pages/.*</param-value>
+ </init-param>
+ </filter>
+ * </pre>
+ *
*/
public class StrutsPrepareAndExecuteFilter implements StrutsStatics, Filter {
private PrepareOperations prepare;
private ExecuteOperations execute;
+ private List<Pattern> excludedPatterns = null;
public void init(FilterConfig filterConfig) throws ServletException {
InitOperations init = new InitOperations();
@@ -50,6 +68,7 @@
prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher);
execute = new ExecuteOperations(filterConfig.getServletContext(), dispatcher);
+ setExcludedPatterns(config.getInitParameter("excludedPatterns"));
} finally {
init.cleanup();
}
@@ -61,6 +80,11 @@
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
+ if (excludeUrl(request)) {
+ chain.doFilter(request, response);
+ return;
+ }
+
try {
prepare.createActionContext(request, response);
prepare.assignDispatcherToThread();
@@ -80,6 +104,54 @@
}
}
+ private void setExcludedPatterns(String patterns) {
+ if (null != patterns && patterns.trim().length() != 0) {
+ List<Pattern> list = new ArrayList<Pattern>();
+ String[] tokens = patterns.split(",");
+ for (String token : tokens) {
+ list.add(Pattern.compile(token.trim()));
+ }
+ this.excludedPatterns = Collections.unmodifiableList(list);
+ } else {
+ this.excludedPatterns = null;
+ }
+ }
+
+ /**
+ * Gets the uri from the request
+ *
+ * @param request
+ * The request
+ * @return The uri
+ */
+ protected String getUri(HttpServletRequest request) {
+ // handle http dispatcher includes.
+ String uri = (String) request.getAttribute("javax.servlet.include.servlet_path");
+ if (uri != null) {
+ return uri;
+ }
+
+ uri = RequestUtils.getServletPath(request);
+ if (uri != null && !"".equals(uri)) {
+ return uri;
+ }
+
+ uri = request.getRequestURI();
+ return uri.substring(request.getContextPath().length());
+ }
+
+ private boolean excludeUrl(HttpServletRequest request) {
+ if (excludedPatterns != null) {
+ String uri = getUri(request);
+ for (Pattern pattern : excludedPatterns) {
+ if (pattern.matcher(uri).matches()) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
public void destroy() {
prepare.cleanupDispatcher();
}
Index: src/main/java/org/apache/struts2/dispatcher/ng/filter/StrutsPrepareFilter.java
===================================================================
--- src/main/java/org/apache/struts2/dispatcher/ng/filter/StrutsPrepareFilter.java (revision 747785)
+++ src/main/java/org/apache/struts2/dispatcher/ng/filter/StrutsPrepareFilter.java (working copy)
@@ -21,6 +21,7 @@
package org.apache.struts2.dispatcher.ng.filter;
import org.apache.struts2.StrutsStatics;
+import org.apache.struts2.RequestUtils;
import org.apache.struts2.dispatcher.Dispatcher;
import org.apache.struts2.dispatcher.ng.PrepareOperations;
import org.apache.struts2.dispatcher.ng.InitOperations;
@@ -29,12 +30,28 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.regex.Pattern;
/**
* Prepares the request for execution by a later {...@link org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter} filter instance.
+ * <pre>
+ <filter>
+ <filter-name>struts2-prepare</filter-name>
+ <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter</filter-class>
+ <init-param>
+ <description>Comma separated list of patterns (java.util.regex.Pattern) to be excluded from Struts2-processing</description>
+ <param-name>excludedPatterns</param-name>
+ <param-value>/lang/.*,/pages/.*</param-value>
+ </init-param>
+ </filter>
+ * </pre>
*/
public class StrutsPrepareFilter implements StrutsStatics, Filter {
private PrepareOperations prepare;
+ private List<Pattern> excludedPatterns = null;
public void init(FilterConfig filterConfig) throws ServletException {
InitOperations init = new InitOperations();
@@ -43,8 +60,9 @@
init.initLogging(config);
Dispatcher dispatcher = init.initDispatcher(config);
- prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher);
- } finally {
+ prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher);
+ setExcludedPatterns(config.getInitParameter("excludedPatterns"));
+ } finally {
init.cleanup();
}
@@ -55,7 +73,12 @@
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
- try {
+ if (excludeUrl(request)) {
+ chain.doFilter(request, response);
+ return;
+ }
+
+ try {
prepare.createActionContext(request, response);
prepare.assignDispatcherToThread();
prepare.setEncodingAndLocale(request, response);
@@ -68,7 +91,55 @@
}
}
- public void destroy() {
+ private void setExcludedPatterns(String patterns) {
+ if (null != patterns && patterns.trim().length() != 0) {
+ List<Pattern> list = new ArrayList<Pattern>();
+ String[] tokens = patterns.split(",");
+ for (String token : tokens) {
+ list.add(Pattern.compile(token.trim()));
+ }
+ this.excludedPatterns = Collections.unmodifiableList(list);
+ } else {
+ this.excludedPatterns = null;
+ }
+ }
+
+ /**
+ * Gets the uri from the request
+ *
+ * @param request
+ * The request
+ * @return The uri
+ */
+ protected String getUri(HttpServletRequest request) {
+ // handle http dispatcher includes.
+ String uri = (String) request.getAttribute("javax.servlet.include.servlet_path");
+ if (uri != null) {
+ return uri;
+ }
+
+ uri = RequestUtils.getServletPath(request);
+ if (uri != null && !"".equals(uri)) {
+ return uri;
+ }
+
+ uri = request.getRequestURI();
+ return uri.substring(request.getContextPath().length());
+ }
+
+ private boolean excludeUrl(HttpServletRequest request) {
+ if (excludedPatterns != null) {
+ String uri = getUri(request);
+ for (Pattern pattern : excludedPatterns) {
+ if (pattern.matcher(uri).matches()) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public void destroy() {
prepare.cleanupDispatcher();
}
}
\ No newline at end of file
Index: src/main/java/org/apache/struts2/dispatcher/ng/filter/StrutsExecuteFilter.java
===================================================================
--- src/main/java/org/apache/struts2/dispatcher/ng/filter/StrutsExecuteFilter.java (revision 747785)
+++ src/main/java/org/apache/struts2/dispatcher/ng/filter/StrutsExecuteFilter.java (working copy)
@@ -21,6 +21,7 @@
package org.apache.struts2.dispatcher.ng.filter;
import org.apache.struts2.StrutsStatics;
+import org.apache.struts2.RequestUtils;
import org.apache.struts2.dispatcher.Dispatcher;
import org.apache.struts2.dispatcher.ng.PrepareOperations;
import org.apache.struts2.dispatcher.ng.ExecuteOperations;
@@ -31,19 +32,36 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
+import java.util.regex.Pattern;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Collections;
/**
* Executes the discovered request information. This filter requires the {...@link StrutsPrepareFilter} to have already
* been executed in the current chain.
+ * <pre>
+ <filter>
+ <filter-name>struts2-prepare</filter-name>
+ <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter</filter-class>
+ <init-param>
+ <description>Comma separated list of patterns (java.util.regex.Pattern) to be excluded from Struts2-processing</description>
+ <param-name>excludedPatterns</param-name>
+ <param-value>/lang/.*,/pages/.*</param-value>
+ </init-param>
+ </filter>
+ * </pre>
*/
public class StrutsExecuteFilter implements StrutsStatics, Filter {
private PrepareOperations prepare;
private ExecuteOperations execute;
+ private List<Pattern> excludedPatterns = null;
private FilterConfig filterConfig;
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
+ setExcludedPatterns(filterConfig.getInitParameter("excludedPatterns"));
}
protected synchronized void lazyInit() {
@@ -63,6 +81,11 @@
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
+ if (excludeUrl(request)) {
+ chain.doFilter(request, response);
+ return;
+ }
+
// This is necessary since we need the dispatcher instance, which was created by the prepare filter
lazyInit();
@@ -77,6 +100,54 @@
}
}
+ private void setExcludedPatterns(String patterns) {
+ if (null != patterns && patterns.trim().length() != 0) {
+ List<Pattern> list = new ArrayList<Pattern>();
+ String[] tokens = patterns.split(",");
+ for (String token : tokens) {
+ list.add(Pattern.compile(token.trim()));
+ }
+ this.excludedPatterns = Collections.unmodifiableList(list);
+ } else {
+ this.excludedPatterns = null;
+ }
+ }
+
+ /**
+ * Gets the uri from the request
+ *
+ * @param request
+ * The request
+ * @return The uri
+ */
+ protected String getUri(HttpServletRequest request) {
+ // handle http dispatcher includes.
+ String uri = (String) request.getAttribute("javax.servlet.include.servlet_path");
+ if (uri != null) {
+ return uri;
+ }
+
+ uri = RequestUtils.getServletPath(request);
+ if (uri != null && !"".equals(uri)) {
+ return uri;
+ }
+
+ uri = request.getRequestURI();
+ return uri.substring(request.getContextPath().length());
+ }
+
+ private boolean excludeUrl(HttpServletRequest request) {
+ if (excludedPatterns != null) {
+ String uri = getUri(request);
+ for (Pattern pattern : excludedPatterns) {
+ if (pattern.matcher(uri).matches()) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
public void destroy() {
prepare = null;
execute = null;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]