Spring项目路径

Spring源码——WebUtils

个人网站中部署的服务器共有两台,由于是分布式的环境,为了防止有效的针对具体某个服务器出现的问题,需要在网页上加上服务器的IP地址和项目启动的时间,但是由于资源的问题,最好还是不要使用ajax,毕竟每次都要请求的一次的话实在是太消耗资源了,这里,我采用的方式是在项目启动的时候,就获取服务器公网的IP,然后替换掉jsp的文件,应该是目前最好的方式了。捣鼓的半天,做成的效果如下:

<div align="center">

</div>

过程主要如下:

  1. 获取公网IP
  2. 添加自定义监听器

1.获取公网IP

理论上来说,通过NAT连接的服务器,特别是阿里云的VPS这类的,仅仅通过java来查看本地IP地址只能获取到自己的私网地址,而对于公网IP来说,是不能获取的到的。所以,我们必须使用另一种方式。在Linux中,我们会使用curl icanhazip.com这类命令来获取自己的公网IP,相当与发送了个请求,而对于Java来说,获取方式也是类似。即对外发送一个请求,让外面的服务器判断自己服务器的公网IP即可,原理也就这样,代码使用了对HttpClient封装过后的HttpHelper,很简单。

        String ip = "";
        String url = "http://icanhazip.com/";
        try {
            ip = HttpHelper.getInstance().get(url);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ip;

这样就能获取到公网IP了,除了这个网站,下列网址也能获取到公网IP:

(1)http://icanhazip.com/

(2)http://ip.chinaz.com

2.添加自定义监听器

获取到IP了,下一步是让它写死在jsp中,我们可以通过自定义监听器,当项目启动的时候加载该监听器,在监听器里对foot.jsp进行操作。首先是要获取项目的路径,网上参考了Java EE获取路径全攻略之类的,其实用servletContextEvent.getServletContext().getRealPath("/")也行,Spring中WebAppRootListener原理也跟这个类似的。

首先,在web.xml中添加:

    <context-param>
        <param-name>webAppRootKey</param-name>
        <!--名字可以自定义-->
        <param-value>myblog.path</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.util.WebAppRootListener</listener-class>
    </listener>

然后在java代码中获取方式:

//获取路径
String user = System.getProperty("myblog.path");
String abPath = WinOrLinux.isWin() ? user + "foot.jsp" : user + "foot.jsp";
//获取IP
String ip = IPUtils.getServerIp();
//读取然后写入,可以使用Jsoup但是处理比较麻烦,简单点,在网页中写某个字段,然后replace一下即可
File file = new File(abPath);
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(abPath), "UTF-8"));//构造一个BufferedReader类来读取文件
String s = null;
StringBuilder result = new StringBuilder();
while ((s = br.readLine()) != null) {//使用readLine方法,一次读一行
    result.append(s);
    result.append("\r\n");
}
br.close();
//替换
String newStr = result.toString().replaceAll("serverIp", ip).replaceAll("projectStartTime", DateTime.now().toString("yyyy-MM-dd HH:mm:ss"));
FileOutputStream fileOutputStream = new FileOutputStream(file);
OutputStreamWriter outputWriter = new OutputStreamWriter(fileOutputStream, "UTF-8");
outputWriter.write(newStr);

然后Spring在启动的时候都会更新一下当前的IP地址和项目启动的时间。

3.WebUtils源码

public abstract class WebUtils {
    ...
    //web.xml中的定义
    public static final String WEB_APP_ROOT_KEY_PARAM = "webAppRootKey";
    
    public static void setWebAppRootSystemProperty(ServletContext servletContext) throws IllegalStateException {
        Assert.notNull(servletContext, "ServletContext must not be null");
        //获取项目的路径
        String root = servletContext.getRealPath("/");
        if (root == null) {
            throw new IllegalStateException("Cannot set web app root system property when WAR file is not expanded");
        } else {
            //查看web.xml中是否配置了webAppRootKey
            String param = servletContext.getInitParameter("webAppRootKey");
            String key = param != null ? param : "webapp.root";
            String oldValue = System.getProperty(key);
            //如何符合,则设置值
            if (oldValue != null && !StringUtils.pathEquals(oldValue, root)) {
                throw new IllegalStateException("Web app root system property already set to different value: '" + key + "' = [" + oldValue + "] instead of [" + root + "] - Choose unique values for the 'webAppRootKey' context-param in your web.xml files!");
            } else {
                System.setProperty(key, root);
                servletContext.log("Set web app root system property: '" + key + "' = [" + root + "]");
            }
        }
    }
    ...
}

参考:

Java EE获取路径全攻略

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏vue学习

小程序 — 选项卡

(2)将用户点击传过来的index值赋给data中改变当前的索引值activeIndex

952
来自专栏对角另一面

lodash源码分析之缓存使用方式的进一步封装

在世界上所有的民族之中,支配着他们的喜怒选择的并不是天性,而是他们的观点。 ——卢梭《社会与契约论》 本文为读 lodash 源码的第九篇,后续文章会更新到...

2796
来自专栏编程思想之路

WiFiAp探究实录--功能实现与源码分析

Android虐我千百遍,我待Android如初恋。 ——————编辑于2017-08-02——————— wifi热点说的是wifiAp相...

8388
来自专栏hbbliyong

在C#使用文件监控对象FileSystemWatcher 实现数据同步

       最近在项目中有这么个需求,就是得去实时获取某个在无规律改变的文本文件中的内容。首先想到的是用程序定期去访问这个文件,因为对实时性要求很高,间隔不能...

2926
来自专栏zcqshine's blog

SpringMVC下获取验证码

3588
来自专栏程序员互动联盟

【盟友分享】vim学习之路-vim基本操作

前言:说到我的学习之路是从arm嵌入式开发开始的,基本上在学校学习都时windows开发开始的,转到ubuntu上嵌入式开发刚开始非常的不习惯。不用鼠标很难受的...

3166
来自专栏大内老A

WCF技术剖析之十一:异步操作在WCF中的应用(下篇)

说完了客户端的异步服务调用(参阅WCF技术剖析之十一:异步操作在WCF中的应用(上篇)),我们在来谈谈服务端如何通过异步的方式为服务提供实现。在定义服务契约的时...

1929
来自专栏程序你好

JavaScript调试和优化,深入研究谷歌Chrome浏览器开发工具(一)

Chrome DevTools集成了许多子工具,用于在客户端上调试web应用程序,比如记录性能配置文件和检查动画——主要是通过DevTools控制台来学习web...

725
来自专栏xingoo, 一个梦想做发明家的程序员

Spark源码分析之Spark Shell(下)

继上次的Spark-shell脚本源码分析,还剩下后面半段。由于上次涉及了不少shell的基本内容,因此就把trap和stty放在这篇来讲述。 上篇回顾:S...

25510
来自专栏LanceToBigData

struts2(四)之输入校验

前言   这个本来是昨天就写好的,但是不知道为什么没有保存成功!但是今天起来再写一遍就当巩固一下知识吧。 一、输入校验概述   在以前我们写一个登录页面时,并没...

1938

扫码关注云+社区