SpringMVC DispatcherServlet重写、自定义拦截器拦截器(一)

来源:互联网 发布:php gzip 解压缩 编辑:程序博客网 时间:2024/06/05 14:11

问题:

我们在使用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
效果图如下:
这里写图片描述

原创粉丝点击