这里我们就只截了一部分图,可以看出 Current time(当前系统时间)的格式是 "yyyy-MM-dd'T'HH:mm:ss Z"
酱紫的,小编看着不爽。
这里说一下eureka server首页的展示,其实是调用了eureka server本身提供的一个controller处理器。具体参见
spring-cloud-netflix-eureka-server-2.1.0.jar
包的org.springframework.cloud.netflix.eureka.server.EurekaController
。从@RequestMapping()可以看出eureka server给我们兜底的访问路径就是 “/”。
这里小编通过拦截器的方式对其进行改造。
Eureka Server的搭建参见 Spring Cloud第01讲:Eureka服务注册中心
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
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<>();
}
拦截器
这里我们的拦截器的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: 不管有没有异常,请求调用完成后回调方法,即在视图渲染完成后回调");
}
}
拦截器中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就不说了,就两个字段。