我正在使用JavaServer Pages开发网页,但遇到以下问题:该页面在我正在开发的地方正常工作(我使用 NETBEANS)。当给出“运行项目”时,页面会很好地接收会话变量。
当我给出“清理并构建”以生成文件.WAR
以将其上传到我的主机,并从域(从主机)执行页面时,有时我会丢失会话变量中包含的值,并且由于因此,它们会留下错误(经典的“ Java Null Pointer Exception
”)。
我如何操作会话变量?好的,这里有一些代码片段:
这里是一个用于登录的servlet 。我正在保存两个数据,用户名和用户类型。除此之外,我建立了一个生命周期(1 小时):
Login log = new Login();
log.setEmail(request.getParameter("username"));
log.setPassword(request.getParameter("password"));
try {
if (log.iniciarSesion()) {
HttpSession session = request.getSession(false); <---- Llamo la sesion
session.setAttribute("username", log.getEmail()); <---- guardo usuario
session.setAttribute("tipo", log.getTipoUser().charAt(0)); <---- guardo tipo
MessageController.setError(false);
session.setMaxInactiveInterval(3600); <---- ajusto tiempo de vida (3600 segundos)
switch (log.getTipoUser().charAt(0)) {
case 'T':
response.sendRedirect("ListaObrasServlet?page=1");
break;
case 'S':
response.sendRedirect("ListaTitularServlet?page=1");
break;
default:
response.sendRedirect("ObrasServlet?page=1");
break;
}
} else {
MessageController.setError(true);
response.sendRedirect("index.jsp");
}
} catch (SQLException ex) {
Logger.getLogger(LoginServlet.class.getName()).log(Level.SEVERE, null, ex);
}
现在是我如何检索值的示例:
<nav class="gtco-nav" role="navigation">
<div class="gtco-container">
<div class="row">
<div class="col-sm-4 col-xs-12">
<div id="gtco-logo"><a href="index.jsp">VUDA </a></div>
</div>
<div class="col-xs-8 text-right menu-1">
<ul>
<% if(session.getAttribute("tipo").toString().contains("U")){ %>
ETC ETC ETC ETC
<% }else if(session.getAttribute("tipo").toString().contains("T")){%>
ETC ETC ETC ETC
<% }else if(session.getAttribute("tipo").toString().contains("S")){ %>
ETC ETC ETC ETC
<%}%>
(mas y mas html)
<% if(session.getAttribute("tipo").toString().contains("U") ){%>
ETC ETC ETC ETC
<% } %>
<li><a href="#">Contactenos</a></li>
<li class="btn-cta" <% if(session.getAttribute("username")!=null ) out.print("style='display:none;'");%>><a id="btn2" data-toggle="modal" data-target="#loginModal"><span>Usuario</span></a></li>
<li class="btn-cta" <% if(session.getAttribute("username")!=null ) out.print("style='display:inline;'");else out.print("style='display:none;'");%>><a href="logoutServlet"><span>Cerrar Sesion</span></a></li>
</ul>
</div>
</div>
</div>
</nav>
好吧,正如我所说,我重复了这个问题:当我从 netbeans 运行时一切正常,但是当我将页面上传到主机时,当我更改页面时,我丢失了会话中包含的值。有些时候一切正常,但不知从何而来。
注意:在 XML 文件中,我也有会话的生命周期:
<session-config>
<session-timeout>
60
</session-timeout>
</session-config>
会是什么呢?
更新:我发现一旦您更改主机中的页面,会话实际上就会终止,我不明白为什么(服务器是 Ubuntu 服务器)。Netbeans 应该怎么做才能让他们活着?
我很确定这是一个配置问题。在服务器上,为了让每个页面上的会话保持活跃,我必须使用encodeURL
... 但这对我来说太烦人了。如何使GlassFish服务器保持会话活动?我在 Stack Web 中使用的是:
操作系统:Ubuntu Server 18.04 LTS
Web 服务器:GlassFish 服务器 4.1.1
数据库:MySQL
编程语言:Java 服务器页面
应用服务器中是否有多个 WAR?
由于会话 cookie (JSESSIONID),我在具有多个应用程序的 Websphere 中遇到了问题,因为它们都使用相同的名称。
将会话 cookie 的名称更改为某些应用程序对我很有用,以便名称是唯一的并且不能重复。
也许你可以在 Glashfish 上试试看它是否有效
https://docs.oracle.com/cd/E18930_01/html/821-2417/beash.html
我希望对我的这个简短想法有所帮助。
我相信您会因发出请求的次数而丢失会话变量。我了解您
sendRedirect()
提出一个新请求,这在 POST 请求和属性不可见时非常有用,但是当您转发时,您不会发出新请求,而是相同的请求将通过每个 servlet您指出并始终在浏览器中保持相同的 URL,并通过以下方式完成:这样,将始终保持相同的会话或直到您将其删除。
我希望我有所帮助。