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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值