servlet-mapping干啥用的
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了servlet-mapping干啥用的相关的知识,希望对你有一定的参考价值。
执行顺序
访问顺序为1—>2—>3—>4,其中2和3的值必须相同。
url-pattern 标签中的值是要在浏览器地址栏中输入的 url,可以自己命名,这个 url 访问名为 servlet-name 中值的 servlet,两个 servlet-name 标签的值必须相同。
因为通过 servlet 标签中的 servlet-name 标签映射到 servlet-class 标签中的值,最终访问 servlet-class 标签中的 class。
还有,web.xml 的 / 表示的是http://localhost:8080/ + 工程名。
而.jsp页面的action,加了/表示绝对路径http://localhost:8080/ ,没有加 / 表示的是相对路径。
在配置了Servlet与URL样式之间的映射后,当Servlet容器接收到一个请求,它首先确定该请求应该由哪一个Web应用程序来响应。这是通过比较请求URI的开始部分与Web应用程序的上下文路径来确定的。
映射到Servlet的路径是请求URI减去上下文的路径,Web应用程序的Context对象在去掉请求URI的上下文路径后,将按照下面的路径映射规则的顺序对剩余部分的路径进行处理,并且在找到第一个成功的匹配后,不再进行下一个匹配。
容器试着对请求的路径和Servlet映射的路径进行精确匹配,如果匹配成功,则调用这个Servlet来处理请求。
容器试着匹配最长的路径前缀,以斜杠(/)为路径分隔符,按照路径树逐级递减匹配,选择最长匹配的Servlet来处理请求。
如果请求的URL路径最后有扩展名,如.jsp,Servlet容器会试着匹配处理这个扩展名的Servlet。
如果按照前面3条规则没有找到匹配的Servlet,容器会调用Web应用程序默认的Servlet来对请求进行处理,如果没有定义默认的Servlet,容器将向客户端发送HTTP 404错误信息(请求资源不存在)。
参考技术A 主要是截获请求的,如果你的url-pattern定义的是路径,那么以后所有对这个路径下资源的请求都会由servlet-name中定义的servlet处理;
如果你的url-pattern定义的是资源格式例如*.do等,那么对于所有符合这种格式的资源的请求都由指定的servlet处理。本回答被提问者采纳
OverrideAuthenticationAttribute 是干啥用的?
【中文标题】OverrideAuthenticationAttribute 是干啥用的?【英文标题】:What OverrideAuthenticationAttribute is for?OverrideAuthenticationAttribute 是干什么用的? 【发布时间】:2014-12-20 09:33:30 【问题描述】:我在当前的 Web API 项目中遇到了一个标有 System.Web.Http.OverrideAuthenticationAttribute
的控制器方法,我很好奇这是做什么用的?
在 Google 和 *** 中搜索并不能回答问题。 MSDN documentation 不包含太多信息。它只说以下内容:
表示覆盖身份验证过滤器的过滤器属性 在更高级别定义。
另外,我查看了来源:
public sealed class OverrideAuthenticationAttribute : Attribute, IOverrideFilter, IFilter
public bool AllowMultiple
get
return false;
public Type FiltersToOverride
get
return typeof(IAuthenticationFilter);
但这并不能说明什么。
那么谁能解释一下使用OverrideAuthenticationAttribute
的目的是什么?并请给出一些使用案例以便更好地理解。
【问题讨论】:
【参考方案1】:OverrideAuthentication
属性用于抑制全局身份验证过滤器,这意味着使用此过滤器时将禁用所有全局身份验证过滤器(实现 IAuthenticationFilter)。
假设您有一个名为 BasicAuth
的全局身份验证过滤器:
public class BasicAuthAttribute : ActionFilterAttribute, IAuthenticationFilter
public void OnAuthentication(AuthenticationContext filterContext)
public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext)
var user = filterContext.HttpContext.User;
if (user == null || !user.Identity.IsAuthenticated)
filterContext.Result = new HttpUnauthorizedResult();
并且过滤器被配置为使用此代码的所有控制器的全局过滤器:
public class FilterConfig
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
filters.Add(new HandleErrorAttribute());
filters.Add(new BasicAuthAttribute());
假设您想对单个控制器或控制器操作使用不同的身份验证策略。在这种情况下,您可以禁用全局身份验证。使用OverrideAuthentication
属性过滤,然后配置要用于该特定操作的新过滤器。当您与外部登录提供程序集成时,这很有帮助,并且您不希望任何现有的全局身份验证过滤器弄乱您的外部登录身份验证。
在下面的代码中,全局身份验证过滤器被禁用,然后为单个操作启用 HostAuthentication
过滤器以启用外部登录提供程序(例如 Facebook):
// GET api/Account/ExternalLogin
[OverrideAuthentication]
[HostAuthentication(Startup.ExternalCookieAuthenticationType)]
[AllowAnonymous]
[HttpGet("ExternalLogin", RouteName = "ExternalLogin")]
public async Task<IHttpActionResult> ExternalLogin(string provider)
// Auth code
【讨论】:
为什么,在您的示例中,您的BasicAuthAttribute
派生自 ActionFilterAttribute
而不是 AuthorizationAttribute
?
它可能有,但我不想覆盖现有的 Auth 过滤器,而是实施一个新过滤器。这就是为什么我继承 ActionFilter 属性并实现 IAuthenticationFilter :)
@ZenCoder,感谢您的回答和清晰的代码示例!
@FarisZacina 你能在这里使用 AuthorizationFilter 吗,你对 Erik Phillips 的回复 - 这是否意味着 Authorization 属性是一个 Authentication 属性。或派生自一个?【参考方案2】:
OverrideAuthentication
用于覆盖在更高级别配置的身份验证过滤器。比如说,你有一个像这样全局应用的身份验证过滤器。
// Applied globally in WebApiConfig
config.Filters.Add(new MyAuthenticationFilter());
而且,您希望阻止此过滤器针对特定操作方法或控制器运行。你可以在那个级别使用OverrideAuthentication
,就像这样。
public class ValuesController : ApiController
[OverrideAuthentication]
public string Get()
...
现在,在上面的示例中,您已在全局范围内应用了 MyAuthenticationFilter
。说,您想覆盖它并运行另一个过滤器,例如 MyAnotherAuthenticationFilter
仅用于 Post
操作方法。你可以这样做。
public class ValuesController : ApiController
// Removes all filters applied globally or at the controller level
[OverrideAuthentication]
[MyAnotherAuthentication] // Puts back only MyAnotherAuthenticationFilter
public string Post(...)
...
更多信息here。查看“过滤器覆盖”部分。
【讨论】:
感谢您的回答,尤其感谢您提供指向您的综合 MSDN 杂志文章的链接!这是我目前读过的关于 Web API 安全性的最佳读物!以上是关于servlet-mapping干啥用的的主要内容,如果未能解决你的问题,请参考以下文章