今天在同事的应用出了一个小错误,与struts2有关,这里记录一下。
描述:web应用下有一个目录“static”,现在要访问其中的“top.html”文件,即访问“localhost:8080/static/top.html”,服务器总是抱404错误。
原因:在struts2的FilterDispatcher类的doFilter方法中,如果请求的是静态资源,struts2会判断该请求是否可以处理,这里的代码如下:
String resourcePath = RequestUtils.getServletPath(request);
if ("".equals(resourcePath) && null != request.getPathInfo()) {
resourcePath = request.getPathInfo();
}
if (staticResourceLoader.canHandle(resourcePath)) {
staticResourceLoader.findStaticResource(resourcePath, request, response);
} else {
// this is a normal request, let it pass through
chain.doFilter(request, response);
}
// The framework did its job here
return;
其中,在DefaultStaticContentLoader类的canHandle方法中会对请求路径进行判断:
public boolean canHandle(String resourcePath) {
return serveStatic &&
(resourcePath.startsWith("/struts") || resourcePath.startsWith("/static"));
}
这里,serveStatic的值为true,再加上要访问的资源以“/static”开头,所以这里返回true。
然后,会进入DefaultStaticContentLoader类的findStaticResource方法,该方法的第一行语句是:
String name = cleanupPath(path);
这里,cleanupPath方法的定义如下:
/**
* @param path requested path
* @return path without leading "/struts" or "/static"
*/
protected String cleanupPath(String path) {
//path will start with "/struts" or "/static", remove them
return path.substring(7);
}
struts2把“/static”截掉了,这样,后面再进行解析的时候,就变成了解析对“/top.html”的请求,所以会报404错误。
总结:悲剧的错误,还以为是自己程序的bug,改了半天。需要加强对开源程序中具体实现的了解。
分享到:
相关推荐
Struts2是一个强大的Java web应用程序框架,用于构建可维护、可扩展且结构良好的Web应用程序。这个"Struts2应用程序示例"是专为初学者和开发者设计的,它利用Eclipse 3.3作为集成开发环境,JDK 6.0作为Java运行环境...
本文将详细介绍Struts2框架中有关URL配置的相关知识点,包括请求转发、内部action处理以及请求重定向等核心概念,并深入探讨Struts2中 `<s:url>` 标签的应用。 #### 请求转发至JSP页面 在Struts2中,默认情况下,...
`urlRewrite`是Tuckey开源组织提供的一个URL重写过滤器,它能够帮助我们在Struts2应用中实现这个目标。 在这个最简实例中,我们将探讨如何在MyEclipse环境中集成Struts2和urlRewrite,创建一个基本的应用来演示URL...
4. **启动和测试**:重新部署应用,访问URL时,URLRewriteFilter会根据配置文件中的规则对URL进行重写。 除了上述基本操作,URLRewriteFilter还支持许多高级特性,如条件匹配、通配符、自定义变量等,可以根据实际...
在Struts2中,URL通常以`.do`结尾,这是默认的Action映射后缀。然而,为了提供更加用户友好的URL和提高搜索引擎优化(SEO),开发者可能希望将这些后缀更改为更自然的扩展名,如`.html`。本教程将深入探讨如何在...
Struts2是一个基于MVC(Model-View-Controller)设计模式的Java web应用程序框架,它在Web开发领域中被广泛使用。Struts2的核心是Action类,它负责处理用户的请求并调用业务逻辑。框架提供了丰富的拦截器...
Struts2是一个强大的Java EE平台上的MVC框架,它提供了构建Web应用程序的全面解决方案。相比Struts1,Struts2是一个全新的设计,不仅在架构上有所改进,而且提供了更多的功能和灵活性。Struts2的核心是...
在处理“struts2 路径问题”时,我们主要关注的是Struts2框架中的URL映射和资源定位。这篇博客文章可能探讨了在使用Struts2时遇到的路径相关问题,如Action配置、结果类型、静态资源访问等。 1. **Action配置**:在...
Struts2是一个强大的MVC(模型-视图-控制器)框架,它被广泛应用于Java Web开发中,提供了灵活的架构来构建可维护性和扩展性良好的应用程序。本综合应用实例主要展示了如何利用Struts2框架与MySQL数据库进行集成,...
`type="redirect"`表示客户端会接收到一个302重定向响应,`%{contextPath}`是当前应用的上下文路径,`${name}`则是从原始URL中提取的参数。 4. **启动应用**:现在,当你运行应用并访问原始URL时,`URL Rewrite ...
Struts拦截器(Interceptors)是Struts2框架的核心组件之一,它们在处理请求时扮演着重要的角色。拦截器的工作原理类似于AOP(面向切面编程),允许开发者在动作执行前后插入自定义逻辑,比如权限检查、日志记录、...
Struts2和Struts1是两个非常著名的Java Web框架,它们在处理请求时通常会在URL中显式地显示.action或.do后缀。然而,为了提供更友好的用户体验和增强安全性,有时我们需要隐藏这些扩展名。本篇文章将详细介绍如何在...
在使用"struts2-scan.py"这个Python脚本时,你需要确保你有相应的环境支持Python运行,并且对目标Struts2应用有一定的访问权限。通常,这个脚本会遍历一系列的漏洞测试用例,针对每个可能的漏洞进行探测。扫描完成后...
在项目中使用Struts2时,我们需要配置struts2的主配置文件(struts.xml),定义Action、结果类型、拦截器栈等。Action是业务逻辑的入口点,Result表示一个操作完成后转向的页面或结果。拦截器是Struts2的一大特色,...
Struts2是一个强大的Java web应用程序框架,用于构建和部署企业级的MVC(Model-View-Controller)架构的Web应用。这个"留言板留言板struts2"项目,显然是一个基于Struts2实现的简单留言板系统,旨在展示Struts2的...
Struts2是一款非常流行的Java Web框架,用于构建企业级应用。然而,随着时间的推移,Struts2在安全方面暴露出了一些重要的漏洞,这给使用该框架的系统带来了潜在的安全风险。"Struts2漏洞检查工具Struts2.2019.V2.3...
在这个"一个完整的Struts2应用实例"中,我们将深入探讨如何利用Struts2实现用户注册和登录功能,涉及的关键知识点包括Action的实现与配置、Struts2验证框架的应用、以及国际化资源文件的使用。 首先,**Action的...
Struts2是一个强大的Java web应用程序开发框架,它基于Model-View-Controller(MVC)设计模式,旨在简化创建用户交互式、数据驱动的web应用的过程。这个“Struts2接口文档”是开发者的重要参考资料,提供了关于...
6. **模型(Model)**:尽管Struts2主要讨论的是控制器和视图,但源代码中也会涉及到模型部分,包括数据库操作、业务对象(BO)和数据访问对象(DAO)。这些模型组件与Action交互,处理数据的获取和存储。 学习这个...
它的主要工作原理是:当用户尝试访问受保护的应用时,会被重定向到CAS服务器进行身份验证,一旦验证成功,CAS会返回一个票据(ticket),该票据被应用用来确认用户的身份并授予访问权限。 在Struts2框架中集成CAS,...