1. Api----getRealPath()
有的中间件,对J2EE标准的支持不一样,如:Weblogic中无法在Servlet中使用getRealPath获取资源的绝对路径。
但是,我们可以使用类加载器来得到…/WEB-INF/classes/目录的绝对路径:
MyServlet.class.getClassLoader().getResource(“/”).getPath();
2. Api----request.getRemoteHost();
获取请求的客户端的IP,
如果使用了负载均衡器,则调用request.getRemoteHost()方法返回的是负载均衡器的IP,而不是客户端的实际IP,
一般的负载均衡在发送请求到一台服务器时,会将客户端的真实IP放到header信息中,所以可以通过这种方式获取客户端的真实IP:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
{
String ip = request.getHeader( " x-forwarded-for " );
if (ip == null || ip.length() == 0 || " unknown " .equalsIgnoreCase(ip))
{
ip = request.getHeader( " Proxy-Client-IP " );
}
if (ip == null || ip.length() == 0 || " unknown " .equalsIgnoreCase(ip))
{
ip = request.getHeader( " WL-Proxy-Client-IP " );
}
if (ip == null || ip.length() == 0 || " unknown " .equalsIgnoreCase(ip))
{
ip = request.getRemoteAddr();
}
return ip;
}
3. Log4j日志记录
多数情况下,我们一台服务器上会对一个项目部署多个server,但是这多个server的log4j配置文件内容却是一样的,这样就会造成多个server同时对日志文件进行写操作,
这样就会造成日志的丢失。解决思路如下:
一台机器上的各个server肯定占用的是不同的端口,所以可以将各个server的日志记录输出到对应的端口下,例如,log4j.properties文件中配置日志输出目录为:/root/bea/logs/
那么,我们可以让8001端口的server日志记录到/root/bea/logs/8001/目录下,8003端口的server记录到/root/bea/logs/8003/目录下,
这样就可以解决日志丢失的问题:代码放到filter中(/*),当第一次请求server时,就会创建相应端口的目录,以后的日志就会记录到该端口目录下
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
public static void initLog4JDir(HttpServletRequest request)
{
if (created)
return ;
try
{
// 1.读取property文件中,log4j日志的配置路径
String logDir = readLogDir();
if (StringTools.isEmpty(logDir))
return ;
// 2.如果文件路径不存在,则创建, 代码略
// logDir = createLogDirIfNeed(logDir, "8001");
logDir = createLogDirIfNeed(logDir, request.getLocalPort());
System.setProperty( " LOG_DIR " , logDir);
new PropertyConfigurator().doConfigure(Loader.getResource(LogManager.DEFAULT_CONFIGURATION_FILE),
created = true ;
} catch (Exception e)
{
e.printStackTrace();
created = false ;
}
}