将HTTP Post请求中的查询字符串和JSON正文发送到服务器是可能的,这是我已经理解的。为此,我们需要覆盖HttpServletRequest estWrapper类的getReader和getInputstream方法。我已经在本链接中进行了研究。在Stack Overflow中也看到了类似的答案。
所以现在我有一个登录操作,其中没有正文,只有post中的查询字符串params。当我试图读取它们时,getParameter()的输出为null。在我的包装器中,我打印了捕获的主体,它正确显示了从客户端机器接收到的正确数据。
读取查询字符串(获取参数()
)和 JSON 正文 (gson.fromJson) 的琐碎方法,这些方法在从未包装的 HttpRequest 读取时使用,也可以在包装的 HTTP 请求上使用吗?我在这里错过了什么?
servlet的POST方法
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("from doPost");
RequestWrapper wrappedrequest = new RequestWrapper(request);
request = wrappedrequest;
String action= request.getParameter("action");
if(action.equals("update")) {
Gson gson = new Gson();
Order cart = gson.fromJson(request.getReader(), Order.class);
CartDao dao= new CartDao(cart);
dao.addData();
}else if(action.equals("login")) {
loginDao ld = new loginDao(request);
int roleId = ld.authenticate();
if(roleId!=-1) {
System.out.println("Role ID Got is "+ roleId);
HttpSession session = ld.loadSession(roleId);
System.out.println("Init page for logging in user is = "+ session.getAttribute("initPage").toString());
CartDao dao= new CartDao();
JsonArray responseJson= dao.getOrderList();
request.setAttribute("ResponseJson", responseJson);
RequestDispatcher rq = request.getRequestDispatcher(session.getAttribute("initPage").toString());
rq.forward(request, response);
}else {
request.setAttribute("errmsg", "Invalid username/password");
RequestDispatcher rq = request.getRequestDispatcher("login.jsp");
rq.forward(request, response);
}
}else {
System.out.println("No Action");
}
}
请求包装器
public class RequestWrapper extends HttpServletRequestWrapper {
private String _body;
public RequestWrapper(HttpServletRequest request) throws IOException {
super(request);
_body = "";
BufferedReader bufferedReader = request.getReader();
String line;
while ((line = bufferedReader.readLine()) != null){
_body += line; //when i print this it shows proper data got from client machine
}
}
@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(_body.getBytes());
return new ServletInputStream() {
public int read() throws IOException {
return byteArrayInputStream.read();
}
@Override
public boolean isFinished() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isReady() {
// TODO Auto-generated method stub
return false;
}
@Override
public void setReadListener(ReadListener arg0) {
// TODO Auto-generated method stub
}
};
}
@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(this.getInputStream()));
}
最后我自己破解了这个。我所要做的就是读取查询字符串并将其保存在映射中,然后通过获取getParameter overriden方法中的键来返回值。主体通过读取输入流保存,并在调用重写的getReader时返回。这可以调用任意次数。:)虽然这很管用,但如果有人能详细解释一下为什么会管用,那就太好了。
具有魔力的星号代码如下所示,
public class RequestWrapper extends HttpServletRequestWrapper {
private String _body;
private String _queryString;
public RequestWrapper(HttpServletRequest request) throws IOException {
super(request);
_body = "";
BufferedReader bufferedReader = request.getReader();
String line;
while ((line = bufferedReader.readLine()) != null){
_body += line;
}
_queryString = request.getQueryString();
System.out.println(_body + _queryString);
}
}
问题内容: 从Java脚本的路径中删除查询字符串的简便方法是什么?我已经看到了使用window.location.search的Jquery插件。我不能这样做:在我的情况下,URL是从AJAX设置的变量。 问题答案: 一个简单的方法是: 对于那些还希望在不存在querystring的情况下删除哈希(不是原始问题的一部分)的人,需要做更多的工作: 编辑 @caub(最初为@crl)建议了一个更简单的
我有一个查询字符串,可以是: 编辑:参数值的长度可以大于2 有人知道在String.ReplaceAll([regex],[replace])中使用什么好的regex表达式吗?
问题内容: 我有一个HTTP客户端(目前)的Node.js应用程序。所以我在做: 这似乎是完成此任务的一种好方法。但是,我有些沮丧,我必须执行此步骤。这应该由一个公共库封装,但是我还没有看到它存在于node的库中,而且我不确定哪个标准的npm包可以完成它。有没有一种合理使用的更好的方法? url.format方法节省了构建自己的URL的工作。但理想情况下,请求的级别也应高于此级别。 问题答案: 检
如何从通过API网关提供的AWS Lambda函数中访问URL查询字符串参数? 我有两个API网关Lambda函数设置,所以我可以从公共URL调用它。我的Python函数很简单: 我已经配置了API的GET“方法请求”处理程序来传递“abc”querystring参数。 我还将API的GET“Integration Request”处理程序配置为从“method.Request.querystri
在Spring Boot控制器方法中,我可以将json post请求主体映射到POJO,例如。 我还可以将原始请求正文作为字符串检索: 我的问题是如何将请求体映射到POJO,并将原始请求体作为字符串检索(用于日志目的)。 谢谢
我有一个正在解析的JSON字符串,我想检索字段“pr_num”的值。我收到这个错误: 我的代码如下: 我想获取字段的值,它们是690052和null。 jsonString如下所述