Java 混淆了在HttpClient中创建cookie的不同方法
在HttpClient中创建cookie有不同的方法,我不知道哪种方法最好。 我需要创建、检索和修改cookies 例如,我可以使用以下代码查看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
- 另外,我发现的方法通常需要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,所以包含它的类可能是struts2Action
如果是这种情况,您试图实现的是向浏览器发送一个新的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);