【发布时间】:2018-11-19 05:10:19
【问题描述】:
将 HTTP Post 请求中的查询字符串和 JSON 正文发送到服务器是可能的,这是我已经理解的。为此,我们需要重写 HttpServletRequestWrapper 类的 getReader 和 getInputstream 方法。我已经按照link 中的研究进行了此操作。在 Stack Overflow 中也看到了类似的答案。
所以现在我有一个没有正文的登录操作,只有查询字符串参数传入。当我尝试阅读它们时,它给了我 null 作为 getParameter() 的输出。在我的包装中,我打印了捕获的正文,它正确显示了从客户端机器接收到的正确数据。
读取未包装的 HttpRequest 时使用的查询字符串 (getParameter()) 和 JSON 正文 (gson.fromJson) 的简单方法也可以用于包装的 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()));
}
【问题讨论】:
-
终于自己找到了答案。更新答案
标签: java servlets wrapper servlet-filters