0
点赞
收藏
分享

微信扫一扫

SpringMVC - 拦截器和异常处理机制

持续坚持原创输出,


作者:Cansluck


SpringMVC拦截器

类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。(责任链模式,AOP思想)

1.创建拦截器实现HandlerInterceptor接口

public class MyInterceptor1 implements HandlerInterceptor {
//在目标方法执行之前 执行
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle...");
return true; /*返回值 false:后面方法都不执行 true:后面方法都执行*/
}


//在目标方法执行之后 视图对象返回之前执行
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle...");
}


//整个流程都执行完毕后 执行
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion...");
}
}

2.在​​spring-mvc.xml​​中配置拦截器

<mvc:interceptors>
<mvc:interceptor>
<!--对哪些资源执行拦截操作-->
<mvc:mapping path="/**"/>
<bean class="com.heiko.interceptor.MyInterceptor1"/>
</mvc:interceptor>
</mvc:interceptors>

3.测试拦截器的拦截效果

执行​​​http://localhost:8080/my_spring_interceptor_war_exploded//target​​

@RequestMapping("/target")
public ModelAndView show() {
System.out.println("目标资源执行....");
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("name", "heiko");
modelAndView.setViewName("index");
return modelAndView;
}

可以看到打印了日志

preHandle...
目标资源执行....
postHandle...
afterCompletion...

有了拦截器,我们就可以在preHandler中进行拦截跳操作

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle...");
String params = request.getParameter("params");
if (params.equals("yes")) {
return true;
} else {
request.getRequestDispatcher("/error.jsp").forward(request, response);
return false;
}

在postHandle中,可以进行参数的增加修改

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle...");
modelAndView.addObject("name", "zhangsan");
}


多个拦截器

多个拦截器,会先顺序执行preHandle,再反顺序调用postHandle和afterCompletion。

preHandle1...
preHandle2...
目标资源执行...
postHandle2...
postHandle1...
afterCompletion2...
afterCompletion1...

SpringMVC异常处理机制

可以用来进行统一的异常处理。

新建处理类继承自HandlerExceptionResolver

public class MyExceptionResolver implements HandlerExceptionResolver {
/*
参数Exception:异常对象
返回值ModelAndView:跳转到错误视图信息
*/
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView modelAndView = new ModelAndView();


if(e instanceof MyException){
modelAndView.addObject("info","自定义异常");
}else if(e instanceof ClassCastException){
modelAndView.addObject("info","类转换异常");
}


modelAndView.setViewName("error");


return modelAndView;
}
}

在​​spring-mvc.xml​​中配置自定义异常处理器

<bean class="com.heiko.resolver.MyExceptionResolver"/>


如果出现Crash,就可以进行统一处理了。


JavaWeb技术交流

沉淀、分享、成长,让自己和他人都能有所收获!

作者Cansluck多年从事一线互联网​Java​开发,从14年开始编写工作和学习历程的技术汇总,旨在为大家提供一个较清晰详细的核心技能学习文档。如果本文能为您提供帮助,请给予支持(关注、点赞、分享)!SpringMVC - 拦截器和异常处理机制_拦截器


如果觉得好的话


关注公众号

JavaWeb技术交流

SpringMVC - 拦截器和异常处理机制_mvc_02

​​

QQ1群:437470557

​​

QQ2群:783202669

​​

举报

相关推荐

0 条评论