我们的系统中有一个Apache Web服务器,它将所有请求代理转发到内部ELB,然后代理运行不同应用程序的Tomcats。其中一个应用程序设置了一个cookie,用于了解用户是否有会话。使用内部平衡器可以很好地工作。对于某些架构问题,我们必须将其中一个平衡器从内部平衡器更改为外部平衡器。问题是,当我们想要从运行在apache中的php代码访问外部平衡器后面运行的应用程序时,cookie不会通过,外部ELB会更改所有这些。外部ELB有自己的子域。 以下是我们设置cookie的代码java:
public int validaLogin(HttpSession sesion,
final HttpServletRequest request,
final HttpServletResponse response, String usuario,
int login_user_id) {
final String sesion_username = (String) sesion
.getAttribute(Utiles.CONST_USUARIO);
int codigo = 0;
if (sesion_username == null || usuario != null
&& !(usuario.equals(sesion_username))) {
List<String[]> listaimei = new ArrayList<String[]>();
listaimei.clear();
sesion.setAttribute(URL, request.getQueryString());
if (usuario != null) {
sesion.setAttribute(Utiles.CONST_USUARIO, usuario);
sesion.setAttribute("User", usuario);
Enumeration<Locale> locales = request.getLocales();
if (locales.hasMoreElements()) {
Locale locale = (Locale) locales.nextElement();
sesion.setAttribute("Locale", locale);
}
}
if (login_user_id > 0) {
sesion.setAttribute(Utiles.CONST_IDUSUARIO, login_user_id);
}
String login_ip;
if (request.getHeader("x-forwarded-for") == null) {
login_ip = request.getHeader("host");
} else {
login_ip = request.getHeader("x-forwarded-for");
}
sesion.setAttribute("ip", login_ip);
SqlQuery.setUserInfoInSession(sesion, login_user_id);
List<Integer> listaPermisos = SqlQuery.setUserPermisosInSession(sesion, login_user_id);
// Obtiene lista de IMEI visible por el usuario
objResultGetListaIMEI userIMEI = getlistaimeiFromDatabase(
login_user_id, login_ip);
codigo = userIMEI.getResultado();
sesion.setAttribute(Utiles.CONST_LISTAIMEI, userIMEI.getListaImei());
// Guarda sesion como Header
response.setHeader("wpsid", sesion.getId());
// Guarda sesion como Cookie
Cookie cookie = new Cookie("wpsid", sesion.getId());
cookie.setMaxAge(-1);
cookie.setPath("/");
response.addCookie(cookie);
// Agrega nueva sesion al hash 05/03/2014 CV
WaypointSessionsInit.dsAddNewSession(sesion, userIMEI.getListaImei(), listaPermisos);
}
return codigo;
}