15.SSM框架集~SpringMVC拦截器与异常处理

15.SSM框架集~SpringMVC拦截器

本文是上一篇文章的后续,详情点击该链接

拦截器

        Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等

拦截器和过滤器的区别

在这里插入图片描述

        过滤器针对的是所有的请求,拦截器主要针对的是控制单元。过滤器基于技术是Servlet,拦截器是SpringMVC提供,拦截器可以看作是细化的过滤器,用拦截器可以实现的功能,过滤器几乎都可以实现。但是过滤器可以实现的功能,拦截器不一定可以实现。

拦截器 过滤器
拦截器不依赖与servlet容器 过滤器依赖与servlet容器
拦截器只能对action请求起作用 而过滤器则可以对几乎所有的请求起作用
拦截器可以访问action上下文、值栈里的对象 过滤器不能访问
在action的生命周期中,拦截器可以多次被调用 过滤器只能在容器初始化时被调用一次
拦截器可以获取IOC容器中的各个bean,在拦截器里注入一个service,可以调用业务逻辑。 过滤器不怎么行
要使用Spring MVC中的拦截器,就需要对拦截器类进行定义和配置。通常拦截器类可以通过两种方式来定义。

        通过实现HandlerInterceptor接口,或继承HandlerInterceptor接口的实现类(如HandlerInterceptorAdapter)来定义。

        通过实现WebRequestInterceptor接口,或继承WebRequestInterceptor接口的实现类来定义。

代码实现

本节代码是接第13章的那篇后续
配置拦截器
    <!--  配置拦截器   -->
    <mvc:interceptors>
        <!--  定义拦截器配置   -->
        <mvc:interceptor>
            <mvc:mapping path="/loginUser/"/><!-- 用于指定对拦截的 url --> 
            <bean id="inter1" class="com.alvin.interceptor.MyInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

代码实现

public class MyInterceptor  implements HandlerInterceptor {

    //执行时机:进入控制单元之前执行
    //如果方法返回值是true才会继续执行,如果是false 控制单元内容将不会执行
    // handler--com.alvin.controller.UserController#login(String, String, HttpServletRequest)
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //System.out.println("preHandle"+handler);
        //[作用一]进行中post文乱码的处理
        request.setCharacterEncoding("utf-8");
        //[作用二] 维护页面的跳转
        //response.sendRedirect(request.getContentType()+"/wh.jsp");
        //[作用三]进行权限校验/登录拦截
        return true;
    }
    //执行的时机:在控制单元中做出相应之前 ,也就是在控制单元中第二步和第三步之间
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        //[作用一]响应之前页面跳转的处理
        // modelAndView.setViewName("redirect:/success2.jsp");
        //[作用二] 对敏感词语进行拦截替换
        Map<String, Object> model = modelAndView.getModel();
        //取出响应给客户端数据
        String msg = (String) model.get("msg");
        if(msg.contains("枪支")){
            //替换成功以后的字符串
            String m2 = msg.replaceAll("棍棒", "**");

            model.put("msg",m2);
        }
        System.out.println("postHandle");
    }
    //执行的时机:页面渲染后时候
    //垃圾回收的处理操作   资源关闭操作
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion");
    }
}

SpringMVC中异常处理

       系统中异常包括两类:预期异常和运行时异常 RuntimeException,前者通过捕获异常从而获取异常信息, 后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。

       系统的 dao、service、controller 出现都通过 throws Exception 向上抛出,最后由 springmvc 前端控制器交由异常处理器进行异常处理,如下图

在这里插入图片描述

使用@ExceptionHandler注解处理异常

假如我们现在就遇到一个异常,怎么办呢?

在这里插入图片描述

解决
//value指向的那个值就是我上面画红线的那个
    @ExceptionHandler(value = java.lang.NumberFormatException.class)
    public ModelAndView handlerArithmeticException(){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("redirect:/error.jsp");
        return modelAndView;
    }

@ExceptionHandler源码

在这里插入图片描述

如果我们想要全局异常处理,那么我们可以单独创建一个包

在这里插入图片描述

//全局异常处理
@ControllerAdvice
public class GloableException {
    
    @ExceptionHandler(value = java.lang.NumberFormatException.class)
    public ModelAndView handlerArithmeticException(){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("redirect:/error.jsp");
        return modelAndView;
    }
}

然后在配置文件里面多扫描一个就好了

  <context:component-scan base-package="com.alvin.controller,com.alvin.exception"></context:component-scan>

使用:SimpleMappingExceptionResolver


@Configuration
public class GloableException2 {
    @Bean
    public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver(){
        SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
        Properties prop = new Properties();
        prop.put("java.lang.NullPointerException","error1");
        prop.put("java.lang.ArithmeticException","error2");
        resolver.setExceptionMappings(prop);
        return resolver;
    }
}

自定义HandlerExceptionResolve

@Configuration
public class GloableException3 implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        ModelAndView mv = new ModelAndView();
        if(e instanceof NullPointerException){
                mv.setViewName("error1");
        }
        if(e instanceof ArithmeticException){
                mv.setViewName("error2");
        }
        mv.addObject("msg",e);
        return mv;
    }}

猜你喜欢

转载自blog.csdn.net/qq_41424688/article/details/106861155
今日推荐