我是靠谱客的博主 安详方盒,最近开发中收集的这篇文章主要介绍SpringMVC DispatcherServlet重写、自定义拦截器拦截器(一),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

问题:

我们在使用springmvc框架的时候,经常会遇到请求URL不存在或者请求参数错误这种现象,尤其是在和其他模块对接的时候,客户端代码往往会去判断网络status,而不会去解析服务器错误的具体原因
效果图如下:
这里写图片描述

服务器已经很明显的进行提示,但是客户端没办法智能的去解析,客户端更希望得到的反馈是{“error_code”:”-1”,”error_msg”:”userid不能为空”},在这种情况下我们需要对水平 mvc进行扩展来达到请求url不存在时、请求参数错误能够得到服务器正常的处理

Spring 源码解析

正如web.xml中配置的一样
这里写图片描述
spring mvc对于请求的入口都是DispatcherServlet,接下来去看源码,其中很容易发现源码中这么一个方法noHandlerFound:

protected void noHandlerFound(HttpServletRequest request, HttpServletResponse response) throws Exception {
        if(pageNotFoundLogger.isWarnEnabled()) {
            pageNotFoundLogger.warn("No mapping found for HTTP request with URI [" + getRequestUri(request) + "] in DispatcherServlet with name '" + this.getServletName() + "'");
        }

        if(this.throwExceptionIfNoHandlerFound) {
            throw new NoHandlerFoundException(request.getMethod(), getRequestUri(request), (new ServletServerHttpRequest(request)).getHeaders());
        } else {
            response.sendError(404);
        }
    }

可以看到在springmvc匹配不到用户访问的url时,会抛出404的服务器异常状态,对于我们想要修改这个返回的状态其实很简单,下面是修改的一个简单示例:

重写SpringMVC匹配不到url的操作

@Override
    protected void noHandlerFound(HttpServletRequest request, HttpServletResponse response) throws Exception {
        if(pageNotFoundLogger.isWarnEnabled()){
            pageNotFoundLogger.warn("No mapping found for HTTP request with URI [" + getRequestUri(request) + "] in DispatcherServlet with name '" + this.getServletName() + "'");
        }
        //在这里我们不抛出404异常,而是把这种异常情况做个平滑处理
        response.setHeader("Content-type", "text/html;charset=UTF-8");
        response.setCharacterEncoding("UTF-8");
        String resultMsg = "{"error_code":-1,"error_msg":"找不到对应的url请仔细核对"}";
        response.getOutputStream().write(resultMsg.getBytes("UTF-8"));
    }
    private static String getRequestUri(HttpServletRequest request) {
        String uri = (String)request.getAttribute("javax.servlet.include.request_uri");
        if(uri == null) {
            uri = request.getRequestURI();
        }

        return uri;
    }

为了生效记得修改web.xml文件的springmvc入口servlet
效果图如下:
这里写图片描述

最后

以上就是安详方盒为你收集整理的SpringMVC DispatcherServlet重写、自定义拦截器拦截器(一)的全部内容,希望文章能够帮你解决SpringMVC DispatcherServlet重写、自定义拦截器拦截器(一)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部