分类存档: java excel

java泛型的强大功能

public static <T> List<T> parseList(String xlsName, String sheetName);

使用时不需要指定泛型类型,参考自guva。

public <T> T newInstantce() {
Type genType = getClass().getGenericSuperclass();
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();

Class<T> clazz = (Class) params[0];
T obj = null;
try {
obj = clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
log.error(“ERROR”, e);
}
return obj;
}

生成泛型的实例。

jsp中取客户端ip

一直以来取客户端的ip使用的是:

getRequest().getRemoteAddr();

在绝大多数情况下,这是可以正确取到客户端的ip的。

昨天服务器改为使用nginx转发后,无法获得到客户端的真实ip,只能取到nginx所以的服的ip。

在网上查询后了角到nginx要设置http header: X-Real-IP才可以取到真实IP。

proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

设置之后,果断无效,查询对比多次,配置无误。

最后终于发现:这种情况下,应该改为先取header中的x-real-ip。如果为空的话,再去调用getRemoteAddr();

String realIP = getRequest().getHeader(“X-Real-IP”);
return realIP != null ? realIP : getRequest().getRemoteAddr();

这样似乎解决掉问题了。

但又遇到另一个棘手的事情了。

我们的程序要通过一个统一的nginx进行proxy转发至目标主机,然后在目标主机上再用proxy转发至目标主机tomcat所在端口8080。通过这两次转发后,x-real-ip取到的是第一次进行转发的主机ip,这仍旧不是我们所希望的。

我们所要求的是无论通过直接访问目标主机,还是通过proxy代理访问主机,都希望获得客户端请求的ip,最终解决方案如下:

在统一nginx转发的proxy上配置:

proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

在目标主机的nginx上proxy配置:

proxy_set_header X-Forwarded-For  $http_x_forwarded_for;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

修改代码如下:

String address = getRequest().getHeader(“X-Forwarded-For”);
if (address != null && address.length() > 0
&& !”unknown”.equalsIgnoreCase(address)) {
return address;
}
String realIP = getRequest().getHeader(“X-Real-IP”);
return realIP != null ? realIP : getRequest().getRemoteAddr();

呜呼,终于能正确的取到客户端ip了。

java 生成excel加密文件

excel加密文件,需要输入密码后才可以打开excel。

poi是比较通用的excel开发包,但无法生成excel加密文件。

jxcell则可以生成加密excel,以下代码读取excel并对excel进行加密然后保存。

// 使用jxcell加密
View view = new View();
view.read(new FileInputStream(file));
view.write(new FileOutputStream(file), userPass);