Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 混淆了在HttpClient中创建cookie的不同方法_Java_Cookies_Struts2_Apache Commons Httpclient - Fatal编程技术网

Java 混淆了在HttpClient中创建cookie的不同方法

Java 混淆了在HttpClient中创建cookie的不同方法,java,cookies,struts2,apache-commons-httpclient,Java,Cookies,Struts2,Apache Commons Httpclient,在HttpClient中创建cookie有不同的方法,我不知道哪种方法最好。 我需要创建、检索和修改cookies 例如,我可以使用以下代码查看cookie列表并修改它们,但如何创建它们 这是检索它们的正确方法吗?我需要它们在所有班级都可以使用 另外,我发现的方法通常需要httpresponse、httprequest对象将cookie发送到浏览器,但如果我不想使用它们,该怎么办 代码 import org.apache.commons.httpclient.Cookie; import o

在HttpClient中创建cookie有不同的方法,我不知道哪种方法最好。 我需要创建、检索和修改cookies

例如,我可以使用以下代码查看cookie列表并修改它们,但如何创建它们

这是检索它们的正确方法吗?我需要它们在所有班级都可以使用

  • 另外,我发现的方法通常需要httpresponse、httprequest对象将cookie发送到浏览器,但如果我不想使用它们,该怎么办
代码

import org.apache.commons.httpclient.Cookie;
import org.apache.commons.httpclient.HttpState;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;

public class GetCookiePrintAndSetValue {

  public static void main(String args[]) throws Exception {

    HttpClient client = new HttpClient();
    client.getParams().setParameter("http.useragent", "My Browser");

    GetMethod method = new GetMethod("http://localhost:8080/");
    try{
      client.executeMethod(method);
      Cookie[] cookies = client.getState().getCookies();
      for (int i = 0; i < cookies.length; i++) {
        Cookie cookie = cookies[i];
        System.err.println(
          "Cookie: " + cookie.getName() +
          ", Value: " + cookie.getValue() +
          ", IsPersistent?: " + cookie.isPersistent() +
          ", Expiry Date: " + cookie.getExpiryDate() +
          ", Comment: " + cookie.getComment());

        cookie.setValue("My own value");
      }
      client.executeMethod(method);
    } catch(Exception e) {
      System.err.println(e);
    } finally {
      method.releaseConnection();
    }
  }
}
输出如下,但不会创建cookie

SEVERE: Creating the cookie
SEVERE: cookie
场景

1)User has access to a form to search for products (example.com/Search/Products)
2)User fills up the form and submit it to class Search
3)Form will be submitted to Search class 
4)Method Products of Search class returns and shows the description of product        
  (example.com/Search/Products)
5)User clicks on "more" button for more description about product 
6)Request will be sent to Product class (example.com/Product/Description?id=4)
7)User clicks on "add to cookie" button to add the product id to the cookie 

Product class is subclasse of another class. So it can not extend any more class.

在第二个示例中,您正在创建一个新的客户端cookie(即,您正在模拟浏览器并将cookie发送到服务器)

这意味着您需要提供所有相关信息,以便客户端可以决定是否将cookie发送到服务器

在代码中,您正确设置了路径、名称和值,但缺少信息

org.apache.commons.httpclient.Cookie cookie 
  = new org.apache.commons.httpclient.Cookie();
cookie.setDomain("localhost");
cookie.setPath("/");
cookie.setName("Tim");
cookie.setValue("Tim");
如果您试图实现的是将cookie发送到http服务器,则此功能有效

但是,您的第二个示例来自
execute
方法,因为您在标记中暗示struts2,所以包含它的类可能是struts2
Action

如果是这种情况,您试图实现的是向浏览器发送一个新的cookie

第一种方法是获得一个
HttpServletResponse
,如下所示:

因此,您的
操作必须如下所示:

public class SetCookieAction 
    implements ServletResponseAware  // needed to access the 
                                     // HttpServletResponse
{

    HttpServletResponse servletResponse;

    public String execute() {
        // Create the cookie
        Cookie div = new Cookie("Tim", "Tim");
        div.setMaxAge(3600); // lasts one hour 
        servletResponse.addCookie(div);
        return "success";
    }


    public void setServletResponse(HttpServletResponse servletResponse) {
        this.servletResponse = servletResponse;
    }

}
另一种方法(没有HttpServletResponse
)可以使用

struts.xml中启用它

<action ... >
  <interceptor-ref name="defaultStack"/>
  <interceptor-ref name="cookieProvider"/>
  ...
</action>
(感谢@RomanC指出此解决方案)

如果您随后需要阅读,您有两个选择:

  • 操作中实现
    ServletRequestAware
    ,并从
    HttpServletRequest
  • 引入
    CookieInterceptor
    并在
    操作中实施
    CookieAware
    ,方法
    setCookieMap
    允许读取Cookie
在这里您可以找到一些相关信息:


首先,您可能不想使用HttpClient,它是一个客户端(例如,模拟浏览器),而不是一个服务器(可以创建cookies,用户的浏览器将存储cookies)

也就是说,我首先要解释在您的第一个代码示例中发生了什么:

  • 向服务器发送GET请求
  • 服务器在响应(内容)的同时向您发送一些cookie
  • 您可以修改HttpClient实例中的cookie
  • 您将这些cookie发送回服务器
  • 服务器如何处理更改后的cookie完全取决于该服务器的编程功能
  • 在下一个请求中,服务器可能会将这些更改后的cookie发送回您或不发送回您,正如我allraedy所说的,这取决于它的编程功能
至于你的第二个例子:

  • 你创建了一个cookie
  • 您在cookie上设置了一些信息
  • 将cookie发送到服务器(在GET请求中)
  • 服务器现在对您的cookie进行编程处理服务器可能会忽略您的cookie(例如,不会将其发送回您)
另一方面您可能想做的是编写一个web应用程序(例如服务器端),它创建cookie并根据客户端的输入(浏览器)进行更改

为此,您可以使用Servlet API。大致如下:

javax.servlet.http.Cookie cookie = new 
    javax.servlet.http.Cookie("your cookie's name", "your cookie's value");
//response has type javax.servlet.http.HttpServletResponse
response.addCookie(cookie);
创建web应用程序超出了简单的stackoverflow答案的范围,但是web上有很多很好的教程

如果用户应该使用浏览器查看您的产品,那么创建web应用程序是没有办法的。创建一个不同的框架有不同的方法。servlet API(例如
HttpServletResponse
HttpServletResponse
)是最基本的API


我想说,它(servlet API)也是用java解决这个确切问题的最容易的方法,尽管使用web应用程序并不容易。

我添加了setDomain并将其更改为localhost,localhost:8080,但都不起作用。对于您提供的代码,答案应该行得通(我把测验贴在了网上)。我想知道如何验证cookie是否正确发送(可能Struts2标记引用了服务器应用程序?)。问题是如何使用Struts2向客户端发送cookie,或者如何使用commons httpclient向服务器发送自定义cookie?@CarloPellegrini那么你应该在回答中解释,而不是在评论中解释。@RomanC我相信我已经做过了。无论如何,我编辑答案是为了强调信息。@CarloPellegrini但你错了,cookie provider interceptor呢?你需要创建一个CookieStore,并在每次发出请求时将其设置为上下文。就像这样。。
public class SetCookieAction 
    implements CookieProvider  // needed to provide the coookies
{

    Set<javax.servlet.http.Cookie> cookies=
            new HashSet<javax.servlet.http.Cookie>();

    public Set<javax.servlet.http.Cookie> getCookies() 
    {
            return cookies;
    }

    public String execute() {
        // Create the cookie
        javax.servlet.http.Cookie div = 
                new javax.servlet.http.Cookie("Tim", "Tim");
        div.setMaxAge(3600); // lasts one hour 
        cookies.put(cookie)
        return "success";
    }

}
javax.servlet.http.Cookie cookie = new 
    javax.servlet.http.Cookie("your cookie's name", "your cookie's value");
//response has type javax.servlet.http.HttpServletResponse
response.addCookie(cookie);