将带有查询的链接作为get请求的参数

时间:2014-01-07 16:47:51

标签: java tomcat servlets

所以基本上我正在尝试创建一个非常简单的服务器,其中包含一个包含要存储的链接的请求,但我的问题是,如果该链接包含带有&的查询,那么一切都超过&未存储,因为服务器认为它是查询中完全不同的参数。我将用一个例子清楚这一点,但首先是代码:

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,因为&在网址中。我希望这是有道理的。我问的是我怎么能解决这个问题,因为我不完全确定。任何见解都是有帮助的,谢谢。

2 个答案:

答案 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编码库传递整个值来捕获可能出现的任何其他流氓字符。