如何保持 Servlet 会话? [英] How to keep a Servlet session?

查看:48
本文介绍了如何保持 Servlet 会话?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我编写了一个简单的 servlet,我想对其进行测试,以便在我刷新浏览器时保留旧会话.但是,它并不是每次刷新页面时都会创建一个新会话.只有当我关闭浏览器时才应该创建一个新会话吗?我正在使用 ServletRunner 而不是在 Tomcat 上运行它,这可能是问题吗?

import java.io.*;导入 javax.servlet.*;导入 javax.servlet.http.*;公共类 SessionPlay 扩展了 HttpServlet{public void doGet (HttpServletRequest req, HttpServletResponse resp)抛出 ServletException、IOException{resp.setContentType("text/html");//获取会话对象HttpSession session = req.getSession(true);String id = session.getId();PrintWriter 出;String title = "会话播放";//然后写入响应的数据out = resp.getWriter();out.println("");out.println(标题);out.println(id);out.println("</title></head><body>");out.println("<h1>" + title + "</h1>");如果(会话.isNew()){out.println("<p>欢迎新人</p>");out.println("<p>" + id + "</p>");}别的{out.println("<p>欢迎回来</p>");out.println("<p>" + id + "</p>");}out.println("<form action=SessionPlay method=get>");out.println("<输入类型=输入名称=参数1>");out.println("<输入类型=提交>");out.println("</form>");out.println("</body></html>");关闭();}}</code></pre><p></p><div class="h2_lin"> 解决方案 </div><p>会话由 cookie 维护.当在服务器中创建一个新会话时,它会将一个 cookie 添加到客户端应该在同一会话中的所有后续请求中发回的响应中.</p><p>但是,您显然是通过按 F5 或浏览器中的刷新按钮来刷新<strong>初始</strong>请求.初始请求不包含会话 cookie.如果您在 HTML 中添加指向页面本身或同一站点上其他页面的链接并单击它,您将看到会话将保持不变.</p><p>解决这个问题的方法之一是创建一个过滤器,在创建会话时进行重定向.</p><小时><p><strong>更新</strong>:cookies 是可禁用的,并且取决于主机和上下文.您需要确保在网络服务器(例如 Tomcat <code><Context></code> 没有 <code>cookies="false"</code>)和网络浏览器(在设置中的某处)和主机名不是 Intranet 域(某些浏览器不允许在裸主机名上使用 cookie)并且它提交到相同的上下文(webapp 上下文名称).有关如何调试 cookie 的提示,请参阅 <a href="https://stackoverflow.com/questions/2951673/how-do-you-inspect-your-own-session-hash-when-visiting-a-website/2951698#2951698">这个答案</a>.</p><小时><p>与问题无关,在 servlet 中发出 HTML 不是最佳实践.这项工作将由一个 JSP 文件来完成.在完成所有必要的 Java 代码操作后,使用 <code>RequestDispatcher#forward()</code> 将请求转发到 JSP 文件.</p><p>I have written a simple servlet which I want to test so the old session is kept when I refresh the browser. However it doesn't instead it is creating a new session every time I refresh the page. Isn't it supposed to create a new session only when I close the browser?
I'm using ServletRunner instead of running it on Tomcat, can that be the problem?</p><pre><code>import java.io.*;

import javax.servlet.*;
import javax.servlet.http.*;

public class SessionPlay extends HttpServlet
{
   public void doGet (HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException
   {

      resp.setContentType("text/html");

      //Get session object
      HttpSession session = req.getSession(true);

      String id = session.getId();


      PrintWriter out;
      String title = "Session play";



      // then write the data of the response
      out = resp.getWriter();

      out.println("<html><head><title>");
      out.println(title);
      out.println(id);
      out.println("</title></head><body>");
      out.println("<h1>" + title + "</h1>");

      if(session.isNew())
      {
         out.println("<p>Welcome new comer</p>");
         out.println("<p>" + id + "</p>");
      }
      else
      {
         out.println("<p>Welcome back</p>");
         out.println("<p>" + id + "</p>");
      }

      out.println("<form action=SessionPlay method=get>");
      out.println("<input type=input name=param1>");
      out.println("<input type=submit>");
      out.println("</form>");

      out.println("</body></html>");
      out.close();

   }
}
</code></pre><p>
</p><div class="h2_lin"> 解决方案 </div><p>Sessions are maintained by cookies. When a new session is created in server, it will add a cookie to the response which the client is supposed to send back in all subsequent requests in the same session.</p>

<p>However, you're apparently refreshing the <strong>initial</strong> request by pressing F5 or refresh button in browser. The initial request doesn't contain the session cookie. If you add a link in the HTML which points to the page itself or another page on the same site and click it, you'll see that the session will just be maintained.</p>

<p>One of the ways to go around this is creating a filter which does a redirect when the session is been created.</p>

<hr>

<p><strong>Update</strong>: cookies are disableable and host and context dependent. You need to ensure that cookies are enabled in both webserver (e.g. Tomcat <code><Context></code> doesn't have <code>cookies="false"</code>) and webbrowser (somewhere in settings) and that the hostname is not an intranet domain (some browsers disallow cookies on naked hostnames) and that it is submitting to the same context (the webapp context name). For hints how to debug cookies, see <a href="https://stackoverflow.com/questions/2951673/how-do-you-inspect-your-own-session-hash-when-visiting-a-website/2951698#2951698">this answer</a>.</p>

<hr>

<p>Unrelated to the problem, emitting HTML in a servlet is not the best practice. This job is to be done by a JSP file. Use <code>RequestDispatcher#forward()</code> to forward the request to a JSP file after doing all the necessary Java code actions.</p>

                        <p>这篇关于如何保持 Servlet 会话?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!</p>
                        
                    </div>
                    <div class="arc-body-main-more">
                        <span onclick="unlockarc('2403353');">查看全文</span>
                    </div>
                </div>
				<div>
                            
                        </div>
                <div class="wwads-cn wwads-horizontal" data-id="166" style="max-width:100%;border: 4px solid #666;"></div>
            </div>
        </article>
        <div id="arc-ad-2" class="mb-1">
            <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-5038752844014834"
     crossorigin="anonymous"></script>
<ins class="adsbygoogle"
     style="display:block"
     data-ad-format="autorelaxed"
     data-ad-client="ca-pub-5038752844014834"
     data-ad-slot="3921941283"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>

        </div>
        <div class="widget bgwhite radius-1 mb-1 shadow widget-rel">
            <h5>相关文章</h5>
            <ul>
                    <li>
                        <a target="_blank" title="Servlet会话超时" href="/990818.html">
                            Servlet会话超时;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="Servlet会话无效" href="/978034.html">
                            Servlet会话无效;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="如何保持会话活跃" href="/1342976.html">
                            如何保持会话活跃;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="如何验证/无效会话jsp/servlet?" href="/1517832.html">
                            如何验证/无效会话jsp/servlet?;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="TChromium:如何保持会话存活" href="/1996206.html">
                            TChromium:如何保持会话存活;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="JSch:如何保持会话活跃" href="/2676646.html">
                            JSch:如何保持会话活跃;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="保持 LDAP 会话" href="/2833111.html">
                            保持 LDAP 会话;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="保持LDAP会话" href="/1548133.html">
                            保持LDAP会话;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="如何禁用默认的servlet容器会话?" href="/1000442.html">
                            如何禁用默认的servlet容器会话?;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="如何保持Web窗体的会话" href="/1340450.html">
                            如何保持Web窗体的会话;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="如何在Android中保持会话?" href="/104249.html">
                            如何在Android中保持会话?;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="如何保持Android的登录会话" href="/159664.html">
                            如何保持Android的登录会话;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="Java servlet  - 会话清理(HttpServletRequest)" href="/992129.html">
                            Java servlet  - 会话清理(HttpServletRequest);
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="JSP Servlet会话invalidate()不会使会话为空" href="/1516959.html">
                            JSP Servlet会话invalidate()不会使会话为空;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="如何保持会话和饼干的WebRequest?" href="/254962.html">
                            如何保持会话和饼干的WebRequest?;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="Spring React 和 Sessions .. 如何保持会话" href="/2406882.html">
                            Spring React 和 Sessions .. 如何保持会话;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="SQLAlchemy 会话:如何让它保持活力?" href="/2403254.html">
                            SQLAlchemy 会话:如何让它保持活力?;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="如何通过UCMA保持IM会话存活" href="/1245129.html">
                            如何通过UCMA保持IM会话存活;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="如何在代码中保持会话超时。" href="/1214837.html">
                            如何在代码中保持会话超时。;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="JSch:如何保持会话活跃起来" href="/964508.html">
                            JSch:如何保持会话活跃起来;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="如何使 RTSP 会话保持活动状态?" href="/2382257.html">
                            如何使 RTSP 会话保持活动状态?;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="如何保持NodeJS Passport会话的生命" href="/2072863.html">
                            如何保持NodeJS Passport会话的生命;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="在Logout Servlet中使会话无效" href="/972597.html">
                            在Logout Servlet中使会话无效;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="使用jQuery获取Servlet会话属性" href="/1107204.html">
                            使用jQuery获取Servlet会话属性;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="访问servlet外部的会话变量" href="/987590.html">
                            访问servlet外部的会话变量;
                        </a>
                    </li>
            </ul>
        </div>
        <div class="mb-1">
            <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-5038752844014834"
     crossorigin="anonymous"></script>
<ins class="adsbygoogle"
     style="display:block"
     data-ad-format="autorelaxed"
     data-ad-client="ca-pub-5038752844014834"
     data-ad-slot="3921941283"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>

        </div>
    </div>
    <div class="side">
        <div class="widget widget-side bgwhite mb-1 shadow">
            <h5>其他开发最新文章</h5>
            <ul>
                    <li>
                        <a target="_blank" title="拒绝显示一个框架,因为它将'X-Frame-Options'设置为'sameorigin'" href="/893060.html">
                            拒绝显示一个框架,因为它将'X-Frame-Options'设置为'sameorigin';
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="什么是&QUOT; AW&QUOT;在部分标志属性是什么意思?" href="/303988.html">
                            什么是&QUOT; AW&QUOT;在部分标志属性是什么意思?;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="在运行npm install命令时获取'npm WARN弃用'警告" href="/840917.html">
                            在运行npm install命令时获取'npm WARN弃用'警告;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="cmake无法找到openssl" href="/516280.html">
                            cmake无法找到openssl;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="从Spark的scala中的* .tar.gz压缩文件中读取HDF5文件" href="/850628.html">
                            从Spark的scala中的* .tar.gz压缩文件中读取HDF5文件;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="Twitter :: Error :: Forbidden  - 无法验证您的凭据" href="/630061.html">
                            Twitter :: Error :: Forbidden  - 无法验证您的凭据;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="我什么时候需要一个fb:app_id或者fb:admins?" href="/747981.html">
                            我什么时候需要一个fb:app_id或者fb:admins?;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="将.db文件导入R" href="/902960.html">
                            将.db文件导入R;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="npm通知创建一个lockfile作为package-lock.json。你应该提交这个文件" href="/744854.html">
                            npm通知创建一个lockfile作为package-lock.json。你应该提交这个文件;
                        </a>
                    </li>
                    <li>
                        <a target="_blank" title="拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script-src'self'”" href="/819167.html">
                            拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script-src'self'”;
                        </a>
                    </li>
            </ul>
        </div>
        <div class="widget widget-side bgwhite mb-1 shadow">
            <h5>
                热门教程
            </h5>
            <ul>
                <li>
                    <a target="_blank" title="Java教程" href="/OnLineTutorial/java/index.html">
                        Java教程
                    </a>
                </li>
                <li>
                    <a target="_blank" title="Apache ANT 教程" href="/OnLineTutorial/ant/index.html">
                        Apache ANT 教程
                    </a>
                </li>
                <li>
                    <a target="_blank" title="Kali Linux教程" href="/OnLineTutorial/kali_linux/index.html">
                        Kali Linux教程
                    </a>
                </li>
                <li>
                    <a target="_blank" title="JavaScript教程" href="/OnLineTutorial/javascript/index.html">
                        JavaScript教程
                    </a>
                </li>
                <li>
                    <a target="_blank" title="JavaFx教程" href="/OnLineTutorial/javafx/index.html">
                        JavaFx教程
                    </a>
                </li>
                <li>
                    <a target="_blank" title="MFC 教程" href="/OnLineTutorial/mfc/index.html">
                        MFC 教程
                    </a>
                </li>
                <li>
                    <a target="_blank" title="Apache HTTP客户端教程" href="/OnLineTutorial/apache_httpclient/index.html">
                        Apache HTTP客户端教程
                    </a>
                </li>
                <li>
                    <a target="_blank" title="Microsoft Visio 教程" href="/OnLineTutorial/microsoft_visio/index.html">
                        Microsoft Visio 教程
                    </a>
                </li>
            </ul>
        </div>
        <div class="widget widget-side bgwhite mb-1 shadow">
            <h5>
                热门工具
            </h5>
            <ul>
                
                <li>
                    <a target="_blank" title="Java 在线工具" href="/Onlinetools/details/4">
                        Java 在线工具
                    </a>
                </li>
                <li>
                    <a target="_blank" title="C(GCC) 在线工具" href="/Onlinetools/details/6">
                        C(GCC) 在线工具
                    </a>
                </li>
                <li>
                    <a target="_blank" title="PHP 在线工具" href="/Onlinetools/details/8">
                        PHP 在线工具
                    </a>
                </li>
                <li>
                    <a target="_blank" title="C# 在线工具" href="/Onlinetools/details/1">
                        C# 在线工具
                    </a>
                </li>
                <li>
                    <a target="_blank" title="Python 在线工具" href="/Onlinetools/details/5">
                        Python 在线工具
                    </a>
                </li>
                <li>
                    <a target="_blank" title="MySQL 在线工具" href="/Onlinetools/Dbdetails/33">
                        MySQL 在线工具
                    </a>
                </li>
                <li>
                    <a target="_blank" title="VB.NET 在线工具" href="/Onlinetools/details/2">
                        VB.NET 在线工具
                    </a>
                </li>
                <li>
                    <a target="_blank" title="Lua 在线工具" href="/Onlinetools/details/14">
                        Lua 在线工具
                    </a>
                </li>
                <li>
                    <a target="_blank" title="Oracle 在线工具" href="/Onlinetools/Dbdetails/35">
                        Oracle 在线工具
                    </a>
                </li>
                <li>
                    <a target="_blank" title="C++(GCC) 在线工具" href="/Onlinetools/details/7">
                        C++(GCC) 在线工具
                    </a>
                </li>
                <li>
                    <a target="_blank" title="Go 在线工具" href="/Onlinetools/details/20">
                        Go 在线工具
                    </a>
                </li>
                <li>
                    <a target="_blank" title="Fortran 在线工具" href="/Onlinetools/details/45">
                        Fortran 在线工具
                    </a>
                </li>
            </ul>
        </div>
        
    </div>
</div>
<script type="text/javascript">var eskeys = '如何,保持,servlet,会话'; var cat = 'cc';';//other-dev</script>
    </div>
<div id="pop" onclick="pophide();">
    <div id="pop_body" onclick="event.stopPropagation();">
        <h6 class="flex flex101">
            登录
            <span onclick="pophide();">关闭</span>
        </h6>
        <div class="pd-1">
            <div class="wxtip center">
                <span>扫码关注<em>1秒</em>登录</span>
            </div>
            <div class="center">
                <img id="qr" src="https://huajiakeji.com/Content/Images/qrydx.jpg" alt="" style="width:150px;height:150px;" />
            </div>
            <div style="margin-top:10px;display:flex;justify-content: center;">
                <input type="text" placeholder="输入验证码" id="txtcode" autocomplete="off" />
                <input id="btngo" type="button" onclick="chk()" value="GO" />
            </div>
            <div class="center" style="margin: 4px; font-size: .8rem; color: #f60;">
                发送“验证码”获取
                <em style="padding: 0 .5rem;">|</em>
                <span style="color: #01a05c;">15天全站免登陆</span>
            </div>
            <div id="chkinfo" class="tip"></div>
        </div>
    </div>
</div>    <script type="text/javascript" src="https://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js"></script>
<script type="text/javascript" src="https://cdn.bootcss.com/jquery-cookie/1.4.1/jquery.cookie.min.js"></script>
<script type="text/javascript" src="https://img01.yuandaxia.cn/Scripts/highlight.min.js"></script>
<script type="text/javascript" src="https://img01.yuandaxia.cn/Scripts/base.js?v=0.22"></script>
<script type="text/javascript" src="https://img01.yuandaxia.cn/Scripts/tui.js?v=0.11"></script>
<footer class="footer">
    <div class="container">
		<div class="flink mb-1">
			友情链接:
            <a href="https://www.it1352.com/" target="_blank">IT屋</a>
            <a href="https://huajiakeji.com/" target="_blank">Chrome插件</a>
            <a href="https://www.cnplugins.com/" target="_blank">谷歌浏览器插件</a>
        </div>
        <section class="copyright-section">
            <a href="https://www.it1352.com" title="IT屋-程序员软件开发技术分享社区">IT屋</a>
            ©2016-2022 <a href="http://www.beian.miit.gov.cn/" target="_blank">琼ICP备2021000895号-1</a>
            <a href="/sitemap.html" target="_blank" title="站点地图">站点地图</a>
            <a href="/Home/Tags" target="_blank" title="站点标签">站点标签</a>
            <a target="_blank" alt="sitemap" href="/sitemap.xml">SiteMap</a>
            <a href="/1155981.html" title="IT屋-免责申明"><免责申明></a>
            本站内容来源互联网,如果侵犯您的权益请联系我们删除.
        </section>
        
<!--统计代码-->
<script type="text/javascript">
    var _hmt = _hmt || [];
    (function() {
      var hm = document.createElement("script");
      hm.src = "https://hm.baidu.com/hm.js?0c3a090f7b3c4ad458ac1296cb5cc779";
      var s = document.getElementsByTagName("script")[0]; 
      s.parentNode.insertBefore(hm, s);
    })();
</script>
<script type="text/javascript">
    (function () {
        var bp = document.createElement('script');
        var curProtocol = window.location.protocol.split(':')[0];
        if (curProtocol === 'https') {
            bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
        }
        else {
            bp.src = 'http://push.zhanzhang.baidu.com/push.js';
        }
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(bp, s);
    })();
</script>
    </div>
</footer>
</body>
</html>