【问题标题】:Servlet cookies not working properlyServlet cookie 无法正常工作
【发布时间】:2013-09-20 12:11:48
【问题描述】:

我有一个登录 servlet,我在其中接收电子邮件和密码并将它们定向到 logincheck servlet。我已经设计了我的 logincheck servlet,如果提交表单并填写每个字段,cookie 将设置为相应的输入值,但如果电子邮件和密码字段留空,则 cookie 值设置为空白,我们得到指示返回登录 servlet。

当我提交未填写表单而不是重定向到登录页面时,我被重定向到一个错误页面,其描述为“请求的源不可用”。请帮忙。

package newpackage;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class logincheck extends HttpServlet {

  protected void processRequest(HttpServletRequest request, HttpServletResponse  response)
        throws ServletException, IOException {


    //recieving form parameters
    String email=request.getParameter("email");
    String pass=request.getParameter("pass");

    //setting up cookies as a white field  if any credential has been left unfilled
    Boolean isMissingValue=false;
    if(email==null || email.trim().equals("")){
        email="";                                   //return white field as a cookie if the user doesnt enter anything and submits
        isMissingValue=true;
    }
    if(pass==null || pass.trim().equals("")){
        pass="";                                    //return white field as a cookie if the user doesnt enter anything and submits    
        isMissingValue=true;
    }

    //setting up cookies based on what the user entered last
    Cookie c1=new LongLivedCookie("email",email);
    response.addCookie(c1);
    Cookie c2=new LongLivedCookie("pass",pass);
    response.addCookie(c2);
    if(isMissingValue){
        RequestDispatcher obj=request.getRequestDispatcher("login.java");
        obj.forward(request,response);
    }
}
}

这是我的 LongLivedCookie 课程

package newpackage;

import javax.servlet.http.Cookie;

public class LongLivedCookie extends Cookie {

public static final int seconds_per_year=60*60*25*365;

public LongLivedCookie(String name, String value) {
    super(name,value);
    setMaxAge(seconds_per_year);
}
}

【问题讨论】:

    标签: java servlets cookies


    【解决方案1】:

    您没有正确实例化您的RequestDispather

    RequestDispatcher obj=request.getRequestDispatcher("login.java");
    

    RequestDispatcher 的 java 文档声明它

    定义一个对象,该对象接收来自客户端的请求并将它们发送到服务器上的任何资源(例如servlet、HTML 文件或 JSP 文件)。

    因此,将login.java 作为目标资源传递是不正确的。它希望您提供到现有 servlet 或 JSP 资源的正确路径。例如,如果您的Login 页面是一个 JSP 转发为

    RequestDispatcher view = request.getRequestDispatcher("login.jsp");
    view.forward(request, response);
    

    对于 servlet,RequestDispatcher 需要正确的 URL 模式。因此,如果您的 Login 页面是一个 servlet,请检查其在 web.xml 中指定的 <url-pattern> 并转发为

    RequestDispatcher view = request.getRequestDispatcher("/Login");
    

    另请注意,RequestDispatcher 可以从 ServletRequestServletContext 中检索,不同之处在于前者也可以采用 相对路径 .

    参考
    http://docs.oracle.com/javaee/5/api/javax/servlet/RequestDispatcher.html

    【讨论】:

      【解决方案2】:

      根据您的代码和描述,我假设您期望 cookie 值作为请求参数。但是 cookie 不能以这种方式工作。要获取 cookie 值,您必须使用 HttpRequest.getCookies() 方法并读取值。

      Cookies[] cookies = request.getCookies();
      for (Cookie cookie : cookies) {
          if (cookie.getName().equals("email")) {
               ;//logic here
          } else if (cookie.getName().equals("pass")) {
               ;//logic here.
          }
      }
      

      【讨论】:

      • 我的这段代码只将cookie发送给客户端。您所建议的是您阅读 cookie 的部分。我向您保证,我有另一个类,其代码与您建议的类似,我从客户端读取 cookie
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      相关资源
      最近更新 更多