所以基本上我正在尝试创建一个非常简单的服务器,其中包含一个包含要存储的链接的请求,但我的问题是,如果该链接包含带有&的查询,那么一切都超过&未存储,因为服务器认为它是查询中完全不同的参数。我将用一个例子清楚这一点,但首先是代码:
package com.something.tomcatServer;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class javaQuery extends HttpServlet {
String storedId = null;
public void storeId(String u){
storedId = u;
}
public String retrieveId(){
return storedId;
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String request = req.getParameter("request");
if(request.equalsIgnoreCase("sendId")){
String url = req.getParameter("id");
if(url != null){
storeId(url);
}else{
resp.getWriter().println("ERROR: No ID was inputted to store for the sendId request.");
}
}else if(request.equalsIgnoreCase("retrieveId")){
String retrievedId = retrieveId();
resp.getWriter().println(retrievedId);
}
}
}
所以基本上在doGet中它说有两种请求类型“sendId”和“retrieveId”。 “retrieveId”工作得很好,它只检索最后存储的URL,但sendId在这种情况下不起作用:
示例:localhost:8080 / javaQuery?request = sendId& url = http://m.yahoo.com/?.tsrc=yahoo&mobile_view_default=true,
现在如果我做localhost:8080 / javaQuery?request = retrieveId 它只会输出http://m.yahoo.com/?.tsrc=yahoo,因为&在网址中。我希望这是有道理的。我问的是我怎么能解决这个问题,因为我不完全确定。任何见解都是有帮助的,谢谢。
答案 0 :(得分:2)
您必须对其进行编码,以便将要传递的网址正确解释为传递的单个值,而不是几个不同的值。
这应该让你开始......
import java.net.URLEncoder;
try {
URLEncoder.encode(YOUR_URL_HERE, "UTF-8")
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
答案 1 :(得分:1)
您的服务器可能(我没有看过代码)表现良好。您的问题是尝试执行URL格式无效的操作。 URL中的“特殊”字符需要进行编码,除非它们被用于“特殊”角色。您的&
值中的?
(以及此url=
}需要进行网址编码。天真地这意味着分别用%26
和%3F
替换它们,但是你应该通过URL编码库传递整个值来捕获可能出现的任何其他流氓字符。