Spring Cloud第01讲:Eureka服务注册中心-页面

Spring Cloud第01讲:Eureka服务注册中心-页面[Greenwich.RELEASE版本]

  • 1. 首页
  • 2. 改造
    • 2.1 配置
    • 2.2 `拦截器`
    • 2.3 组件
    • 2.4 效果图

1. 首页

这里我们就只截了一部分图,可以看出 Current time(当前系统时间)的格式是 "yyyy-MM-dd'T'HH:mm:ss Z"酱紫的,小编看着不爽。
Spring Cloud第01讲:Eureka服务注册中心-页面_第1张图片这里说一下eureka server首页的展示,其实是调用了eureka server本身提供的一个controller处理器。具体参见 spring-cloud-netflix-eureka-server-2.1.0.jar包的org.springframework.cloud.netflix.eureka.server.EurekaController。从@RequestMapping()可以看出eureka server给我们兜底的访问路径就是 “/”。
Spring Cloud第01讲:Eureka服务注册中心-页面_第2张图片

2. 改造

这里小编通过拦截器的方式对其进行改造。
Eureka Server的搭建参见 Spring Cloud第01讲:Eureka服务注册中心

2.1 配置

1). pom.xml


<dependency>
	<groupId>org.springframework.bootgroupId>
	<artifactId>spring-boot-configuration-processorartifactId>
	<optional>trueoptional>
dependency>

2). application-es.properties配置文件如下:配置内容为需要拦截的controller处理器返回视图名ViewName。这里配置的两个视图名为org.springframework.cloud.netflix.eureka.server.EurekaController处理器中返回的视图名。

es.intercept.view.status=eureka/status
es.intercept.view.lastn=eureka/lastn

EurekaController类如下
Spring Cloud第01讲:Eureka服务注册中心-页面_第3张图片
3). 配置类

package cn.buddha.jeres.server.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName EsCommConfig
 * @Author 友野浩二
 * @Date 2019/12/29 15:09
 * @Description 公共配置
 * @Version 1.0
 */
@Configuration
@ConfigurationProperties(prefix = "es.intercept")
@EnableConfigurationProperties(value = EsCommConfig.class)
@Data
public class EsCommConfig {
    /**
     * 从配置文件中读取的 view 开头的数据
     * 注意:名称必须与配置文件中保持一致
     */
    private Map<String, String> view = new HashMap<>();
}

2.2 拦截器

这里我们的拦截器的postHandler()中进行处理,也就是在业务处理器(Controller)处理请求执行完成后,生成视图之前执行。这样的话,我们就可以怼业务处理器返回的ModelAndView中的model进行改造了。

package cn.buddha.jeres.server.intercept;

import cn.buddha.jeres.server.component.EsComponent;
import cn.buddha.jeres.server.config.EsCommConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.ui.ModelMap;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.View;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

/**
 * @ClassName EsHandlerIntercept
 * @Author 友野浩二
 * @Date 2019/12/26 0:54
 * @Description 拦截器: 使用Spring提供的拦截器(HandlerInterceptor)进行更加精细的控制
 * @Version 1.0
 */
@Component
@Slf4j
public class EsHandlerIntercept implements HandlerInterceptor {

    @Resource
    private EsComponent esComponent;

    @Resource
    private EsCommConfig esCommConfig;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("Tong Eureka Server preHandle: 在业务处理器处理请求之前被调用,即在调用controller之前调用");
        return true;
    }

    /*
     * @Author 友野浩二
     * @Description //
     * @Date 2019/12/26 00:50
     * @Param request
     * @Param response
     * @Param handler
     * @Param modelAndView: 用来存储处理完后的结果数据,以及显示该数据的视图。Model代表模型,View代表视图。
     * @return void
     **/
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

        // 当Controller层返回的是页面时
        if (null != modelAndView) {
            String viewName = modelAndView.getViewName();// 视图名
            View view = modelAndView.getView();
            ModelMap modelMap = modelAndView.getModelMap();// 返回给前端页面的数据模型
            Map<String, Object> map = modelAndView.getModel();

            log.info("viewName: {}", viewName);
            log.info("modelMap: {}", modelMap);
            log.info("map: {}", map);
            log.info("view: {}", view);

            // 当返回视图名为 与 interceptViewList 集合中的元素相同时(参见控制器org.springframework.cloud.netflix.eureka.server.EurekaController的status)
            if (this.esCommConfig.getView().containsValue(viewName)) {
                log.info("哈哈哈哈哈哈啊哈哈哈");
                // 对 返回模型中的 某些属性 进行个性化处理
                // 如果modelMap中添加的 map 的 key 重复了,则后者会覆盖前者对应的value
                modelMap.addAllAttributes(this.esComponent.addElement());
            }
        }

        log.info("Tong Eureka Server postHandle: 在业务处理器(Controller)处理请求执行完成后,生成视图之前执行。" +
                "如果控制器Controller出现了异常,则不会执行此方法");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("Tong Eureka Server afterCompletion: 不管有没有异常,请求调用完成后回调方法,即在视图渲染完成后回调");
    }

}

2.3 组件

拦截器中postHandle()方法中用的组件

package cn.buddha.jeres.server.component;

import cn.buddha.jeres.server.model.EsModel;
import com.alibaba.fastjson.JSON;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

/**
 * @ClassName EsComponent
 * @Author 友野浩二
 * @Date 2019/12/26 00:57
 * @Description Eureka Server 组件
 * @Version 1.0
 */
@Component
public class EsComponent {

    /**
     * @return java.util.Map
     * @Author 友野浩二
     * @Description // 添加 Eureka Server 数据模型,并转换为Map
     * @Date 2019/12/26 01:01
     * @Param
     */
    public Map<String, Object> addElement() {
        return JSON.parseObject(JSON.toJSONString(create()), Map.class);
    }

    /**
     * EsModel模型组织
     */
    private EsModel create() {
        EsModel esModel = new EsModel();

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd号 HH:mm:ss.SSS");
        String currentTime = simpleDateFormat.format(new Date());

        esModel.setCurrentTime(currentTime);
        esModel.setDatacenter("ZhangTong");

        return esModel;
    }
}

EsModel就不说了,就两个字段。

2.4 效果图

Spring Cloud第01讲:Eureka服务注册中心-页面_第4张图片

你可能感兴趣的:(spring,cloud)