概述
问题:
我们在使用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重写、自定义拦截器拦截器(一)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复