我正在尝试在 jsp 和 jQuery 上构建一个简单的电子邮件联系表单(我用这个脚本调用我的 servlet 以避免重定向)。 在我的本地主机上一切正常,但是当我在我的 tomcat 服务器上部署 WAR 文件时,我遇到了编码问题。 而不是俄文字母,我回复这样的电子邮件“????????????????”。

我尝试过的解决方案:

  1. 配置tomcat web.xml(启用setCharacterEncodingFilter过滤器);
  2. 配置了 tomcat server.xml(将这一行 URIEncoding="UTF-8" 添加到我的连接器端口);
  3. 配置了我的 web-app web.xml(设置 setCharacterEncodingFilter 过滤器);
  4. 在我的 servlet 中添加 request.setCharacterEncoding("utf-8"), response.setCharacterEncoding("utf-8") ;
  5. 在我的 AJAX 表单提交脚本中添加了 contentType: "application/x-www-form-urlencoded; charset=UTF-8"。

但没有任何作用。 请帮我!

我从本地主机收到这个

我从服务器收到这个

这是我的网络应用程序 web.xml

 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://JAVA.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>send</servlet-name> <servlet-class>emailSender.EmailSendingServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>send</servlet-name> <url-pattern>/send</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> <url-pattern>*.css</url-pattern> <url-pattern>*.jpg</url-pattern> <url-pattern>*.gif</url-pattern> <url-pattern>*.png</url-pattern> <url-pattern>*.ico</url-pattern> <url-pattern>*.swf</url-pattern> <url-pattern>*.svg</url-pattern> <url-pattern>*.ttf</url-pattern> </servlet-mapping> <filter> <filter-name>setCharacterEncodingFilter</filter-name> <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <async-supported>true</async-supported> </filter> </web-app>

这是 tomcat server.xml

 <?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <!-- Note: A "Server" is not itself a "Container", so you may not define subcomponents such as "Valves" at this level. Documentation at /docs/config/server.html --> <Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> <!-- Security listener. Documentation at /docs/config/listeners.html <Listener className="org.apache.catalina.security.SecurityListener" /> --> <!--APR library loader. Documentation at /docs/apr.html --> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <!-- Prevent memory leaks due to use of particular java/javax APIs--> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> <!-- Global JNDI resources Documentation at /docs/jndi-resources-howto.html --> <GlobalNamingResources> <!-- Editable user database that can also be used by UserDatabaseRealm to authenticate users --> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> </GlobalNamingResources> <!-- A "Service" is a collection of one or more "Connectors" that share a single "Container" Note: A "Service" is not itself a "Container", so you may not define subcomponents such as "Valves" at this level. Documentation at /docs/config/service.html --> <Service name="Catalina"> <!--The connectors can use a shared executor, you can define one or more named thread pools--> <!-- <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/> --> <!-- A "Connector" represents an endpoint by which requests are received and responses are returned. Documentation at : Java HTTP Connector: /docs/config/http.html Java AJP Connector: /docs/config/ajp.html APR (HTTP/AJP) Connector: /docs/apr.html Define a non-SSL/TLS HTTP/1.1 Connector on port 8080 --> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" /> <!-- A "Connector" using the shared thread pool--> <!-- <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> --> <!-- Define an SSL/TLS HTTP/1.1 Connector on port 8443 This connector uses the NIO implementation. The default SSLImplementation will depend on the presence of the APR/native library and the useOpenSSL attribute of the AprLifecycleListener. Either JSSE or OpenSSL style configuration may be used regardless of the SSLImplementation selected. JSSE style configuration is used below. --> <!-- <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true"> <SSLHostConfig> <Certificate certificateKeystoreFile="conf/localhost-rsa.jks" type="RSA" /> </SSLHostConfig> </Connector> --> <!-- Define an SSL/TLS HTTP/1.1 Connector on port 8443 with HTTP/2 This connector uses the APR/native implementation which always uses OpenSSL for TLS. Either JSSE or OpenSSL style configuration may be used. OpenSSL style configuration is used below. --> <!-- <Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol" maxThreads="150" SSLEnabled="true" > <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" /> <SSLHostConfig> <Certificate certificateKeyFile="conf/localhost-rsa-key.pem" certificateFile="conf/localhost-rsa-cert.pem" certificateChainFile="conf/localhost-rsa-chain.pem" type="RSA" /> </SSLHostConfig> </Connector> --> <!-- Define an AJP 1.3 Connector on port 8009 --> <Connector protocol="AJP/1.3" address="::1" port="8009" redirectPort="8443" URIEncoding="UTF-8" /> <!-- An Engine represents the entry point (within Catalina) that processes every request. The Engine implementation for Tomcat stand alone analyzes the HTTP headers included with the request, and passes them on to the appropriate Host (virtual host). Documentation at /docs/config/engine.html --> <!-- You should set jvmRoute to support load-balancing via AJP ie : <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1"> --> <Engine name="Catalina" defaultHost="localhost"> <!--For clustering, please take a look at documentation at: /docs/cluster-howto.html (simple how to) /docs/config/cluster.html (reference documentation) --> <!-- <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> --> <!-- Use the LockOutRealm to prevent attempts to guess user passwords via a brute-force attack --> <Realm className="org.apache.catalina.realm.LockOutRealm"> <!-- This Realm uses the UserDatabase configured in the global JNDI resources under the key "UserDatabase". Any edits that are performed against this UserDatabase are immediately available for use by the Realm. --> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- SingleSignOn valve, share authentication between web applications Documentation at: /docs/config/valve.html --> <!-- <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> --> <!-- Access log processes all example. Documentation at: /docs/config/valve.html Note: The pattern used is equivalent to using pattern="common" --> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" /> <Context path="" docBase="mmb"> <!-- Default set of monitored resources --> <WatchedResource>WEB-INF/web.xml</WatchedResource> </Context> </Host> </Engine> </Service> </Server>

这是我的 servlet

 package emailSender; import java.util.*; import java.util.Properties; import javax.mail.*; import javax.mail.internet.*; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class EmailSendingServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String host="smtp.gmail.com"; String port="465"; final String user="sample@gmail.com";//from email final String password="*****"; String to="sample@gmail.com";//recipient email String resultMessage = ""; //get content from web request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=UTF-8"); response.setCharacterEncoding("utf-8"); String name = request.getParameter("name"); String tel = request.getParameter("tel"); String email = request.getParameter("email"); String cont = request.getParameter("cont"); //Get the session object Properties props = new Properties(); props.put("mail.smtp.host", host); props.put("mail.smtp.port", port); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.ssl.enable", "true"); Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(user,password); } }); //Compose the message try { MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(user)); message.addRecipient(Message.RecipientType.TO,new InternetAddress(to)); message.setSubject("[Сообщение СЃ сайта РњРњР']"); message.setText(name + "\\n" + cont + "\\n" + tel + "\\n" + email); //send the message Transport.send(message); resultMessage = "The e-mail was sent successfully"; System.out.println("message sent successfully..."); } catch (MessagingException e) {e.printStackTrace();} finally { request.setAttribute("Message", resultMessage); } } }

这是我的 AJAX 脚本联系表。

 <form id ="contact_form" name="contact_form" action="send" method="post"> <input type="text" class="contact-us-field" id="name" name="name" placeholder="Имя"> <input type="text" class="contact-us-field" id="tel" name="tel" placeholder="Тел."> <input type="text" class="contact-us-field" id="email" name="email" placeholder="E-mail"> <textarea id="subject" class="contact-us-field" name="cont" placeholder="Чем вам помочь?" ></textarea> <div class="loader"><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div></div> <h3 id="result_message"><h3> <input type="submit" class="contact-us-submit" value="Отправить"/> </form> <script src="https://code.jquery.com/jquery-1.10.2.min.js"></script> <script type="text/javascript"> var form = $('#contact_form'); form.submit(function () { $.ajax({ type: form.attr('method'), beforeSend: function(){ $('.loader').css("display", "block"); }, url: form.attr('action'), data: form.serialize(), contentType: "application/x-www-form-urlencoded; charset=UTF-8", success: function () { var result="Сообщение отправлено"; $('#result_message').html(result); $('.loader').css("display", "none"); $("#name").val(""); $("#tel").val(""); $("#email").val(""); $("#subject").val(""); }, error : function(){ $('.loader').css("display", "none"); //Show error message } }); return false; }); </script>

  ask by Vadim translate from so

本文未有回复,本站智能推荐:

1回复

Ubuntu / Tomcat服务器UTF-8编码问题

我已经开发了一个使用Java / Jsp的Web应用程序,该Web应用程序在具有Tomcat 8的Ubuntu 14.04 LTS服务器上运行,其中以下UTF-8编码问题带有部分符号§apperas。 服务器端的部分符号§的任何形式的输入都将转换为§ ,我不知道为什么。 简单的sys
2回复

如何在基于Tomcat的Java项目中使用UTF-8编码[重复]

这个问题已经在这里有了答案: 如何将Unicode字符作为JSP / Servlet request.getParameter传递? 4个答案 我有一个使用Tomcat作为服务器的Java Web项目。我的问题是当我想使用UTF-8字符时无法正确显示它们。
1回复

浏览器自动检测utf-8,希伯来语

嗨,我在jsp中有一个webapp 在旧的tomcat进入我的Web应用程序时,浏览器会自动检测到UTF-8 但是在全新的tomcat5.5中启动同一webapp时,浏览器无法检测到UTF-8,我必须手动对其进行更改 (我现在正在托管我的应用程序,并且希望它在新的tomcat上
1回复

JSP和Tomcat中的UTF-8编码

我正在基于基于jsp的应用程序在tomcat 7.0.50上运行 该jsp保存在utf-8中,每个jsp都有 我将Tomcat连接器配置为UTF-8编码 在bin / catalina.bat中,我添加了参数: 但是,当我尝试检查表单中http帖子中传递的参数时,我
1回复

Tomcat再次编码问题

关于这个主题,在StackOverFlow上有很多问题: 在Tomcat上处理URI中的字符编码 为什么在Java中使用request.getParameter()时字符损坏? request.getParameter()在Java Servlet中无法正确显示字符编码
2回复

为什么我的HTML验证器会继续报告与页面编码不同的编码?

我使用本地validator.nu实例来验证网站,但它一直告诉我编码不匹配: 内部编码声明“iso-8859-1”不同意文档的实际编码(“utf-8”)。 我已经做了一切尝试并将编码强制为iso-8859-1,因为我们正在使用需要此编码的传统数据库。 启动的进程强制L