精华内容
下载资源
问答
  • IOS Android Tomcat SSL双向认证HTTPS访问

    千次阅读 2015-10-29 16:29:56
    由于项目要求为了保证服务器数据安全,保证接口不暴露给第三方,要求我们客户端接口全部采用HTTPS的SSL验证请求,花费一个多星期才搞定IOS和Android端和Tomcat服务器间的HTTPS的SSL验证请求,其中不免遇到了许多问题...

    由于项目要求为了保证服务器数据安全,保证接口不暴露给第三方,要求我们客户端接口全部采用HTTPSSSL验证请求,花费一个多星期才搞定IOS和Android端和Tomcat服务器间的HTTPSSSL验证请求,其中不免遇到了许多问题和麻烦,所以写下这篇文章希望对有需要的有所帮助。

    下载地址http://download.csdn.net/detail/wangyadong99/9180201

    一、HTTPSHTTP的区别

    1、https协议需要到ca申请证书,一般免费证书很少,需要交费。


    2、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。


    3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。


    4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

    二、SSL功能

    1)客户对服务器的身份认证:

    SSL服务器允许客户的浏览器使用标准的公钥加密技术和一些可靠的认证中心(CA)的证书,来确认服务器的合法性。


    2)服务器对客户的身份认证:

    也可通过公钥技术和证书进行认证,也可通过用户名,password来认证。


    3)建立服务器与客户之间安全的数据通道:

    SSL要求客户与服务器之间的所有发送的数据都被发送端加密、接收端解密,同时还检查数据的完整性。

    SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层:

    SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。

    SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。

    三、生成密钥库和证书

    首先打开终端 cd到生成的证书路径下我的在/Users/monkey/Desktop/AA/DD/

    1、生成服务器证书库


    localhost:DD monkey$ keytool -validity 365 -genkey -v -alias server -keyalg RSA -keystore server.keystore -dname "CN=192.168.1.110,OU=monkey,O=monkey,L=BeiJIng,ST=BeiJing,c=cn" -storepass 123456 -keypass 123456


    2、生成客户端证书库


    localhost:DD monkey$ keytool -validity 365 -genkeypair -v -alias client -keyalg RSA -storetype PKCS12 -keystore client.p12 -dname "CN=client,OU=monkey,O=monkey,L=BeiJing,ST=BeiJing,c=cn" -storepass 123456 -keypass 123456


    3、从客户端证书库中导出客户端证书


    localhost:DD monkey$ keytool -export -v -alias client -keystore client.p12 -storetype PKCS12 -storepass 123456 -rfc -file client.cer

    (Download bouncycastle JAR fromhttp://repo2.maven.org/maven2/org/bouncycastle/bcprov-ext-jdk15on/1.46/bcprov-ext-jdk15on-1.46.jar复制 bcprov-ext-jdk15on-1.46.jar 到 /Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib/ext/bcprov-ext-jdk15on-1.46.jar中)

    4、从服务器证书库中导出服务器证书


    localhost:DD monkey$ keytool -export -v -alias server -keystore server.keystore -storepass 123456 -rfc -file server.cer


    5、生成Android客户端信任证书库(由服务端证书生成的证书库)


    localhost:DD monkey$ keytool -importcert -keystore server.bks -file server.cer -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider 


    6、将客户端证书导入到服务器证书库(使得服务器信任客户端证书)


    localhost:DD monkey$ keytool -import -v -alias client -file client.cer -keystore server.keystore -storepass 123456


    7、查看证书库中的全部证书


    keytool -list -keystore server.keystore -storepass 123456

    通过上面的步骤生成的证书,客户端需要用到的是client.p12(客户端证书,用于请求的时候给服务器来验证身份之用)client.truststore(客户端证书库,用于验证服务器端身份,防止钓鱼)这两个文件.


    四、Tomcat配置

    在server.xml中把https的注释取消

    <ConnectorSSLEnabled="true"acceptCount="100"clientAuth="true"debug="0"disableUploadTimeout="true"enableLookups="true"keystoreFile="/Users/monkey/Desktop/AA/DD/server.keystore"keystorePass="123456"truststoreFile="/Users/monkey/Desktop/AA/DD/server.keystore"truststorePass="123456"maxProcessors="75"maxThreads="150"minProcessors="5"port="8443"protocol="org.apache.coyote.http11.Http11Protocol"scheme="https"secure="true"sslProtocol="TLS"/>

    配置成功后就可以在浏览器中测试访问了

    双击client.p12导入到浏览器

    输入程序网址https://192.168.1.110:8443/AijiaWebSvc/

    五、IOS相关代码

    在调用网络请求时添加如下代码,其他代码照常

    -(BOOL)connectionShouldUseCredentialStorage:(NSURLConnection *)connection

    {

        returnYES;

    }

    -(BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace

    {

        

        NSLog(@"authenticatemethod:%@",protectionSpace.authenticationMethod);

        returnYES;

    }

    //回调用时会执行两边

    -(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge

    {


        NSLog(@"Authentication challenge");

        if([challenge.protectionSpace.authenticationMethodisEqualToString:NSURLAuthenticationMethodServerTrust])

        {

            //服务器证书认证

            [challenge.senderuseCredential:[NSURLCredentialcredentialForTrust:challenge.protectionSpace.serverTrust]

                 forAuthenticationChallenge:challenge];

        }

        elseif([challenge.protectionSpace.authenticationMethodisEqualToString:NSURLAuthenticationMethodClientCertificate])

        {

           //客户端证书认证

             //TODO:设置客户端证书认证

            // load cert

            NSString *path = [[NSBundlemainBundle]pathForResource:@"client"ofType:@"p12"];

            NSData *p12data = [NSDatadataWithContentsOfFile:path];

            CFDataRef inP12data = (__bridgeCFDataRef)p12data;

            

            SecIdentityRef myIdentity;

            SecTrustRef myTrust;

            OSStatus status = extractIdentityAndTrust(inP12data, &myIdentity, &myTrust);

            

            SecCertificateRef myCertificate;

            SecIdentityCopyCertificate(myIdentity, &myCertificate);

            constvoid *certs[] = { myCertificate };

            CFArrayRef certsArray =CFArrayCreate(NULL, certs,1,NULL);

            

            NSURLCredential *credential = [NSURLCredentialcredentialWithIdentity:myIdentitycertificates:(__bridgeNSArray*)certsArraypersistence:NSURLCredentialPersistencePermanent];

            

            [[challenge sender]useCredential:credentialforAuthenticationChallenge:challenge];

        }

       

        return;

    }

    六、Android相关代码

    把client.p12和server.bks拷贝到项目assets中

    public class SSLConnection 

    {

    private static TrustManager[]trustManagers;

    private staticfinal StringKEY_STORE_TYPE_BKS ="bks";

    private staticfinal StringKEY_STORE_TYPE_P12 ="PKCS12";

    private staticfinal StringkeyStoreFileName ="client.p12";

    private staticfinal StringkeyStorePassword ="123456";

    private staticfinal StringtrustStoreFileName ="server.bks";

    private staticfinal StringtrustStorePassword ="123456";

    private staticfinal Stringalias =null;//"client";

    private static ContextpContext =null;

    public staticvoid allowAllSSL(Contextct)

    {

    javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {

    @Override

    publicboolean verify(Stringhostname, SSLSessionsession) {

    //TODO Auto-generated method stub

    returntrue;

    }

    });

    pContext=ct;

    javax.net.ssl.SSLContext context;

    if(trustManagers==null)

    {

    try 

    {

    KeyManager[] keyManagers = createKeyManagers(keyStoreFileName,keyStorePassword,alias);

    trustManagers=createTrustManagers(trustStoreFileName,trustStorePassword);

    context=javax.net.ssl.SSLContext.getInstance("TLS");

    context.init(keyManagers,trustManagers,new SecureRandom());

    javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());

    catch (KeyStoreExceptione) {

    //TODO Auto-generated catch block

    e.printStackTrace();

    catch (NoSuchAlgorithmExceptione) {

    //TODO Auto-generated catch block

    e.printStackTrace();

    catch (CertificateExceptione) {

    //TODO Auto-generated catch block

    e.printStackTrace();

    catch (IOExceptione) {

    //TODO Auto-generated catch block

    e.printStackTrace();

    }catch (UnrecoverableKeyExceptione) {

    //TODO Auto-generated catch block

    e.printStackTrace();

    }

    catch (KeyManagementExceptione

    {

    Log.e("allowAllSSL",e.toString());

    }//new TrustManager[]{new _FakeX509TrustManager()};

    }

    }

    private static KeyManager[] createKeyManagers(StringkeyStoreFileName, StringkeyStorePassword, Stringalias)

    throws CertificateException, IOException, KeyStoreException, NoSuchAlgorithmException, UnrecoverableKeyException

    {

    InputStream inputStream =pContext.getResources().getAssets().open(keyStoreFileName);

    KeyStore keyStore = KeyStore.getInstance(KEY_STORE_TYPE_P12);

    keyStore.load(inputStream,keyStorePassword.toCharArray());

    printKeystoreInfo(keyStore);//for debug


    KeyManager[] managers;

    if (alias !=null)

    {

    managers =

    new KeyManager[] {

    new SSLConnection().new AliasKeyManager(keyStore,alias,keyStorePassword)};

    else 

    {

    KeyManagerFactory keyManagerFactory =

    KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());//PKIX "X509")

    keyManagerFactory.init(keyStore,keyStorePassword ==null ?null :keyStorePassword.toCharArray());

    managers =keyManagerFactory.getKeyManagers();

    }

    returnmanagers;

    }

    private static TrustManager[] createTrustManagers(StringtrustStoreFileName, StringtrustStorePassword)

    throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException {

    InputStream inputStream =pContext.getResources().getAssets().open(trustStoreFileName);

    KeyStore trustStore = KeyStore.getInstance(KEY_STORE_TYPE_BKS);

    trustStore.load(inputStream,trustStorePassword.toCharArray());


    printKeystoreInfo(trustStore);//for debug

    TrustManagerFactory trustManagerFactory =

    TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());

    trustManagerFactory.init(trustStore);

    return trustManagerFactory.getTrustManagers();

    }

    private staticvoid printKeystoreInfo(KeyStorekeystore)throws KeyStoreException {

    System.out.println("Provider : " +keystore.getProvider().getName());

    System.out.println("Type : " +keystore.getType());

    System.out.println("Size : " +keystore.size());

    Enumeration en = keystore.aliases();

    while (en.hasMoreElements()) {

    System.out.println("Alias: " +en.nextElement());

    }

    }

    private class AliasKeyManagerimplements X509KeyManager 

    {


    private KeyStore_ks;

    private String _alias;

    private String _password;


    public AliasKeyManager(KeyStoreks, Stringalias, String password) {

    _ks =ks;

    _alias =alias;

    _password =password;

    }


    public String chooseClientAlias(String[]str, Principal[]principal, Socketsocket) {

    return_alias;

    }


    public String chooseServerAlias(Stringstr, Principal[]principal, Socketsocket) {

    return_alias;

    }


    public X509Certificate[] getCertificateChain(Stringalias) {

    try 

    {

    java.security.cert.Certificate[]certificates =this._ks.getCertificateChain(alias);

    if(certificates ==null)

    {

    thrownew FileNotFoundException("no certificate found for alias:" +alias);

    }

    X509Certificate[]x509Certificates =new X509Certificate[certificates.length];

    System.arraycopy(certificates, 0,x509Certificates, 0,certificates.length);

    returnx509Certificates;

    catch (Exceptione) {

    e.printStackTrace();

    returnnull;

    }

    }


    public String[] getClientAliases(Stringstr, Principal[]principal

    {

    returnnew String[] {_alias };

    }


    public PrivateKey getPrivateKey(Stringalias)

    {

    try

    {

    return (PrivateKey)_ks.getKey(alias,_password == null ? null :_password.toCharArray());

    catch (Exceptione)

    {

    e.printStackTrace();

    returnnull;

    }

    }


    public String[] getServerAliases(Stringstr, Principal[]principal

    {

    returnnew String[] {_alias };

    }

    }

    }

    调用网络请求前只需加SSLConnection.allowAllSSL(MainActivity.this);就可以正常访问了

    参考https://developer.android.com/training/articles/security-ssl.html#HttpsExample

    http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html#Certificates

    展开全文
  • Android Tomcat 的应用之客户端部分

    千次阅读 2012-02-24 21:01:33
    最近因为做一个客户端的登录部分,最后选择了使用Tomcat作为servlet服务器,MySQL作为数据库,今天就先写了一下客户端的部分,主要就是Android的网络编程部分,服务器端编程明天再写吧,今天有点累了。  首先是...

           最近因为做一个客户端的登录部分,最后选择了使用Tomcat作为servlet服务器,MySQL作为数据库,今天就先写了一下客户端的部分,主要就是Android的网络编程部分,服务器端编程明天再写吧,今天有点累了。

           首先是布局文件,如下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
    
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/hello" />
    
        <TableLayout >
            <TableRow >
            	<TextView 
                	android:id="@+id/tv_name"
                	android:layout_width="wrap_content"
                	android:layout_height="wrap_content"
                	android:text="@string/nameStr"/>
            	<EditText 
                	android:id="@+id/et_name"
                	android:layout_width="fill_parent"
                	android:layout_height="wrap_content"/>
            </TableRow>
            <TableRow >
                <TextView 
                    android:id="@+id/tv_passwd"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/passwdStr"/>
                <EditText 
                    android:id="@+id/et_passwd"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:password="true"/>
            </TableRow>
            <TableRow >
                <Button 
                    android:id="@+id/btn_confirm"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/btn_confirm"/>
                <Button 
                    android:id="@+id/btn_cancel"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/btn_cancel"/>
            </TableRow>
        </TableLayout>
        
    </LinearLayout>
             然后就是进行网络编程部分了,肯定是要用到post方式,这个部分就做一个单独的工具类,大家看一下就明白:

    package com.chenlong12580.app.tomcat;
    
    import java.io.IOException;
    
    import org.apache.http.HttpResponse;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.util.EntityUtils;
    
    public class HttpUtil {
    	// 基础URL
    	public static final String BASE_URL="http://222.20.60.132:8080/WebRoot/";
    	// 获得Get请求对象request
    	public static HttpGet getHttpGet(String url){
    		HttpGet request = new HttpGet(url);
    		 return request;
    	}
    	// 获得Post请求对象request
    	public static HttpPost getHttpPost(String url){
    		 HttpPost request = new HttpPost(url);
    		 return request;
    	}
    	// 根据请求获得响应对象response
    	public static HttpResponse getHttpResponse(HttpGet request) throws ClientProtocolException, IOException{
    		HttpResponse response = new DefaultHttpClient().execute(request);
    		return response;
    	}
    	// 根据请求获得响应对象response
    	public static HttpResponse getHttpResponse(HttpPost request) throws ClientProtocolException, IOException{
    		HttpResponse response = new DefaultHttpClient().execute(request);
    		return response;
    	}
    	
    	// 发送Post请求,获得响应查询结果
    	public static String queryStringForPost(String url){
    		// 根据url获得HttpPost对象
    		HttpPost request = HttpUtil.getHttpPost(url);
    		String result = null;
    		try {
    			// 获得响应对象
    			HttpResponse response = HttpUtil.getHttpResponse(request);
    			// 判断是否请求成功
    			if(response.getStatusLine().getStatusCode()==200){
    				// 获得响应
    				result = EntityUtils.toString(response.getEntity());
    				return result;
    			}
    		} catch (ClientProtocolException e) {
    			e.printStackTrace();
    			result = "网络异常!";
    			return result;
    		} catch (IOException e) {
    			e.printStackTrace();
    			result = "网络异常!";
    			return result;
    		}
            return null;
        }
    	// 获得响应查询结果
    	public static String queryStringForPost(HttpPost request){
    		String result = null;
    		try {
    			// 获得响应对象
    			HttpResponse response = HttpUtil.getHttpResponse(request);
    			// 判断是否请求成功
    			if(response.getStatusLine().getStatusCode()==200){
    				// 获得响应
    				result = EntityUtils.toString(response.getEntity());
    				return result;
    			}
    		} catch (ClientProtocolException e) {
    			e.printStackTrace();
    			result = "网络异常!";
    			return result;
    		} catch (IOException e) {
    			e.printStackTrace();
    			result = "网络异常!";
    			return result;
    		}
            return null;
        }
    	// 发送Get请求,获得响应查询结果
    	public static  String queryStringForGet(String url){
    		// 获得HttpGet对象
    		HttpGet request = HttpUtil.getHttpGet(url);
    		String result = null;
    		try {
    			// 获得响应对象
    			HttpResponse response = HttpUtil.getHttpResponse(request);
    			// 判断是否请求成功
    			if(response.getStatusLine().getStatusCode()==200){
    				// 获得响应
    				result = EntityUtils.toString(response.getEntity());
    				return result;
    			}
    		} catch (ClientProtocolException e) {
    			e.printStackTrace();
    			result = "网络异常!";
    			return result;
    		} catch (IOException e) {
    			e.printStackTrace();
    			result = "网络异常!";
    			return result;
    		}
            return null;
        }
    }
          最后就是在Activity里面实现功能了,也就是设置按钮的事件监听器,如下:

    package com.chenlong12580.app.tomcat;
    
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    
    public class TomcatActivity extends Activity {
        /** Called when the activity is first created. */
    	private EditText et_name, et_passwd;
    	private Button btn_confirm, btn_cancel;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            et_name = (EditText)findViewById(R.id.et_name);
            et_passwd = (EditText)findViewById(R.id.et_passwd);
            btn_confirm = (Button)findViewById(R.id.btn_confirm);
            btn_cancel = (Button)findViewById(R.id.btn_cancel);
            
            btn_cancel.setOnClickListener(new View.OnClickListener() {
    			
    			@Override
    			public void onClick(View v) {
    				// TODO Auto-generated method stub
    				finish();
    			}
    		});
            
            btn_confirm.setOnClickListener(new View.OnClickListener() {
    			
    			@Override
    			public void onClick(View v) {
    				// TODO Auto-generated method stub
    				String queryStr = "username=" + et_name.getText().toString()
    						+"&password=" + et_passwd.getText().toString();
    				String urlStr = HttpUtil.BASE_URL+"servlet/tomcat?"+queryStr;
    				String result = HttpUtil.queryStringForPost(urlStr);
    				
    				if(result != null) {
    					showDialog("登录成功!");
    				}else {
    					showDialog("登录失败!");
    				}
    			}
    		});
        }
        
        private void showDialog(String str) {
        	AlertDialog.Builder builder = new AlertDialog.Builder(this);
        	builder.setMessage(str).setPositiveButton("确定", null);
        	AlertDialog dialog = builder.create();
        	dialog.show();
        }
    }
           现在还不能测试,等明天写好服务器端再测试吧!
    展开全文
  • Android Tomcat 的应用之服务器部分

    千次阅读 2012-02-25 21:19:14
    接着昨天的写,实现登录的服务端部分。...  然后就是编码实现了,首先是写一个类封装一下数据库中的用户信息,如下: ... 至于Tomcat和MySQL的配置、使用网上有不少教程!至此就可以实现登录模块了!

            接着昨天的写,实现登录的服务端部分。首先得弄个数据库,然后建立一个表,存储所有用户的用户名和密码,当在客户端发出查询请求的时候会把用户输入的用户名和密码传到服务器端,然后在数据库中进行查询,这里我们的表就3个字段,一个ID,一个username和一个password。

            然后就是编码实现了,首先是写一个类封装一下数据库中的用户信息,如下:

    public class User {
    	private int id;
    
    	private String username;
    	
    	private String password;
    
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getName() {
    		return username;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getPassword() {
    		return password;
    	}
    	public void setPassword(String password) {
    		this.password = password;
    	}
    
    }
              然后就是定义查询的接口:

    public interface UserDao {
    	// 登录方法
    	public User login(String username,String password);
    }
              实现该接口:

    public class UserDaoImpl implements UserDao {
    	public User login(String account, String password) {
    		// 查询SQL语句
    		String querySql = " select id,username,password "+
    						" from userTable "+
    						" where username=? and password=? ";
    		DBUtil util = new DBUtil();
    		Connection conn = util.openConnection();
    		try {
    			PreparedStatement state = conn.prepareStatement(querySql);
    			state.setString(1, username);
    			state.setString(2, password);
    
    			ResultSet result = state.executeQuery();
    			if (result.next()) {
    
    				int id = result.getInt(1);
    				String name = result.getString(4);
    				
    				User user = new User();
    				
    				user.setId(id);
    				user.setName(username);
    				user.setPassword(password);
    
    				return user;
    			}
    		} catch (SQLException e) {
    			e.printStackTrace();
    		} finally {
    			util.closeConn(conn);
    		}
    		return null;
    	}
    
    }
             最后就是实现servlet,主要是处理来自客户端的查询请求和返回查询结果:

    public class Login extends HttpServlet {
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		response.setContentType("text/html");
    		PrintWriter out = response.getWriter();
    		UserDao dao = new UserDaoImpl();
    		// 获得客户端请求参数
    		String username = request.getParameter("username");
    		String password = request.getParameter("password");
    		
    		User u = dao.login(username, password);
    		if(u!=null){
    			out.print("登录成功");
    		}else{
    			out.print("null");
    		}
    		out.flush();
    		out.close();
    	}
    	
    
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		doGet(request,response);
    	}
    	public void init() throws ServletException {
    	}
    	
    	public LoginServlet() {
    		super();
    	}
    
    	public void destroy() {
    		super.destroy();
    	}
    
    }
               至于Tomcat和MySQL的配置、使用网上有不少教程!至此就可以实现登录模块了!

    展开全文
  • 是没有用的,所以我们把默认的iso-8859-1编码改成UTF-8,在TOMCAT的配置文件的server.xml中更改: connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" /> 添加URIEncoding=UTF-8 4、Android中访问...

    1、浏览器往服务器发送的请求主要可分为2种:get、post;delete、head等不赘述。

    GET方式:

    从浏览器上直接敲地址,最大特点就是参数直接跟在地址后面。

    POST方式:表单提交等。

    2、访问过程:

    浏览器中输入地址 –> 浏览器对中文进行编码 –>发送到服务器 ->服务器进行解码

    如何浏览器编码和服务器解码用的字符集不一致就会发生乱码问题。

    3、乱码的解决

    默认浏览器使用UTF-8编码(IE默认GBK当然可以通过meta标签设置)

    服务器(Tomcat)默认使用iso-8859-1解码。Iso-8859-1是不支持中文的,也就是说不做处理,中文是一定乱码的。

    POST方式解决:

    比如表单提交,在Servlet或者Filter中设置request.setCharacterEncoding("UTF-8");就能很好的解决。

    GET方式:单纯设置request.setCharacterEncoding("UTF-8");是没有用的,所以我们把默认的iso-8859-1编码改成UTF-8,在TOMCAT的配置文件的server.xml中更改:

    connectionTimeout="20000"

    redirectPort="8443" URIEncoding="UTF-8" />

    添加URIEncoding=UTF-8

    4、Android中访问:

    POST方式,通过HttpUrlConnection封装POST请求【具体实现百度】,POST方式参数是需要打包发送的,不是直接跟在url后面。例如:http://www.demo.com?p=123这不是post传输参数。

    GET方式,通过HttpUrlConnection可以很简单的实现,但是会发现,很容易出现乱码问题。

    首先:添加URIEncoding=UTF-8工作完成,还是会发送乱码。

    这是因为,上面的访问过程提到浏览器对中文进行编码,这里我们直接发送请求,并没有编码这个过程,所以我们需要自己手动编码,即:

    String name =URLEncoder.encode("中国万岁","UTF-8");

    这样我们就模拟了浏览器的编码,然后发送至服务器,服务器解码也改成UTF-8了,于是又可以快乐的玩耍了。

    展开全文
  • 是没有用的,所以我们把默认的iso-8859-1编码改成UTF-8,在TOMCAT的配置文件的server.xml中更改: connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" /> 添加URIEncoding=UTF-8 4、Android中访问...
  • 自从Tomcat5.x开始,GET和POST方法提交的信息,Tomcat采用了不同的方式来处理编码,对于POST请求,Tomcat会仍然使用request.setCharacterEncoding方法所设置的编码来处理,如果未设置,则使用默认的iso-8859-1编码。...
  • AndroidTomcat远程访问

    2011-08-13 12:39:48
    AndroidTomcat远程访问AndroidTomcat远程访问AndroidTomcat远程访问
  • android访问tomcat服务器

    2014-03-25 19:36:31
    该资源包含了一个用android访问tomcat服务器的小案例,包括用户注册,和用户登录,以及将myqlz中的数据用listview组件显示出来
  • 关于androidtomcat

    2015-07-28 15:49:57
    40*0.3 1.android之虚拟机访问tomcat服务器资源 2.使用 Eclipse + Tomcat 编写 Servlet
  • androidtomcat数据交互

    千次阅读 2019-01-16 18:34:28
     目前大部分android的APP都具有联网功能,并且能够与服务器进行数据交互,本文采用tomcat作为服务器以实现数据交互,信息交互的前提是android设备和服务器在同一个局域网内。   android设计:  这边需要先说明...
  • 一个用android做为前端,servelt作为后端,tomcat作为服务器的一个小demo,在用之前大家一定要改连接android端连接servelet的ip地址
  • Android——Tomcat版本更新下载+头像照片上传到Tomcat package com.example.schoolappzyf; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; ...
  • Android 启动tomcat报错

    2017-03-24 16:18:46
    Several ports (8005, 8080, 8009) required by Tomcat v7.0 Server at localhost are already in use. The server may already be running in another process, or a system process may be using the port. To ...
  • android示例代码,从tomcat服务器上下载mp3资源
  • Android - Tomcat服务器返回数据问题
  • Android连接Tomcat服务器

    千次阅读 2015-11-18 20:23:22
    在保证服务器是正常状态时,将从Android模拟器上发送请求给服务端并接收服务端返回来的响应。 保证HttpServlet配置正常。可以通过在浏览器输入配置的地址,若能正常响应,那么在Android中去请求的话也是能正常响应...
  • 项目要求:android生成新闻端,通过访问服务器,可以更新新闻,要求:数据库是mysql,服务器用tomcat搭建 webservice,目前webservice已经搭建好了,就是不知道怎额让android去读取数据库的新闻,并显示出来
  • Android+Tomcat+MySql登录注册和Socket聊天.zip
  • androidtomcat服务器交互实例

    万次阅读 2012-09-05 11:47:19
    androidtomcat服务器交互实例 一、教程目的。  本教程的目的在于教会怎么完成androidtomcat服务器的数据交互。 二、开发环境。  Myeclipse8.5+jdk1.6+android2.3 三、开发步骤。  (1)新建一...
  • androidTomcat安装和配置

    千次阅读 2019-04-08 18:11:07
    其次,下载Tomcat 官网:http://tomcat.apache.org/ 我下载的是Tomcat 7.0.93 点击Download,出现下面页面 点击第一个zip下载解压 在解压后的文件夹里找到并双击bin文件,找到startup.bat 双击startup....
  • Android服务器——TomCat服务器的搭建

    万次阅读 多人点赞 2016-01-24 22:58:00
    Android服务器——TomCat服务器的搭建 作为一个开发人员,当然是需要自己调试一些程序的,这个时候本地的服务器就十分方便了,一般都会使用TomCat或者IIS服务器,IIS就比较简单了,其实tomcat也是很简单的,接下来...
  • Android 真机访问 Tomcat

    2016-09-19 17:52:30
    手机连入 Tomcat服务器 所在的电脑的wifi 开启Tomcat服务器 win+R→cmd→ipconfig 查看电脑的ipv4地址 手机的浏览器输入网址 11.1.42.29/8080
  • android做客户端上传图片到tomcat,当然也可以上传其他文件.用的是三大框架.这里主要是用的struts2.
  • Android中我们时常会与服务器打交道,为了方便测试代码,我们有必要搭建本地的服务器,其实搭建本地的Tomcat服务器也是很简单: Tomcat的下载 环境配置 Eclipse中新建Web工程 一、 Tomcat的下载 在Tomcat官网...
  • android访问本地tomcat

    千次阅读 2014-01-03 16:15:22
    知道大家是否想试一下用Android模拟器如何访问自己建的Web站点呢? 下面我将讲一下如何实现. Step 1:我用的Tomcat作为本地服务器,在Webapps这个目录里,把我的名为kankong的Web工程放进来,启动Tomcat服务器. 在浏览器...
  • Androidtomcat之间的ip

    2014-03-26 19:28:39
    androidtomcat读取文件时出现以下异常: 08-10 14:53:09.118: W/System.err(12527): java.net.ConnectException: failed to connect to localhost/127.0.0.1 (port 8080): connect failed: ECONNREFUSED ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,706
精华内容 1,082
关键字:

androidtomcat