1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.cms.util;
35
36 import java.io.IOException;
37 import java.net.MalformedURLException;
38 import java.net.URL;
39
40 import javax.servlet.http.HttpServletRequest;
41 import javax.servlet.http.HttpServletResponse;
42
43 import org.apache.commons.lang3.ClassUtils;
44 import org.apache.commons.lang3.StringUtils;
45 import org.slf4j.Logger;
46 import org.slf4j.LoggerFactory;
47
48
49
50
51
52 public class RequestDispatchUtil {
53
54 private static final Logger log = LoggerFactory.getLogger(RequestDispatchUtil.class);
55
56 public static final String REDIRECT_PREFIX = "redirect:";
57 public static final String PERMANENT_PREFIX = "permanent:";
58 public static final String FORWARD_PREFIX = "forward:";
59
60
61
62
63 public static boolean dispatch(String targetUri, HttpServletRequest request, HttpServletResponse response) {
64
65 if (targetUri == null) {
66 return false;
67 }
68
69 if (targetUri.startsWith(REDIRECT_PREFIX)) {
70 String redirectUrl = StringUtils.substringAfter(targetUri, REDIRECT_PREFIX);
71 try {
72
73 if (isInternal(redirectUrl) && !StringUtils.startsWith(redirectUrl, request.getContextPath())) {
74 redirectUrl = request.getContextPath() + redirectUrl;
75 }
76
77 response.sendRedirect(response.encodeRedirectURL(redirectUrl));
78
79 } catch (IOException e) {
80 log.error("Failed to redirect to {}:{}", targetUri, e.getMessage());
81 }
82 return true;
83 }
84
85 if (targetUri.startsWith(PERMANENT_PREFIX)) {
86 String permanentUrl = StringUtils.substringAfter(targetUri, PERMANENT_PREFIX);
87 try {
88
89 if (isInternal(permanentUrl)) {
90 if (isUsingStandardPort(request)) {
91 permanentUrl = new URL(
92 request.getScheme(),
93 request.getServerName(),
94 request.getContextPath() + permanentUrl).toExternalForm();
95 } else {
96 permanentUrl = new URL(
97 request.getScheme(),
98 request.getServerName(),
99 request.getServerPort(),
100 request.getContextPath() + permanentUrl).toExternalForm();
101 }
102 }
103
104 response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
105 response.setHeader("Location", permanentUrl);
106
107 } catch (MalformedURLException e) {
108 log.error("Failed to create permanent url to redirect to {}:{}", targetUri, e.getMessage());
109 }
110 return true;
111 }
112
113 if (targetUri.startsWith(FORWARD_PREFIX)) {
114 String forwardUrl = StringUtils.substringAfter(targetUri, FORWARD_PREFIX);
115 try {
116 request.getRequestDispatcher(forwardUrl).forward(request, response);
117 } catch (Exception e) {
118 log.error("Failed to forward to {} - {}:{}", forwardUrl, ClassUtils.getShortClassName(e.getClass()), e.getMessage());
119 }
120 return true;
121 }
122
123 return false;
124 }
125
126 private static boolean isUsingStandardPort(HttpServletRequest request) {
127 String requestScheme = request.getScheme();
128 int serverPort = request.getServerPort();
129 return (serverPort == 80 && "http".equals(requestScheme)) || (serverPort == 443 && "https".equals(requestScheme));
130 }
131
132 private static boolean isInternal(String url) {
133 return !url.startsWith("http://") && !url.startsWith("https://");
134 }
135 }