1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.apache.struts2.dispatcher.ng.filter;
22
23 import org.apache.struts2.StrutsStatics;
24 import org.apache.struts2.dispatcher.Dispatcher;
25 import org.apache.struts2.dispatcher.mapper.ActionMapping;
26 import org.apache.struts2.dispatcher.ng.ExecuteOperations;
27 import org.apache.struts2.dispatcher.ng.InitOperations;
28 import org.apache.struts2.dispatcher.ng.PrepareOperations;
29
30 import javax.servlet.*;
31 import javax.servlet.http.HttpServletRequest;
32 import javax.servlet.http.HttpServletResponse;
33 import java.io.IOException;
34 import java.util.List;
35 import java.util.regex.Pattern;
36
37 /***
38 * Handles both the preparation and execution phases of the Struts dispatching process. This filter is better to use
39 * when you don't have another filter that needs access to action context information, such as Sitemesh.
40 */
41 public class StrutsPrepareAndExecuteFilter implements StrutsStatics, Filter {
42 protected PrepareOperations prepare;
43 protected ExecuteOperations execute;
44 protected List<Pattern> excludedPatterns = null;
45
46 public void init(FilterConfig filterConfig) throws ServletException {
47 InitOperations init = new InitOperations();
48 try {
49 FilterHostConfig config = new FilterHostConfig(filterConfig);
50 init.initLogging(config);
51 Dispatcher dispatcher = init.initDispatcher(config);
52 init.initStaticContentLoader(config, dispatcher);
53
54 prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher);
55 execute = new ExecuteOperations(filterConfig.getServletContext(), dispatcher);
56 this.excludedPatterns = init.buildExcludedPatternsList(dispatcher);
57
58 postInit(dispatcher, filterConfig);
59 } finally {
60 init.cleanup();
61 }
62
63 }
64
65 /***
66 * Callback for post initialization
67 */
68 protected void postInit(Dispatcher dispatcher, FilterConfig filterConfig) {
69 }
70
71 public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
72
73 HttpServletRequest request = (HttpServletRequest) req;
74 HttpServletResponse response = (HttpServletResponse) res;
75
76 try {
77 prepare.setEncodingAndLocale(request, response);
78 prepare.createActionContext(request, response);
79 prepare.assignDispatcherToThread();
80 if ( excludedPatterns != null && prepare.isUrlExcluded(request, excludedPatterns)) {
81 chain.doFilter(request, response);
82 } else {
83 request = prepare.wrapRequest(request);
84 ActionMapping mapping = prepare.findActionMapping(request, response, true);
85 if (mapping == null) {
86 boolean handled = execute.executeStaticResourceRequest(request, response);
87 if (!handled) {
88 chain.doFilter(request, response);
89 }
90 } else {
91 execute.executeAction(request, response, mapping);
92 }
93 }
94 } finally {
95 prepare.cleanupRequest(request);
96 }
97 }
98
99 public void destroy() {
100 prepare.cleanupDispatcher();
101 }
102 }