Servlet的sendRedirect()会终止我的会话属性

Joe*_*lum 9 java session attributes servlets

我正在使用WinXP,Eclipse Indigo和Google web插件中的webapp.

我有一个简单的表单,从用户(例如电子邮件)获取值,将其传递给名为SignIn.java处理它的servlet并将电子邮件值保存到会话.该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);
Run Code Online (Sandbox Code Playgroud)

到目前为止一切顺利,我已经证实这些数值不是null在这一点上.现在出现了问题,我想重定向到ShowOnline.java需要进行更多处理的另一个servlet().当我写作

resp.sendRedirect(resp.encodeRedirectURL("/ShowOnlineServlet")); 
Run Code Online (Sandbox Code Playgroud)

ShowOnline获取null会话值(我之前保存的第二个相同的电子邮件属性null)

当我写作

getServletConfig().getServletContext().getRequestDispatcher("/ShowOnlineServlet");
Run Code Online (Sandbox Code Playgroud)

一切都好,以前的邮件属性不是null!

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

为什么sendRedirect()和之间会有区别forward()?简单的解决方案是使用,forward()但我想在我放手之前了解这一点,我认为了解发生的事情对我来说很重要.我不确定我喜欢不知道这些基本概念发生了什么的想法(因为我是初学者,我的整个webapp在这一点上非常简单和基本).

任何想法的想法或建议都将受到热烈欢迎!

Jam*_*ett 1

如果您的servlet 仅保存请求参数(电子邮件),那么您也可以用过滤器SignIn替换 servlet ,例如。SignInFilter

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

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'

}
Run Code Online (Sandbox Code Playgroud)

将表单设置为 POST 到ShowOnlineservlet,并将新的 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>
Run Code Online (Sandbox Code Playgroud)