用户输入一串内容,用POST提交到servlet中处理,后端接收不到内容


如标题,用户在输入了一串内容后(中文),用POST提交,结果到servlet里面转码时就丢失内容了。
servlet里面有写:
// 设置请求编码
req.setCharacterEncoding("UTF-8");

jsp里面也是有写:

<meta content="text/html; charset=utf-8"/>

用chrome F12查看也可以看到表单有提交内容,就是到servlet里面就丢失了。

求帮助

部分代码如下:


 @SuppressWarnings("unchecked")
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
        StringBuffer result = new StringBuffer();
        PrintWriter out = null;
        String method = null;
        try {
            // 设置不创建Session
            req.getSession(false);

            // 设置响应类型和编码
            res.setContentType("text/html; charset=UTF-8");

            // 设置请求编码
            req.setCharacterEncoding("UTF-8");
            // 到这个地方就不可以了 map里面就没有值了。。。-_-!~~
            logger.info("after map : " + JsonUtil.toJson(req.getParameterMap()));

            // 声明不缓存
            res.setHeader("Cache-Control", "no-cache");
            res.setHeader("Expires", "Thu, 01 Nov 2012 10:00:00 GMT");
            res.setHeader("Pragma", "no-cache");


            // 获取输出对象
            out = res.getWriter();

            // String version = ParamUtil.getParameter(req, "version", "2");
            method = ParamUtil.getParameter(req, "method", "");
            String var = ParamUtil.getParameter(req, "var", "").trim();
            if (!StringUtil.isNullOrBlank(var)) {
                result.append("var ");
                result.append(var);
                result.append(" = ");
            }

            // 请求方法为空
            if (StringUtil.isNullOrBlank(method)) {
                result.append(JsonUtil.getFailedResponse("-1", "请求方法为空!"));
                out.println(result);
                return;
            }

            // 创建请求
            TwRequest jReq = TwRequest.newInstance();

            // 设置方法
            jReq.setMethod(method);

            // 设置头部
            jReq.setHeader("userId", userId);
            jReq.setHeader("userName", userName);
            jReq.setHeader("isOnline", isOnline ? 1 : 0);
            jReq.setHeader("userLogin", QingBbsUtil.getUserLogin(req));
            jReq.setHeader("userIp", ip);
            jReq.setHeader("userPort",userPort);
            jReq.setHeader("vKey", CookieUtil.getCookieValue(req.getCookies(), "vk"));
            String referer = req.getHeader("Referer");
            boolean isInternal = false;
            for(String internal : ((LinkedHashMap<String,LinkedList<String>>)ConfigUtil.getConfigValue("internal_ip")).get("ip")){
                if(ip.startsWith(internal)) isInternal = true;
            }

            // 组装参数
            String key, value;
            Map.Entry<?, ?> entry;
            Map<?, ?> map = req.getParameterMap();
            Iterator<?> iter = map.entrySet().iterator();
            while (iter.hasNext()) {
                entry = (Map.Entry<?, ?>) iter.next();
                key = entry.getKey().toString();
                value = req.getParameter(key);

                if (key.startsWith("params.")) {

                    // 设置参数
                    jReq.setParams(key.substring(key.indexOf(".") + 1), value);
                } else if (key.startsWith("params[")) {

                    // 设置参数
                    jReq.setParams(key.substring(key.indexOf("[") + 1, key.length() - 1), value);
                }
            }
            out.print(result);
            return;
        } catch (Exception e) {
            logger.error("处理请求出错!method = " + method, e);
            result.append(JsonUtil.getFailedResponse("-1", "处理请求出错!"));
            out.println(result);
            return;
        } finally {
            if (out != null) {
                out.close();
            }
        }
}

另外为了确定jsp页面没有问题,我写了一个测试的jsp页面,代码如下:


 <%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<form id="form1" name="form1" method="post" action="提交到上面的servlet">
  <label for="params.content"></label>
  <input name="params.content" type="text" id="params.content" value="在这里填入内容" />
  <input type="submit" name="button" id="button" value="提交" />
</form>
</body>
</html>

另外用户提交的内容里面好像是包含了特殊的字符,我检查了一下可能是特殊字符导致转码出错了,但是没有找到对应的解决方法。

java resin servlet JSP

Joker疯 10 years, 6 months ago

丢失内容是什么意思。

如果的后端Class是用doGet处理请求,会有HTTP错误码提示的。

如果是doGet/doPost的问题。可以这样:


  public void doGet(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
  doPost(request,response);
  }

cyjjohn answered 10 years, 6 months ago

Your Answer