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 import javax.servlet.http.HttpServletRequest;
40 import javax.servlet.http.HttpServletResponse;
41
42 import org.apache.commons.lang.ClassUtils;
43 import org.apache.commons.lang.StringUtils;
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
46
47
48
49
50
51
52
53 public class RequestDispatchUtil {
54
55 private static final Logger log = LoggerFactory.getLogger(RequestDispatchUtil.class);
56
57 public static final String REDIRECT_PREFIX = "redirect:";
58 public static final String PERMANENT_PREFIX = "permanent:";
59 public static final String FORWARD_PREFIX = "forward:";
60
61
62
63
64 public static boolean dispatch(String targetUri, HttpServletRequest request, HttpServletResponse response) {
65
66 if (targetUri == null) {
67 return false;
68 }
69
70 if (targetUri.startsWith(REDIRECT_PREFIX)) {
71 String redirectUrl = StringUtils.substringAfter(targetUri, REDIRECT_PREFIX);
72 try {
73
74 if (isInternal(redirectUrl)) {
75 redirectUrl = request.getContextPath() + redirectUrl;
76 }
77
78 response.sendRedirect(response.encodeRedirectURL(redirectUrl));
79
80 } catch (IOException e) {
81 log.error("Failed to redirect to {}:{}", targetUri, e.getMessage());
82 }
83 return true;
84 }
85
86 if (targetUri.startsWith(PERMANENT_PREFIX)) {
87 String permanentUrl = StringUtils.substringAfter(targetUri, PERMANENT_PREFIX);
88 try {
89
90 if (isInternal(permanentUrl)){
91 if (isUsingStandardPort(request)) {
92 permanentUrl = new URL(
93 request.getScheme(),
94 request.getServerName(),
95 request.getContextPath() + permanentUrl).toExternalForm();
96 } else {
97 permanentUrl = new URL(
98 request.getScheme(),
99 request.getServerName(),
100 request.getServerPort(),
101 request.getContextPath() + permanentUrl).toExternalForm();
102 }
103 }
104
105 response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
106 response.setHeader("Location", permanentUrl);
107
108 } catch (MalformedURLException e) {
109 log.error("Failed to create permanent url to redirect to {}:{}", targetUri, e.getMessage());
110 }
111 return true;
112 }
113
114 if (targetUri.startsWith(FORWARD_PREFIX)) {
115 String forwardUrl = StringUtils.substringAfter(targetUri, FORWARD_PREFIX);
116 try {
117 request.getRequestDispatcher(forwardUrl).forward(request, response);
118 } catch (Exception e) {
119 log.error("Failed to forward to {} - {}:{}", new Object[]{
120 forwardUrl,
121 ClassUtils.getShortClassName(e.getClass()),
122 e.getMessage()});
123 }
124 return true;
125 }
126
127 return false;
128 }
129
130 private static boolean isUsingStandardPort(HttpServletRequest request) {
131 String requestScheme = request.getScheme();
132 int serverPort = request.getServerPort();
133 return (serverPort == 80 && "http".equals(requestScheme)) || (serverPort == 443 && "https".equals(requestScheme));
134 }
135
136 private static boolean isInternal(String url) {
137 return !url.startsWith("http://") && !url.startsWith("https://");
138 }
139 }