gpt4 book ai didi

java - Servlet 的 sendRedirect() 杀死了我的 session 属性

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:26:25 24 4
gpt4 key购买 nike

我正在 WinXP、Eclipse Indigo 和 Google 网络插件中开发网络应用。

我有一个简单的表单,它从用户那里获取一个值(例如电子邮件),将其传递给一个名为 SignIn.java 的 servlet,该 servlet 对其进行处理并将电子邮件值保存到 session 中。SignIn 代码非常简单,下面是它的 doGet 主要做的事情:

String email = req.getParameter("email");   //getting the parameter from html form
...
...
HttpSession session = req.getSession(); //create a new session
session.setAttribute("email", email);

到目前为止一切顺利,我已经验证了此时值不是 null。现在问题来了,我想重定向到另一个需要做更多处理的 servlet (ShowOnline.java)。当我写作时

resp.sendRedirect(resp.encodeRedirectURL("/ShowOnlineServlet")); 

ShowOnline 获取 null session 值(我之前保存的同一电子邮件属性现在是 null)

当我写作时

getServletConfig().getServletContext().getRequestDispatcher("/ShowOnlineServlet");

一切正常,之前的 email 属性不是 null!

这是怎么回事? sendRedirect() 只是让您的浏览器发送一个新请求,它不应该影响 session 范围。我已经检查了 cookie,它们很好(这肯定是之前的同一个 session ,因为它是我的 webapp 创建的第一个也是唯一一个 session ,而且我什至打扰并检查了 sesison ID,它们在两个请求中都是相同的) .

为什么 sendRedirect()forward() 会有区别?简单的解决方案是使用 forward() 但我想在我放手之前弄清楚这个问题,我认为了解发生的事情对我来说很重要。我不确定我是否喜欢不知道这些基本概念是怎么回事的想法(我的整个网络应用程序在这一点上非常简单和基础,因为我是初学者)。

热烈欢迎任何想法或建议!

最佳答案

如果您的SignIn servlet 只保存一个请求参数(电子邮件),那么您也可以用filter 替换该servlet。 ,例如登录过滤器

SignInFilter 将包含与您的 SignIn servlet 相同的逻辑(将电子邮件从请求参数复制到 session ),但会调用链中的下一项 (这将是您的 ShowOnline servlet)而不是做任何重定向/转发。

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 
throws IOException, ServletException {

HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession();

String email = req.getParameter("email");
session.setAttribute("email", email);

chain.doFilter(req, res); // continue to 'ShowOnline'

}

将表单设置为 POST 到 ShowOnline servlet,并将新的 SignInFilter 配置为在 ShowOnline 之前执行(为简洁起见,下面省略了 servlet 映射)。

<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">

<filter>
<filter-name>SignInFilter</filter-name>
<filter-class>com.example.SignInFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SignInFilter</filter-name>
<url-pattern>/ShowOnline</url-pattern>
</filter-mapping>
</web-app>

关于java - Servlet 的 sendRedirect() 杀死了我的 session 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8029871/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com