Это зависит от вашего кода. Прежде всего, если вы работаете с рекурсивным методом, jvm сохраняет каждый объект в куче и содержит ссылку на каждый объект в стеке. Если вы хотите предотвратить эту ошибку, вы должны инициализировать неиспользуемый объект как ноль.
Редактировать: Начиная с ASP.NET MVC 4 лучшим подходом является простое использование встроенного AllowAnonymous .
Ответ ниже относится к более ранним версиям ASP.NET MVC.
Вы можете создать пользовательский атрибут авторизации, наследуемый от стандартного AuthorizeAttribute с необязательным параметром bool, чтобы указать, требуется ли авторизация или нет.
public class OptionalAuthorizeAttribute : AuthorizeAttribute
{
private readonly bool _authorize;
public OptionalAuthorizeAttribute()
{
_authorize = true;
}
public OptionalAuthorizeAttribute(bool authorize)
{
_authorize = authorize;
}
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if(!_authorize)
return true;
return base.AuthorizeCore(httpContext);
}
}
] Затем вы можете украсить свой базовый контроллер этим атрибутом:
[OptionalAuthorize]
public class ControllerBase : Controller
{
}
, и для любых контроллеров, для которых вы не хотите авторизацию, просто используйте переопределение с «ложным» - например,
[OptionalAuthorize(false)]
public class TestController : ControllerBase
{
public ActionResult Index()
{
return View();
}
}
Мое личное мнение об этом - разделить контроллер. Просто создайте другой контроллер для действий, которые вам не нужны для аутентификации.
Или вы можете иметь:
BaseController
не требует аутентификации - здесь у вас есть все ваши «базовые вещи»:).
BaseAuthController: BaseController
все действия здесь требуют аутентификации.
Таким образом, вы можете иметь аутентификацию, когда захотите, просто производным от определенного класса.
If you just want one action to be unauthorized on an otherwise authorized controller you can do something like this:
public class RequiresAuthorizationAttribute : ActionFilterAttribute
{
private readonly bool _authorize;
public RequiresAuthorizationAttribute()
{
_authorize = true;
}
public RequiresAuthorizationAttribute(bool authorize)
{
_authorize = authorize;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var overridingAttributes = filterContext.ActionDescriptor.GetCustomAttributes(typeof (RequiresAuthorizationAttribute), false);
if (overridingAttributes.Length > 0 && overridingAttributes[0] as RequiresAuthorizationAttribute != null && !((RequiresAuthorizationAttribute)overridingAttributes[0])._authorize)
return;
if (_authorize)
{
//redirect if not authenticated
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
//use the current url for the redirect
var redirectOnSuccess = filterContext.HttpContext.Request.Url.AbsolutePath;
//send them off to the login page
//var redirectUrl = string.Format("?RedirectUrl={0}", redirectOnSuccess);
var loginUrl = LinkBuilder.BuildUrlFromExpression<HomeController>(filterContext.RequestContext, RouteTable.Routes,
x => x.Login(redirectOnSuccess));
filterContext.HttpContext.Response.Redirect(loginUrl, true);
}
}
}
}