【问题标题】:A new session is created when doing href from one jsp page to another and session variables are returned as null从一个 jsp 页面执行 href 到另一个页面时会创建一个新会话,并且会话变量返回为 null
【发布时间】:2012-07-21 19:45:18
【问题描述】:

在我拥有的第一个 jsp 页面上 -

<%@ page language="java" %>
<%@ page import="java.io.*,java.util.*" %>
<html>
<head>
<style type="text/css">
body {
    font-family:verdana,arial,sans-serif;
    font-size:10pt;
    margin:10px;
    background-color:#ff9900;
    }
</style>

<%
   session.setAttribute( "theName", "abc" );
%>
<li><a href="http://localhost:8080/auto/second.jsp" target="content">click here!!</a></li><br />
</body>
</html>

在 second.jsp 上,我有,

<%@ page language="java" %>
<%@ page import="java.io.*,java.util.*" %>
<html>
 <head>
Hello, <%out.print(session.getAttribute( "theName" )); %>
</table>
</body>
</html>

但是这里会话变量“theName”的值返回为空。 我还在第一页和第二页上都做了&lt;% out.print( session.getId()); %&gt;,问题是返回了两个不同的会话ID,比如 - 230EC6DA6ECD25BC96268942D0ACE5EB(在第一页) C2399D151F0D6D6002D16A126EDDC9FB(在第二页)

这似乎是会话变量未成功传递的原因。我也试过把

<%@ page session="false" %>

这样就不会在 second.jsp 中创建新会话。但是如果我在 second.jsp 中使用&lt;%@ page session="false" %&gt;,那么它会抛出 jasper 异常 -

Jul 23, 2012 5:23:47 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet jsp threw exception
org.apache.jasper.JasperException: Unable to compile class for JSP: 

An error occurred at line: 32
<%out.print(session.getAttribute( "theName" ));
at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:93)
    at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)
    at org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:451)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:328)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:307)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:295)
    at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:565)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:311)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:308)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:259)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:843)
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:679)
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1303)

请建议我如何将会话变量从一个 jsp 页面传递到另一个页面。在此先感谢您的帮助!!

【问题讨论】:

  • &lt;%@ page session="false" %&gt; 表示根本不使用会话,而不是不要创建新会话而是使用任何现有的会话 .
  • 您可以将会话 ID 作为 JSESSSIONID 参数添加到链接中。
  • @T.J. - 我怎样才能做到这一点?因为我认为在新的 JSP 页面中默认会创建一个新的会话。?如果我错了,请纠正我。
  • @Amir - 那么我如何使用相同的会话 ID?
  • 您的浏览器是否启用了cookies?如果没有,那么您需要启用它们,或正确编码您的 URL。

标签: java jsp session-variables


【解决方案1】:

在我看来,无论出于何种原因,您的 JSP/servlet 引擎都希望对会话 ID 使用 URL 重写而不是使用 cookie。如果你使用encodeURL输出链接到second.jsp页面,例如:

<a href="<%=response.encodeURL("second.jsp")%>">second page</a>

...你应该会发现它最终变成了second.jsp;jsessionid=longstringhere

现在,您可以到处使用encodeURL,但我猜您更愿意使用cookie。您需要检查 JSP/servlet 引擎的配置。在 Tomcat 中,the default is to use cookies,但您可以检查您的 Context 元素以确保它没有 cookies="false" 或其他东西...

【讨论】:

  • 我用过 - &lt;a href="&lt;%=response.encodeURL("http://localhost:8080/auto/second.jsp")%&gt;" target="content"&gt;click here!!&lt;/a&gt; 但没有运气。它重定向到 second.jsp 但没有 longstringhere 被添加到 second.jsp url :(
  • @anujin:为什么会有完全合格的路径?它在不同的服务器上吗?如果它在不同的服务器上,这就是创建新会话的原因。如果不是,请使用 相对 URL。
猜你喜欢
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多