解决MVC项目中,静态html 未找到时候,404的跳转

本文介绍了一个自定义HTTP模块GateKeeperOfStaticHtml,该模块用于拦截并处理特定后缀(如.html或.htm)的请求。此外,还展示了如何配置默认错误页面及如何在ASP.NET应用程序中注册此模块。
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Web;
using System.Web.Routing;

namespace WebClientService.Modules
{
    public class GateKeeperOfStaticHtml : IHttpModule
    {
        // Fields
        private static readonly object _contextKey = new object();
        private static readonly object _requestDataKey = new object();
        private RouteCollection _routeCollection;


        // Properties
        public RouteCollection RouteCollection
        {
            get
            {
                if (this._routeCollection == null)
                {
                    this._routeCollection = RouteTable.Routes;
                }
                return this._routeCollection;
            }
            set
            {
                this._routeCollection = value;
            }
        }



        public void Init(HttpApplication application)
        {

            if (application.Context.Items[_contextKey] == null)
            {
                application.Context.Items[_contextKey] = _contextKey;
                application.PostResolveRequestCache += new EventHandler(this.OnApplicationPostResolveRequestCache);
            }

        }

   

        private void OnApplicationPostResolveRequestCache(object sender, EventArgs e)
        {
            HttpContextBase context = new HttpContextWrapper(((HttpApplication)sender).Context);
            this.PostResolveRequestCache(context);
        }

        /// <summary>
        /// 检测是否是合法的处理后缀类型
        /// </summary>
        /// <param name="toCheckedStr"></param>
        /// <returns></returns>
        private bool IsValidExtension(string toCheckedStr) {
            bool result = false;
            if (string.IsNullOrEmpty(toCheckedStr))
            {
                result= false;
            }
            if (toCheckedStr.EndsWith(".html", StringComparison.CurrentCultureIgnoreCase)|| toCheckedStr.EndsWith(".htm", StringComparison.CurrentCultureIgnoreCase))
            {
                result= true;
            }

            return result;
        }

        public virtual void PostResolveRequestCache(HttpContextBase context)
        {

            RouteData routeData = this.RouteCollection.GetRouteData(context);
            if (routeData != null)
            {
                //检测路由数据,仅仅监听 html  资源
                var controller = routeData.Values.FirstOrDefault(x => x.Key == "controller");
                if (default(KeyValuePair<string,object>).Equals(controller))
                {
                    //没有控制器数据 不做处理
                    return;
                }
                //检测路由控制器的后缀,是否是 *****.html 或者 *****.htm的格式
                if (controller.Value==null)
                {
                    return;
                }

                if (!this.IsValidExtension(controller.Value.ToString()))
                {
                    return;
                }

                IRouteHandler routeHandler = routeData.RouteHandler;
                if (routeHandler == null)
                {
                    return;
                }

                if (!(routeHandler is StopRoutingHandler))
                {
                    RequestContext requestContext = new RequestContext(context, routeData);
                    context.Request.RequestContext = requestContext;
                    IHttpHandler httpHandler = routeHandler.GetHttpHandler(requestContext);
                    if (httpHandler == null)
                    {
                        return;
                    }

                    try
                    {

                        context.RemapHandler(httpHandler);

                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }


                }
            }

        }



        public void Dispose()
        {
            throw new NotImplementedException();
        }






    }
}

 

2 注册默认的错误页面

<customErrors defaultRedirect="defaultError.html" mode="On">
<error statusCode="404" redirect="404notfind.html"/>
</customErrors>


</system.web>

3 注册模块

<modules>
<remove name="FormsAuthentication"/>
<add name ="GateKeeper" type="WebClientService.Modules.GateKeeperOfStaticHtml,WebClientService"/>
</modules>

 

转载于:https://www.cnblogs.com/micro-chen/p/5834053.html

<think>好的,用户遇到了IntelliJ IDEA中的HTTP 404错误,需要解决方案。首先,我需要回忆HTTP 404错误的一般原因,然后结合IDEA的具体情况来分析。 HTTP 404通常表示资源未找到。在Web应用中,可能是URL路径不正确,或者服务器没有正确配置。在IDEA中运行Web项目时,可能有几个常见原因: 1. **部署配置问题**:比如应用上下文路径(context path)设置错误,导致访问的URL与实际部署路径不符。用户可能没有正确配置Tomcat或其他服务器的部署路径,或者模块没有正确添加为Artifact。 2. **未正确构建或部署项目**:如果项目没有正确编译或部署,服务器可能找不到对应的类或资源文件。例如,依赖项缺失导致构建失败,或者Artifact没有被正确生成。 3. **路径映射错误**:在Spring MVC等框架中,控制器的@RequestMapping路径可能与请求的URL不匹配,或者视图解析器配置不正确,导致无法找到视图文件。 4. **静态资源处理问题**:如果静态资源(如CSS、JS)的位置不正确,或者服务器配置未允许访问这些资源,也可能导致404错误。可能需要检查资源目录是否在WEB-INF之外,或者是否配置了资源处理器。 5. **服务器启动问题**:有时服务器未能正确启动,比如端口被占用,或者项目部署过程中出现异常,导致应用未成功部署。 接下来需要参考用户提供的引用内容,看看是否有相关信息。但用户提供的引用主要关于Markdown插件的问题、Maven索引更新、SVN集成以及三次原则,似乎和HTTP 404无关。因此可能需要忽略这些引用,或者寻找间接关联。 不过,用户之前的引用中提到过Maven插件无法更新索引的问题,这可能导致依赖未正确下载,进而导致编译失败,从而引发404。例如,如果pom.xml中的依赖未正确下载,项目可能缺少必要的库,导致应用无法正常运行。这时候需要检查Maven配置,确保依赖正确加载。 另外,用户提到的三次原则可能提示代码结构问题,但不确定是否相关。 可能的解决步骤: 1. **检查部署配置**:确认应用上下文路径是否正确。在Tomcat配置中,Deployment选项卡下的Application context应该和访问的URL一致。例如,如果设置为“/myapp”,则访问路径应为http://localhost:8080/myapp/...。 2. **验证Artifact生成**:在Project Structure中,检查Artifacts是否已正确生成,并且输出目录包含所有必要的文件。如果使用Maven,可能需要执行clean install确保构建成功。 3. **检查控制器和路径映射**:确认Controller中的@RequestMapping注解路径是否正确,是否存在拼写错误。使用IDEA的终端或浏览器开发者工具查看请求的完整URL是否匹配。 4. **静态资源处理**:如果是静态资源404,检查资源目录是否在webapp或resources/static下,并确保没有安全配置拦截了这些请求。例如,在Spring Boot中,静态资源默认放在src/main/resources/static/目录下。 5. **服务器日志分析**:查看IDEA控制台或服务器日志(如Tomcat的catalina.out),寻找启动时的错误信息,比如类找不到、Bean创建失败等,这些可能导致应用无法启动,从而所有请求返回404。 6. **检查Maven依赖和构建**:确保所有依赖已正确下载,项目没有编译错误。可以执行Maven的clean和compile命令,检查是否有错误。 7. **重新部署或重启服务器**:有时重新启动服务器或重新部署应用可以解决临时问题。 8. **检查Web.xml配置**:对于传统Java Web项目,检查web.xml中的servlet映射是否正确,特别是DispatcherServlet的配置是否正确。 9. **检查模块依赖**:确保项目模块之间的依赖关系正确,特别是Web模块是否依赖了必要的其他模块。 可能还需要指导用户如何逐步检查这些配置,比如如何找到Tomcat的部署设置,如何查看Maven依赖树等。此外,针对常见的Spring Boot应用,可能还需要检查主启动类的位置是否正确,是否在根包下,以便组件扫描生效。 如果用户提供了更多具体信息,比如错误发生时的具体情况、项目类型(如Spring MVC、普通Servlet项目等)、访问的URL路径和预期的资源,可以更精准地诊断问题。但基于现有信息,需要列出常见的解决方案步骤,帮助用户逐一排查。</think>针对IntelliJ IDEA中HTTP 404错误的解决方案,请按以下步骤排查: --- ### 一、检查部署配置 1. **应用上下文路径设置** - 在Tomcat配置的`Deployment`选项卡中,确认`Application context`值与访问URL一致。例如:若设置为`/demo`,访问路径应为`http://localhost:8080/demo/你的接口`[^1]。 - 修改方法:`Edit Configurations` → `Deployment` → 修改`Application context`。 2. **验证Artifact生成** - 打开`Project Structure`(快捷键`Ctrl+Shift+Alt+S`),选择`Artifacts`,确保Web项目已生成WAR/WAR Exploded格式的Artifact。 - 若未生成,需手动添加:`+` → `Web Application: Exploded` → 关联对应模块。 --- ### 二、排查项目构建问题 1. **Maven依赖完整性** - 执行`mvn clean install`,观察控制台是否报依赖下载失败。若存在红色错误日志,需检查网络或镜像配置(参考Maven索引更新方法[^2])。 - 在IDEA右侧Maven面板中点击`Reload All Maven Projects`(刷新按钮)。 2. **编译输出目录** - 确认`Project Structure` → `Modules` → `Paths`中,`Output path`和`Test output path`指向正确目录(默认应无需修改)。 --- ### 三、路径映射与代码逻辑 1. **控制器路径匹配** - 检查Controller类的`@RequestMapping`注解路径是否与请求URL匹配。例如: ```java @RestController @RequestMapping("/api") public class DemoController { @GetMapping("/test") // 实际访问路径为 /api/test public String test() { return "OK"; } } ``` 2. **静态资源路径** - 若为静态资源(如HTML/CSS/JS)404,确认文件存放在`src/main/webapp`或`src/main/resources/static`目录下。 - Spring Boot项目需检查安全配置是否拦截了静态资源。 --- ### 四、服务器日志分析 1. **查看启动日志** - 启动服务器后,观察IDEA控制台输出的`Tomcat started on port(s)`和`Deployed application context`信息。 - 若存在`No mapping for GET /xxx`,表示路径未注册到任何控制器。 2. **类加载失败问题** - 若日志提示`ClassNotFoundException`或`BeanCreationException`,可能是依赖缺失或扫描包配置错误(如Spring Boot主类未放在根包下)。 --- ### 五、其他常见原因 1. **端口冲突** - 检查Tomcat端口(默认8080)是否被占用。修改方法:`Edit Configurations` → `Server` → 修改`HTTP port`。 2. **浏览器缓存干扰** - 使用无痕模式访问,或强制刷新页面(`Ctrl+F5`)。 3. **项目未正确部署** - 重启IDEA并重新构建项目:`Build` → `Rebuild Project`。 --- ### 六、快速验证流程 ```text 1. 访问 http://localhost:8080/ → 检查是否显示服务器默认页 2. 访问 http://localhost:8080/你的应用上下文路径/ → 检查是否跳转到首页 3. 使用Postman直接调用API接口 → 排除前端路由问题 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值