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 if (targetUri.startsWith(REDIRECT_PREFIX)) {
70 String redirectUrl = StringUtils.substringAfter(targetUri, REDIRECT_PREFIX);
71 try {
72
73 if (isInternal(redirectUrl)) {
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 {} - {}:{}", new Object[]{
119 forwardUrl,
120 ClassUtils.getShortClassName(e.getClass()),
121 e.getMessage()});
122 }
123 return true;
124 }
125
126 return false;
127 }
128
129 private static boolean isUsingStandardPort(HttpServletRequest request) {
130 String requestScheme = request.getScheme();
131 int serverPort = request.getServerPort();
132 return (serverPort == 80 && "http".equals(requestScheme)) || (serverPort == 443 && "https".equals(requestScheme));
133 }
134
135 private static boolean isInternal(String url) {
136 return !url.startsWith("http://") && !url.startsWith("https://");
137 }
138 }