关闭

使用springmvc时处理404的方法

51人阅读 评论(0) 收藏 举报
分类:

转载自:咕咚萌西 https://www.cnblogs.com/handsome-man/p/5519439.html

如何定义404

404,说白了就是找不到页面,那么如何定义“找不到”呢?

我们可以通过源代码来看看Spring MVC如何定义“404”的:

// Determine handler for the current request.
mappedHandler = getHandler(processedRequest, false);
if (mappedHandler == null || mappedHandler.getHandler() == null) {
  noHandlerFound(processedRequest, response);
  return;
}

getHandler是根据请求的url,通过handlerMapping来匹配到Controller的过程。

如果匹配不到,那么就执行noHandlerFound方法。这个方法很简单,返回一个404的错误代码。

我们的Web容器,比如tomcat,会根据这个错误代码来生成一个错误界面给用户。

那么,我们如何自定义这个界面呢?

重写noHandlerFound方法

最先想到的肯定是重写noHandlerFound方法,这个方法是protected,可以重写。

我们需要将页面重定向到我们自定义的404界面,那么只需要

@Override
  protected void noHandlerFound(HttpServletRequest request,
      HttpServletResponse response) throws Exception {     
    response.sendRedirect(request.getContextPath() + "/notFound");
  }

这里我们的Controller里需要定义一个@requestMapping(“/notFound”)的这么一个方法,用来返回一个404页面

或者,这里应该可以采用直接访问静态文件的方法。

另外,也可以通过抛出一个异常NoSuchRequestHandlingMethodException

这样我们就实现了自定义的404页面。那么,还有别的方法吗?

利用Spring MVC的最精确匹配

Spring MVC对于url的匹配采用的是一种叫做“最精确匹配的方式”,举个例子

比如我们同时定义了“/test/a”, “/test/*”,那么若请求的url结尾为/test/a,那么则会匹配精确的那个,也就是”/test/a”

我们是不是可以利用这个特点来找到那些找不到的页面?

1、首先我们定义一个拦截所有url的规则@requestMapping(“*”),那么实际上不存在找不到的页面了,也就是永远不会进入noHandlerFound方法体内

2、后面的步骤和平时一样,为别的请求都配置上@requestMapping

那么请求过来,要么进入我们精确匹配的method(也就是找的到的),要么进入@requestMapping(“*)拦截的方法体内(也就是找不到的)

那么我们只要让@requestMapping(“*)拦截的这个方法返回一个自定义的404界面就OK了~

利用web容器提供的error-page

还记得之前提到的web容器会提供一个404的默认界面吗?

其实我们完全可以替换成我们自己的界面,那么看起来这种方法应该是最简单的了。

只需要在web.xml文件中写上如下代码就可以了:

<error-page>
    <error-code>404</error-code>
    <location>/resource/view/404.htm</location>
  </error-page>

不过值得注意的是,这里配置的的location其实会被当成一个请求来访问。

那么我们的DispatcherServlet会拦截这个请求而造成无法访问,此时的结果是用户界面一片空白。

所以这里的404.htm其实是一个静态资源,我们需要用访问静态资源的方式去访问。

而在我的Spring MVC里,resource目录下的文件都是不会被拦截的

比较三种方式的区别

1、最方便:那肯定是第三种了,我们只需要提供一个静态页面即可

2、最快捷:第一种肯定最慢,因为它会发起2个请求。第二种和第三种应该差不多

3、最灵活:从灵活性上来看,第三种肯定是最缺乏的,但是其实对于404来说并不是需要经常变化的,不过也保不准可能可以允许用户自定义404界面等,这里一、二两种方式则提供了灵活性。

4、通用性:第三种应该是最通用了,而一、二 两种则要依赖Spring MVC

0
0
查看评论

使用springmvc+urlRewrite实现404,500以及异常的处理

最近在做一个小东西,其中想使用到urlRewrite,刚开始都是很不错的,伪静态做的很棒,但慢慢就出现问题了,比如404或者500的错误码出现,虽然在web.xml中做了配合(如下),但好像不起作用啊 404 /error/404.html 500 /error/40...
  • junjun56
  • junjun56
  • 2016-07-20 11:30
  • 4499

SpringMVC中处理404静态页面操作

在SpringMVC中,是通过前端分发器也就是DispatchServlet来进行我们的请求拦截的,所以如果我们的请求拦截的地址如果是类似于*.do,*.action的话,那么我们的js、png、css就可以逃过,因此是可以访问到的,可是如果我们配置的拦截地址是/,那么将会拦截我们所有的请求信息。那...
  • ZHOUCHAOQIANG
  • ZHOUCHAOQIANG
  • 2015-10-30 15:50
  • 3054

SpringMVC4.3x教程之八异常的三种处理方式

SpirngMVC提供了对异常的捕获,常用的有三种方式: 1、自带的异常解析类 2、自定义异常解析类 3、使用注解实现异常解析捕获 SpringMVC在运行中的异常都是从下往上抛出的最后到达ExceptionResolver进行异常的处理,但是前端控制器没有给出该异常解析器的默认对象,想要使...
  • u014332200
  • u014332200
  • 2017-08-04 12:12
  • 310

springMVC处理ajax请求时的404

这里是萌新第一帖。 用过springMVC的人通常都知道匹配不到的请求URL最后都交由web.xml中的404页面配置处理,返回特定页面,但是我们使用ajax请求时很多时候并不希望返回这个页面。而是跟其他接口一致的接口返回格式。 使用拦截器调试过程中发现,这些404请求的handler都是 org....
  • liuchao901010a
  • liuchao901010a
  • 2017-01-06 15:54
  • 1226

使用springmvc实现404,500的配置

springmvc实现404,500的配置实战 1.页面准备:我们在webapp/views/common/error(目录自己定)新建我们自定义的错误页面,404.html, 500.html等等。 2.SimpleMappingExceptionResolver只实现映射关系...
  • EightSwords
  • EightSwords
  • 2017-07-07 09:59
  • 1295

springMVC实现REST开发详解(补充Json解析问题以及静态文件404错误解决办法)

什么是REST? 符合REST约束风格和原则的应用程序或者设计就是REST 例如: /blog/1 HTTP GET =>查询id=1的blog /blog/1 HTTP DELETE =>删除id=1的blog /blog/1 HTTP PUT =>更新...
  • eguid_1
  • eguid_1
  • 2016-04-14 23:51
  • 3472

在SpringMvc中解决404的问题

1.我们都知道SpringMvc很好用,但是今天我用的时候出现了一个很让人困惑的问题 这是控制器,所以请求路径应该是跟路径下的      category/login    这是毋庸置疑 的 这是配置跳转...
  • xujin_chen
  • xujin_chen
  • 2016-12-10 11:41
  • 3322

SpringMVC Controller设置400/404/500自定义错误页面

一、说明 1、web系统开发过程中经常遇见400/404/500类型的错误页面,对于开发人员而言见到这种页面多了可能觉得问题不大,但是实际运用当中是面向客户的,需要配置一个合理的自定义错误页面。 2、本文只提通过springmvc controller配置自定义错误页,Tomcat设置400/4...
  • JustinQin
  • JustinQin
  • 2017-11-18 12:10
  • 428

Spring的Controller请求方法中参数名匹配,但是参数类型不同会报404

举个例子: @RequestMapping("/getStatus") public returnType method(int status) 若请求url为/getStatus?status=a,用spring源码调试发现有异常,因为日志级别为info,所有异常没有打印出...
  • nyhyn
  • nyhyn
  • 2016-05-09 00:34
  • 1966

使用springmvc注解后404错误

使用springmvc注解配置时,报404错误,检查了好久都没检查出来。 使用start映射,访问失败,404错误。<!-- 配置总的控制中心 --> <servlet> <servlet-name>mvc</servlet-name> ...
  • mix0313
  • mix0313
  • 2016-03-25 16:09
  • 1651