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