Give applications a chance to perform global access control and to issue
specific HTTP errors. git-svn-id: https://samskivert.googlecode.com/svn/trunk@1732 6335cc39-0255-0410-8fd6-9bcaacd3b74c
This commit is contained in:
@@ -0,0 +1,64 @@
|
|||||||
|
//
|
||||||
|
// samskivert library - useful routines for java programs
|
||||||
|
// Copyright (C) 2001-2004 Michael Bayne
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or modify it
|
||||||
|
// under the terms of the GNU Lesser General Public License as published
|
||||||
|
// by the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
package com.samskivert.servlet;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An http error exception is thrown by servlet services when they wish to fail
|
||||||
|
* the request in some particular way (ie. {@link
|
||||||
|
* HttpServletResponse#SC_FORBIDDEN}, etc.). It is expected that error handling
|
||||||
|
* can be implemented in a single place such that servlets can simply allow
|
||||||
|
* this exception to propagate up to the proper handler which will then issue
|
||||||
|
* the appropriate failure header.
|
||||||
|
*/
|
||||||
|
public class HttpErrorException extends Exception
|
||||||
|
{
|
||||||
|
public HttpErrorException (int errorCode)
|
||||||
|
{
|
||||||
|
super(String.valueOf(errorCode));
|
||||||
|
_errorCode = errorCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public HttpErrorException (int errorCode, String errorMessage)
|
||||||
|
{
|
||||||
|
super(errorMessage);
|
||||||
|
_errorCode = errorCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the HTTP error code supplied with this exception.
|
||||||
|
*/
|
||||||
|
public int getErrorCode ()
|
||||||
|
{
|
||||||
|
return _errorCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the textual error message supplied with this exception or null
|
||||||
|
* if only an error code was supplied.
|
||||||
|
*/
|
||||||
|
public String getErrorMessage ()
|
||||||
|
{
|
||||||
|
String msg = getMessage();
|
||||||
|
return String.valueOf(_errorCode).equals(msg) ? null : msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected int _errorCode;
|
||||||
|
}
|
||||||
@@ -28,8 +28,10 @@ import javax.servlet.ServletContext;
|
|||||||
import org.apache.velocity.app.Velocity;
|
import org.apache.velocity.app.Velocity;
|
||||||
|
|
||||||
import com.samskivert.Log;
|
import com.samskivert.Log;
|
||||||
|
import com.samskivert.servlet.HttpErrorException;
|
||||||
import com.samskivert.servlet.IndiscriminateSiteIdentifier;
|
import com.samskivert.servlet.IndiscriminateSiteIdentifier;
|
||||||
import com.samskivert.servlet.MessageManager;
|
import com.samskivert.servlet.MessageManager;
|
||||||
|
import com.samskivert.servlet.RedirectException;
|
||||||
import com.samskivert.servlet.SiteIdentifier;
|
import com.samskivert.servlet.SiteIdentifier;
|
||||||
import com.samskivert.servlet.SiteResourceLoader;
|
import com.samskivert.servlet.SiteResourceLoader;
|
||||||
import com.samskivert.util.StringUtil;
|
import com.samskivert.util.StringUtil;
|
||||||
@@ -174,6 +176,17 @@ public class Application
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allows derived application classes to check access in a single location
|
||||||
|
* prior to resolving and dispatching a logic class, if they desire access
|
||||||
|
* control at this level. Alternatively, access control can be performed by
|
||||||
|
* the logic instance.
|
||||||
|
*/
|
||||||
|
protected void checkAccess (InvocationContext ctx)
|
||||||
|
throws RedirectException, HttpErrorException
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This should be overridden by the application implementation to
|
* This should be overridden by the application implementation to
|
||||||
* perform any necessary cleanup.
|
* perform any necessary cleanup.
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ import org.apache.velocity.app.event.MethodExceptionEventHandler;
|
|||||||
|
|
||||||
import com.samskivert.Log;
|
import com.samskivert.Log;
|
||||||
|
|
||||||
|
import com.samskivert.servlet.HttpErrorException;
|
||||||
import com.samskivert.servlet.MessageManager;
|
import com.samskivert.servlet.MessageManager;
|
||||||
import com.samskivert.servlet.RedirectException;
|
import com.samskivert.servlet.RedirectException;
|
||||||
import com.samskivert.servlet.SiteIdentifier;
|
import com.samskivert.servlet.SiteIdentifier;
|
||||||
@@ -337,6 +338,9 @@ public class DispatcherServlet extends VelocityServlet
|
|||||||
// allow the application to prepare the context
|
// allow the application to prepare the context
|
||||||
_app.prepareContext(ictx);
|
_app.prepareContext(ictx);
|
||||||
|
|
||||||
|
// allow the application to do global access control
|
||||||
|
_app.checkAccess(ictx);
|
||||||
|
|
||||||
// resolve the appropriate logic class for this URI and
|
// resolve the appropriate logic class for this URI and
|
||||||
// execute it if it exists
|
// execute it if it exists
|
||||||
String path = req.getServletPath();
|
String path = req.getServletPath();
|
||||||
@@ -349,6 +353,15 @@ public class DispatcherServlet extends VelocityServlet
|
|||||||
ictx.getResponse().sendRedirect(re.getRedirectURL());
|
ictx.getResponse().sendRedirect(re.getRedirectURL());
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
|
} catch (HttpErrorException hee) {
|
||||||
|
String msg = hee.getErrorMessage();
|
||||||
|
if (msg != null) {
|
||||||
|
ictx.getResponse().sendError(hee.getErrorCode(), msg);
|
||||||
|
} else {
|
||||||
|
ictx.getResponse().sendError(hee.getErrorCode());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
|
||||||
} catch (FriendlyException fe) {
|
} catch (FriendlyException fe) {
|
||||||
// grab the error message, we'll deal with it shortly
|
// grab the error message, we'll deal with it shortly
|
||||||
errmsg = fe.getMessage();
|
errmsg = fe.getMessage();
|
||||||
|
|||||||
Reference in New Issue
Block a user