Spring-MVC异常处理注解和拦截器

一、@ExceptionHandler
介绍这个注解之前先谈另外一个注解、@ControllerAdvice
被这个注解所修饰的类称为处理器增强器。是给控制器对象增强功能的。使用@ControllerAdvice 修饰的类中可以使用@ExceptionHandler。

package com.bjpowernode.handle;

import com.bjpowernode.expe.AgeException;
import com.bjpowernode.expe.NameException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

/**
 * 2019/09/02
 *  MyExceptionResolver实现HandlerExceptionResolver,
 *  所以MyExceptionResolver是异常处理器, 能够处理异常。
 */
@ControllerAdvice
public class MyExceptionResolver {

    //@ExceptionHandle 的属性value  异常类的class文件
    @ExceptionHandler(value = NameException.class)
    public ModelAndView  doNameException(Exception ex){
        ModelAndView mv  = new ModelAndView();
        mv.addObject("tips", "@ControllerAdvice使用注解处理NameException");
        mv.addObject("ex", ex);
        mv.setViewName("NameError");
        return mv;
    }

    @ExceptionHandler(value = AgeException.class)
    public ModelAndView doAgeException(Exception ex){
        ModelAndView mv = new ModelAndView();
        mv.addObject("tips", "@ControllerAdvice使用注解处理AgeException");
        mv.addObject("ex", ex);
        mv.setViewName("AgeError");
        return mv;
    }

    //处理其他异常
    @ExceptionHandler
    public ModelAndView DefaultException(Exception ex){
        ModelAndView mv = new ModelAndView();
        mv.addObject("tips", "@ControllerAdvice使用注解处理DefaultException");
        mv.addObject("ex", ex);
        mv.setViewName("defaultError");
        return mv;
    }
}
//  其中@ExceptionHandler注解的value 属性值如果没有指定。表示如果抛出的异常在其他注解都不能处理的情况下,该异常将有该注解所修饰的方法来处理

使用ControllerAdvice注解也是需要指定所在的包结构和声明注解驱动
        <!--指定文件扫描器-->
        <context:component-scan base-package="com.bjpowernode.handle"></context:component-scan>

        <!--声明注解驱动-->
        <aop:annotation-driven></aop:annotation-driven>

二、拦截器

SpringMVC的Interceptor拦截器可以拦截指定的用户所发起的请求。

自定义拦截器。其实就是一个普通类实现了HandlerInterceptor 接口。实现该接口会重写该接口中的三个方法。

preHandle
	该方法在用户请求处理前执行。可以对用户的请求进行预处理。常用户登陆验证、权限验证。身份检验。
postHandle
	该方法在处理器方法处理完请求之后执行,注意此时的处理完但是处理器(中央适配器)并没有调用我们的dispatcherServlet视图解析器将页面进行渲染。即没有进行数据填充。返回的依然是ModelAndView 因此此时我们依然可以修改ModelAndView。并且可以请求转发或者重定向到其它页面
	afterCompletion
	该方法在处理器完全处理完用户的请求,页面也进行渲染完成。此时我能的中央调度器调用视图对象对试图对象进行解析。将响应结果响应给浏览器。此时对 ModelAndView 再操作也对响应无济于事。 这个方法的主要作用是用于==清理资源==的,当然这个方法也只能在当前这个Interceptor的preHandle方法的返回值为true时才会执行。 

下面用一段代码简单说一下拦截器的用法

package com.bjpowernode.handle;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;

/**
 * 2019/09/03
 */
public class Myinterceptor  implements HandlerInterceptor {

    /**
     *preHandel  表示拦截器执行的方法  handle 表示
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("执行拦截器的prehandle 方法 ");
        String uname = "";
        Object attr = request.getSession().getAttribute("username");
        if(attr != null){
            uname = (String) attr;
        }

        if(!"zs".equals(uname)){
            //不是zs  就不能正常访问
            request.getRequestDispatcher("/result.jsp").forward(request, response);
            return false;
        }
        return true;
    }
                //modelAndView  表示控制器的返回结果
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mv) throws Exception {
        System.out.println("执行拦截器的 postHandle 方法 ");

        //postHandle  可以修改 modelAndview 结果

        if(mv !=null){
            //修改数据
            mv.addObject("myDate", new Date());

            //修改视图
            mv.setViewName("other");
        }
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
                                Object handler,
                                Exception ex) throws Exception {
        System.out.println("执行拦截器的afterCompletion 方法 ");
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个在Spring MVC中使用拦截器的完整代码示例: 首先,创建一个自定义的拦截器类 `CustomInterceptor`,实现 `HandlerInterceptor` 接口: ```java import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; @Component public class CustomInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在请求处理之前进行拦截处理,返回值表示是否继续执行后续的拦截器和处理器 System.out.println("PreHandle method is called"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 请求处理之后进行拦截处理,但在视图渲染之前 System.out.println("PostHandle method is called"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 在视图渲染之后进行拦截处理 System.out.println("AfterCompletion method is called"); } } ``` 然后,在配置类或者配置文件中注册拦截器: **使用Java配置类:** ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private CustomInterceptor customInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(customInterceptor) .addPathPatterns("/**"); // 拦截所有路径 } } ``` **使用XML配置文件:** ```xml <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <!-- 拦截所有路径 --> <bean class="com.example.CustomInterceptor"/> </mvc:interceptor> </mvc:interceptors> ``` 在上述示例中,`CustomInterceptor` 类被注解为 `@Component`,以便被Spring容器扫描到。然后,在配置类或者配置文件中使用 `addInterceptors` 方法(Java配置类)或者 `<mvc:interceptors>` 元素(XML配置文件)来注册拦截器。 这样,当应用程序收到请求时,拦截器的 `preHandle` 方法会在请求处理之前被调用,`postHandle` 方法会在请求处理之后、视图渲染之前被调用,`afterCompletion` 方法会在视图渲染之后被调用。你可以根据自己的需求,在这些方法中编写相应的拦截逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值