Fixing login redirect in MobileWebApp sample. We now send a redirect URL with every request, and use it if the user isn't logged in. We calculate the redirect URL on the client because the client browser has built in support for parsing the URL components.
Example: http://jlabanca-testing.appspot.com/#tl:
Review at http://gwt-code-reviews.appspot.com/1450817
Review by: rjrjr@google.com
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@10333 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/samples/mobilewebapp/src/main/java/com/google/gwt/sample/gaerequest/client/GaeAuthRequestTransport.java b/samples/mobilewebapp/src/main/java/com/google/gwt/sample/gaerequest/client/GaeAuthRequestTransport.java
index ffccb90..3c87b17 100644
--- a/samples/mobilewebapp/src/main/java/com/google/gwt/sample/gaerequest/client/GaeAuthRequestTransport.java
+++ b/samples/mobilewebapp/src/main/java/com/google/gwt/sample/gaerequest/client/GaeAuthRequestTransport.java
@@ -17,10 +17,11 @@
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.http.client.Request;
+import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.Response;
import com.google.gwt.sample.gaerequest.shared.GaeHelper;
-import com.google.gwt.user.client.Window;
+import com.google.gwt.user.client.Window.Location;
import com.google.web.bindery.requestfactory.gwt.client.DefaultRequestTransport;
import com.google.web.bindery.requestfactory.shared.ServerFailure;
@@ -36,14 +37,29 @@
}
@Override
+ protected void configureRequestBuilder(RequestBuilder builder) {
+ super.configureRequestBuilder(builder);
+
+ /*
+ * Add the redirect URL in case the user is logged out.
+ *
+ * /MobileWebApp.html?parem0=value0¶m1=value1#hash
+ */
+ String redirectUrl = Location.getPath() + Location.getQueryString() + Location.getHash();
+ builder.setHeader(GaeHelper.REDIRECT_URL_HTTP_HEADER_NAME, redirectUrl);
+ }
+
+ @Override
protected RequestCallback createRequestCallback(final TransportReceiver receiver) {
final RequestCallback superCallback = super.createRequestCallback(receiver);
return new RequestCallback() {
+ @Override
public void onError(Request request, Throwable exception) {
superCallback.onError(request, exception);
}
+ @Override
public void onResponseReceived(Request request, Response response) {
/*
* The GaeAuthFailure filter responds with Response.SC_UNAUTHORIZED and
@@ -51,15 +67,11 @@
* receive that combo, post an event so that the app can handle things
* as it sees fit.
*/
-
if (Response.SC_UNAUTHORIZED == response.getStatusCode()) {
String loginUrl = response.getHeader("login");
if (loginUrl != null) {
- // Replace the redirect url placeholder with the current url.
- loginUrl = loginUrl.replace(GaeHelper.REDIRECT_URL_TOKEN, Window.Location.getHref());
-
/*
- * Hand the receiver a non-fatal callback, so that *
+ * Hand the receiver a non-fatal callback, so that
* com.google.web.bindery.requestfactory.shared.Receiver will not
* post a runtime exception.
*/
diff --git a/samples/mobilewebapp/src/main/java/com/google/gwt/sample/gaerequest/server/GaeAuthFilter.java b/samples/mobilewebapp/src/main/java/com/google/gwt/sample/gaerequest/server/GaeAuthFilter.java
index 0a8ad39..0bdea8e 100644
--- a/samples/mobilewebapp/src/main/java/com/google/gwt/sample/gaerequest/server/GaeAuthFilter.java
+++ b/samples/mobilewebapp/src/main/java/com/google/gwt/sample/gaerequest/server/GaeAuthFilter.java
@@ -35,9 +35,11 @@
*/
public class GaeAuthFilter implements Filter {
+ @Override
public void destroy() {
}
+ @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
UserService userService = UserServiceFactory.getUserService();
@@ -45,7 +47,12 @@
HttpServletResponse response = (HttpServletResponse) servletResponse;
if (!userService.isUserLoggedIn()) {
- response.setHeader("login", userService.createLoginURL(GaeHelper.REDIRECT_URL_TOKEN));
+ String redirectUrl = request.getHeader(GaeHelper.REDIRECT_URL_HTTP_HEADER_NAME);
+ if (redirectUrl == null || redirectUrl.length() == 0) {
+ // Default to the root page if the redirecturl isn't specified in the request.
+ redirectUrl = "/";
+ }
+ response.setHeader("login", userService.createLoginURL(redirectUrl));
response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
return;
}
@@ -53,6 +60,7 @@
filterChain.doFilter(request, response);
}
+ @Override
public void init(FilterConfig config) {
}
}
diff --git a/samples/mobilewebapp/src/main/java/com/google/gwt/sample/gaerequest/shared/GaeHelper.java b/samples/mobilewebapp/src/main/java/com/google/gwt/sample/gaerequest/shared/GaeHelper.java
index c5c0b7d..3c7e48b 100644
--- a/samples/mobilewebapp/src/main/java/com/google/gwt/sample/gaerequest/shared/GaeHelper.java
+++ b/samples/mobilewebapp/src/main/java/com/google/gwt/sample/gaerequest/shared/GaeHelper.java
@@ -21,9 +21,8 @@
public interface GaeHelper {
/**
- * The placeholder token added to the login URL. The client replaces the token
- * with the current href, which only the client knows.
+ * The name of the HTTP header name used to specify the redirct url when login
+ * is required.
*/
- /* Prefixed with http:// to ensure that GAE doesn't automatically prefix it. */
- String REDIRECT_URL_TOKEN = "http%3A%2F%2FREDIRECTURL";
+ String REDIRECT_URL_HTTP_HEADER_NAME = "redirecturl";
}