Mercurial > dive4elements > river
annotate gwt-client/src/main/java/org/dive4elements/river/client/server/ProxyServlet.java @ 5950:38d161edba77
Add SamlServlet to implement actual login via SAML Ticket.
This is the main part of single-sign-on for flys from issue1265.
SamlServlet is an adapted copy of LoginServlet. The code shared by both
classes will be extracted into a base class later.
author | Bernhard Herzog <bh@intevation.de> |
---|---|
date | Wed, 08 May 2013 17:56:14 +0200 |
parents | 172338b1407f |
children | ea9eef426962 |
rev | line source |
---|---|
5861
172338b1407f
GWT client: Added copyright header.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5838
diff
changeset
|
1 /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde |
172338b1407f
GWT client: Added copyright header.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5838
diff
changeset
|
2 * Software engineering by Intevation GmbH |
172338b1407f
GWT client: Added copyright header.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5838
diff
changeset
|
3 * |
172338b1407f
GWT client: Added copyright header.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5838
diff
changeset
|
4 * This file is Free Software under the GNU AGPL (>=v3) |
172338b1407f
GWT client: Added copyright header.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5838
diff
changeset
|
5 * and comes with ABSOLUTELY NO WARRANTY! Check out the |
172338b1407f
GWT client: Added copyright header.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5838
diff
changeset
|
6 * documentation coming with Dive4Elements River for details. |
172338b1407f
GWT client: Added copyright header.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5838
diff
changeset
|
7 */ |
172338b1407f
GWT client: Added copyright header.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5838
diff
changeset
|
8 |
5835
821a02bbfb4e
Fixed internal java dependencies
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5834
diff
changeset
|
9 package org.dive4elements.river.client.server; |
3497
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
10 |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
11 import java.io.InputStream; |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
12 import java.io.IOException; |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
13 import java.io.OutputStream; |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
14 import java.util.Enumeration; |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
15 |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
16 import javax.servlet.ServletConfig; |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
17 import javax.servlet.http.HttpServlet; |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
18 import javax.servlet.http.HttpServletRequest; |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
19 import javax.servlet.http.HttpServletResponse; |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
20 import javax.servlet.http.HttpSession; |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
21 |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
22 import org.apache.http.Header; |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
23 import org.apache.http.HttpEntity; |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
24 import org.apache.http.HttpResponse; |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
25 import org.apache.http.StatusLine; |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
26 import org.apache.http.client.HttpClient; |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
27 import org.apache.http.client.methods.HttpGet; |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
28 import org.apache.http.impl.client.DefaultHttpClient; |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
29 |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
30 import org.apache.log4j.Logger; |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
31 |
5835
821a02bbfb4e
Fixed internal java dependencies
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5834
diff
changeset
|
32 import org.dive4elements.river.client.server.auth.User; |
3497
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
33 |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
34 /** |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
35 * Implements a Proxy for HTTP Requests |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
36 */ |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
37 public class ProxyServlet |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
38 extends HttpServlet |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
39 { |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
40 private static Logger logger = Logger.getLogger(ProxyServlet.class); |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
41 private String remoteurl; |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
42 |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
43 @Override |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
44 public void init(ServletConfig config) { |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
45 this.remoteurl = config.getInitParameter("remoteurl"); |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
46 } |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
47 |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
48 @Override |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
49 public void doPost(HttpServletRequest req, HttpServletResponse resp) { |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
50 } |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
51 |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
52 @Override |
3498
92239b53823f
ProxyServlet: Use block instead of byte wise copy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3497
diff
changeset
|
53 public void doGet(HttpServletRequest req, HttpServletResponse resp) |
92239b53823f
ProxyServlet: Use block instead of byte wise copy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3497
diff
changeset
|
54 throws IOException { |
3497
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
55 HttpClient httpclient = new DefaultHttpClient(); |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
56 |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
57 String requesturi = req.getRequestURI(); |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
58 String query = req.getQueryString(); |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
59 |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
60 HttpGet httpget = new HttpGet(this.remoteurl + "?" + query); |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
61 |
3498
92239b53823f
ProxyServlet: Use block instead of byte wise copy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3497
diff
changeset
|
62 boolean debug = logger.isDebugEnabled(); |
92239b53823f
ProxyServlet: Use block instead of byte wise copy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3497
diff
changeset
|
63 |
3497
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
64 for (Enumeration e = req.getHeaderNames(); e.hasMoreElements();) { |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
65 String name = (String)e.nextElement(); |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
66 for (Enumeration f = req.getHeaders(name); f.hasMoreElements();) { |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
67 String value = (String)f.nextElement(); |
3498
92239b53823f
ProxyServlet: Use block instead of byte wise copy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3497
diff
changeset
|
68 if (debug) { |
92239b53823f
ProxyServlet: Use block instead of byte wise copy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3497
diff
changeset
|
69 logger.debug( |
92239b53823f
ProxyServlet: Use block instead of byte wise copy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3497
diff
changeset
|
70 "Adding request header " + name + " : " + value); |
92239b53823f
ProxyServlet: Use block instead of byte wise copy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3497
diff
changeset
|
71 } |
3497
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
72 httpget.addHeader(name, value); |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
73 } |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
74 } |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
75 |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
76 HttpResponse response = httpclient.execute(httpget); |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
77 |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
78 StatusLine statusline = response.getStatusLine(); |
3498
92239b53823f
ProxyServlet: Use block instead of byte wise copy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3497
diff
changeset
|
79 if (debug) { |
92239b53823f
ProxyServlet: Use block instead of byte wise copy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3497
diff
changeset
|
80 logger.debug("Response statuscode " + statusline.getStatusCode()); |
92239b53823f
ProxyServlet: Use block instead of byte wise copy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3497
diff
changeset
|
81 } |
3497
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
82 resp.setStatus(statusline.getStatusCode()); |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
83 |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
84 Header[] headers = response.getAllHeaders(); |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
85 for(Header header : headers) { |
3498
92239b53823f
ProxyServlet: Use block instead of byte wise copy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3497
diff
changeset
|
86 if (debug) { |
92239b53823f
ProxyServlet: Use block instead of byte wise copy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3497
diff
changeset
|
87 logger.debug( |
92239b53823f
ProxyServlet: Use block instead of byte wise copy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3497
diff
changeset
|
88 "Adding response header " + header.getName() + |
92239b53823f
ProxyServlet: Use block instead of byte wise copy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3497
diff
changeset
|
89 " : " + header.getValue()); |
92239b53823f
ProxyServlet: Use block instead of byte wise copy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3497
diff
changeset
|
90 } |
3497
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
91 resp.setHeader(header.getName(), header.getValue()); |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
92 } |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
93 |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
94 HttpEntity entity = response.getEntity(); |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
95 if (entity != null) { |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
96 InputStream instream = entity.getContent(); |
3498
92239b53823f
ProxyServlet: Use block instead of byte wise copy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3497
diff
changeset
|
97 byte [] buf = new byte[4096]; |
3497
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
98 try { |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
99 OutputStream outstream = resp.getOutputStream(); |
3498
92239b53823f
ProxyServlet: Use block instead of byte wise copy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3497
diff
changeset
|
100 try { |
92239b53823f
ProxyServlet: Use block instead of byte wise copy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3497
diff
changeset
|
101 int read; |
92239b53823f
ProxyServlet: Use block instead of byte wise copy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3497
diff
changeset
|
102 while ((read = instream.read(buf)) >= 0) { |
92239b53823f
ProxyServlet: Use block instead of byte wise copy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3497
diff
changeset
|
103 outstream.write(buf, 0, read); |
92239b53823f
ProxyServlet: Use block instead of byte wise copy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3497
diff
changeset
|
104 } |
92239b53823f
ProxyServlet: Use block instead of byte wise copy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3497
diff
changeset
|
105 outstream.flush(); |
3497
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
106 } |
3498
92239b53823f
ProxyServlet: Use block instead of byte wise copy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3497
diff
changeset
|
107 finally { |
92239b53823f
ProxyServlet: Use block instead of byte wise copy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3497
diff
changeset
|
108 outstream.close(); |
92239b53823f
ProxyServlet: Use block instead of byte wise copy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3497
diff
changeset
|
109 } |
3497
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
110 } |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
111 finally { |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
112 instream.close(); |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
113 } |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
114 } |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
115 } |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
116 |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
117 private User getUser(HttpServletRequest req) { |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
118 HttpSession session = req.getSession(); |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
119 return (User)session.getAttribute("user"); |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
120 } |
88feb3347aa5
Implement a ProxyServlet
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
121 } |