Java 微服务 乐优网络商城 day02 源代码 SpringBoot 实战开发 SpringMVC高级配置:拦截器:HandlerExecutionChain

Posted 蓝盒子.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 微服务 乐优网络商城 day02 源代码 SpringBoot 实战开发 SpringMVC高级配置:拦截器:HandlerExecutionChain相关的知识,希望对你有一定的参考价值。

一、拦截器

1、HandlexExecutionChain回顾

HandlexExecutionChain,是一个执行链,当用户的请求到达DispatchersSearvlet,的时候,

pispat cherservlat会到andlerkapping中查找对应的Biadier ,

找到后返回的就是这个:Handle.IExesutionchain,里面包含了:

1)正有的Handler对象

  1. Handler的拦截器集合,这里的拦截器对象是:Handler Intetseptoi.

2、拦截器接口:HandlerInterceptox

HandlerInterceptor是springMVC项目中的拦截器,它拦截的目标是请求的地址,比MethodInterceptor先执行。

HandlerInterceptor拦截的是请求地址,所以针对请求地址做一些验证、预处理等操作比较合适。

当你需要统计请求的响应时间时MethodInterceptor将不太容易做到,

因为它可能跨越很多方法或者只涉及到已经定义好的方法中一部分代码。

实现一个HandlerInterceptor拦截器可以直接实现HandlerInterceptor接口,

也可以继承HandlerInterceptorAdapter类。

在这里插入图片描述

3、自定义拦截器

(一)自定义拦截器并设置生成日志信息MyInterceptor
(1)创建类:MyInterceptor:设置生成日志信息

在这里插入图片描述
完善
在这里插入图片描述

package com.itzheng.interceptor;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor implements HandlerInterceptor {

    private static final Logger log = LoggerFactory.getLogger(MyInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.debug("preHandle method is running");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.debug("postHandle method is running");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.debug("afterCompletion method is running");
    }
}

(2)完善类:HelloController

在这里插入图片描述

package com.itzheng.web;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @GetMapping("hello.do")
    public String hello(){

        System.out.println("hello method is running");

        return "hello, spring boot !";
    }
}

如果你想要保持Spring Boot的一些默认MVC特征

同时又想自定义一些MVC配置

(包括:拦截器,格式化器,视图控制器、消息转换器等等)

你应该让一个类实现 WebMvcConfigurer,并且添加@Configuration注解,

但是千万不要加@EnablewebMvc注解。

如果你想要自定
HandlerMapping 、 HandlerAdapter 、ExceptionResolver

等组件,你可以创建一个webMvcRegistrationsAdapter实例来提供以上组件。

如果你想要完全自定义SpringMVC

不保留SpringBoot提供的一切特征,

你可以自己定义类并且添加@Configuration注解和@EnableWebMvc注解

(3)配置拦截器,创建MvcConfig

在这里插入图片描述

package com.itzheng.config;

import com.itzheng.interceptor.MyInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration  //当Spring扫描到Configuration的时候执行以下内容
public class MvcConfig implements WebMvcConfigurer {

    @Override       //调用该方法
    public void addInterceptors(InterceptorRegistry registry) {
        //拦截一切路径
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");

    }
}

(4)运行测试项目

在这里插入图片描述
http://localhost:8088/hello.do

在这里插入图片描述
在这里插入图片描述

(二)简化MyInterceptor,并在业务层进入日志信息
(1)修改MyInterceptor类的信息

在这里插入图片描述
删除这个

private static final Logger log = LoggerFactory.getLogger(MyInterceptor.class);

在这里插入图片描述

package com.itzheng.interceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Slf4j
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.debug("preHandle method is running");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.debug("postHandle method is running");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.debug("afterCompletion method is running");
    }
}
(2)在HelloController完善日志信息

在这里插入图片描述

package com.itzheng.web;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
public class HelloController {
    @GetMapping("hello.do")
    public String hello(){
        log.debug("hello method is running");
        return "hello, spring boot !";
    }
}
(3)重新运行项目

在这里插入图片描述

http://localhost:8088/hello.do

在这里插入图片描述
在这里插入图片描述

以上是关于Java 微服务 乐优网络商城 day02 源代码 SpringBoot 实战开发 SpringMVC高级配置:拦截器:HandlerExecutionChain的主要内容,如果未能解决你的问题,请参考以下文章