`

java 通过HttpsUrlConnection访问接口数据

    博客分类:
  • java
 
阅读更多
server:
  ssl:
    key-store: classpath:key/rsakey.jks
    key-store-password: 123456
    key-store-type: JKS
    key-alias: tomcatjks
    urls: /*
  port: 8443
  non-ssl-port: 8080


1.Http请求工具类
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.json.JSONObject;

public class HttpsGetData {
    private static class TrustAnyTrustManager implements X509TrustManager {
        
        public void checkClientTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
        }
 
        public void checkServerTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
        }
 
        public X509Certificate[] getAcceptedIssuers() {
            return new X509Certificate[] {};
        }
    }
 
    private static class TrustAnyHostnameVerifier implements HostnameVerifier {
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    }
    
    /**
     * 返回的结果是字符串格式
     * url:请求url
     * hearderKey:请求消息头ke值
     * headerValue:请求消息头key对应的value值
     * requestMethod:请求方式
     * param:json请求参数 
     */
    public String Do(String url,String hearderKey,String headerValue,String requestMethod,String param) throws Exception
    {
         String result = "";
         BufferedReader in = null;
            try {
                System.out.println("请求的URL为:"+url);
                SSLContext sc = SSLContext.getInstance("SSL");
                sc.init(null, new TrustManager[] { new TrustAnyTrustManager() },new java.security.SecureRandom());
                URL realUrl = new URL(url);
                // 打开URL连接
                HttpsURLConnection connection = (HttpsURLConnection) realUrl.openConnection();
                // 设置https相关属性
                connection.setSSLSocketFactory(sc.getSocketFactory());
                connection.setHostnameVerifier(new TrustAnyHostnameVerifier());
                connection.setDoOutput(true);
                connection.setDoInput(true);
                // 设置通用的请求属性
                connection.setRequestProperty("Content-Type", " application/json");
                connection.setRequestProperty("Connection", "keep-alive");
                connection.setRequestProperty(hearderKey, headerValue);//基于base基本认证							
                connection.setRequestMethod(requestMethod);
                // 建立实际的连接
                connection.connect();
                // 添加请求参数
                if(StringUtil.isNotEmpty(param)){
                	OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());  
                    writer.write(param);
                    writer.flush(); 
                }
                
                // 读取URL的响应结果
                in = new BufferedReader(new InputStreamReader(connection.getInputStream(),"UTF-8"));
                String line;
                while ((line = in.readLine()) != null) {
                    result += line;
                }
                System.out.println("获取的结果为:"+result);
            } catch (Exception e) {
                System.out.println("发送请求出现异常!" + e);
                throw e;
            }
            // 使用finally块来关闭输入流
            finally {
                try {
                    if (in != null) {
                        in.close();
                    }
                } catch (Exception e2) {
                    //e2.printStackTrace();
                    throw e2;
                }
            }
            return result;
    
    } 
    
}


2.接口服务编写
@SuppressWarnings("unchecked")
	@RequestMapping(value="/getCatHosOrg",method=RequestMethod.POST)
	@ApiOperation(value="xxxxxx查询")
	public ResponseData<CatHosOrgEntity> getCatHosOrg(@RequestBody(required=false) CatHosOrgEntity catHosOrgEntity,
														@RequestParam(defaultValue="1",required=false) int page,
														@RequestParam(defaultValue="15",required=false) int size,
														ComebakColumn comBak){
		QueryParams<xxxx> params = new QueryParams<xxxxx>();
		Page pageSize = new Page();
		pageSize.setPages(page);
		pageSize.setPageSize(size);
		params.setPaging(pageSize);
		params.setEntity(catHosOrgEntity);
		try {
			List<xxxx> catHosOrgList = this.catHosOrgService.queryEntityPage(params);
			jsonObjects = new ArrayList<JSONObject>();
			if(comBak.getList() != null && comBak.getList().size() >0){
				for(CatHosOrgEntity catHosOrgEntitys:catHosOrgList){
					jsonObject = new JSONObject();
					for(Field field:catHosOrgEntitys.getClass().getDeclaredFields()){
						for(String list:comBak.getList()){
							if(field.getName().equals(list)){
								Method method = CatHosOrgEntity.class.getMethod("get"+field.getName().substring(0,1).toUpperCase()+field.getName().substring(1));
								jsonObject.put(field.getName(),(Object)method.invoke(catHosOrgEntitys));
							}
							
						}
					}
					jsonObjects.add(jsonObject);
				}
				return success(jsonObjects);
			}else {
				return success(catHosOrgList);
			}
			
		} catch (Exception e) {
			// TODO: handle exception
			return error("xxx查询");
		}
		
	}


3.拦截器定义
/**
 * 对请求用户进行拦截
 * @author 
 */
public class MvcInteractor implements HandlerInterceptor{
	
	protected Logger log = LoggerFactory.getLogger(MvcInteractor.class);
	
	@SuppressWarnings("all")
	@Override
	public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {
		boolean flag = false;
		String token = request.getHeader("Authorization").substring(7);
		@SuppressWarnings("restriction")
		BASE64Encoder encoder = new BASE64Encoder();
		response.setCharacterEncoding("UTF-8");
		response.setContentType("application/json; charset=utf-8");
		PrintWriter out = null;
		JSONObject res = new JSONObject();
		ApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(request.getServletContext());
		JdbcTemplate jt = (JdbcTemplate) ac.getBean("jdbcTemplate");
		AppInfoRepository ap = (AppInfoRepository) ac.getBean("appInfoRepository");
		//获取用户信息
		try {
			AppInfo appInfo = ap.findByAppId(request.getParameter("account").toString());
			log.info("认证地址:"+request.getServerName());
			log.info("认证端口:"+request.getServerPort());
			// token验证地址
			String tokenUrl = "https://"+request.getServerName()+":"+request.getServerPort()+"/oauth/token";
			HttpsGetData httpsGetData = new HttpsGetData();
			String tokenResult = httpsGetData.Do(tokenUrl+"?grant_type=client_credentials&scope","Authorization","Basic "+encoder.encode((appInfo.getAppId()+":"+appInfo.getAppKey()).getBytes()),"POST",null);
			// 转成json数据
			JSONObject tokenJSon = new JSONObject(tokenResult);
			if(!tokenJSon.getString("access_token").equals(token)){
				res.put("code", "202");
				res.put("msg", "该账号无权限访问,请联系管理员!token不匹配!");
				out = response.getWriter();
				out.append(res.toString());
				return flag;
			}
			// 判断该APP_ID下面的角色是否有权访问该URL
			StringBuilder sql = new StringBuilder(500);
			sql.append("SELECT A.INTERFACE_URL FROM APP_INTERFACE A LEFT JOIN ROLES_URL R ON A.ID = R.APP_INTERFACE_ID LEFT JOIN ROLES S ON R.ROLE_ID = S.ID WHERE S.ID IN (");
			sql.append("SELECT B.ID FROM APP_ROLES A JOIN ROLES B ON A.ROLE = B.ID WHERE A.APP_ID = ? )") ;
			List<String> urlList = jt.query(sql.toString(),new Object[]{appInfo.getAppId()}, new RowMapper<String>() {
	            @Override
	            public String mapRow(ResultSet resultSet, int i) throws SQLException {
	                return resultSet.getString("interface_url");
	            }
	        });
			for(String url:urlList){
				if(request.getRequestURL().indexOf(url) > -1){
					return true ;
				}
			}
			if(!flag){
				res.put("code", "202");
				res.put("msg", "该账号无权限访问,请联系管理员!");
				out = response.getWriter();
				out.append(res.toString());
			}
		} catch (Exception e) {
			e.getCause();
			log.error("该账号无权限访问,请联系管理员!");
		}	
		return flag;
	}

	@Override
	public void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
	}
	
	@Override
	public void afterCompletion(HttpServletRequest request,HttpServletResponse response,
						 Object handler, Exception ex)throws Exception {
	}
}


4.测试代码
public static void main(String[] args) throws Exception {
		//String clientReq = "appId:appKey";//默认客户端ID和客户端秘钥
		String client_id="appId";//默认客户端ID
		String client_secret = "appKey";//默认客户端秘钥
		BASE64Encoder encoder = new BASE64Encoder();
		BASE64Decoder decoder = new BASE64Decoder();
		//String tokenUrl = "https://101.37.25.220:8091/oauth/token?grant_type=client_credentials&scope";
		String tokenUrl = "https://localhost:8443/oauth/token";
		HttpsGetData httpsGetData = new HttpsGetData();
		List<String> list = new ArrayList<String>();
		/**
		 * 获取返回的token
		 * 注:请求头为Authorization,值为Basic加空格加client_id:client_secret的Base64编码
		 */
		String tokenResult = httpsGetData.Do(tokenUrl+"?grant_type=client_credentials&scope","Authorization","Basic "+encoder.encode((client_id+":"+client_secret).getBytes()),"POST",null);
		JSONObject tokenJSon = new JSONObject(tokenResult);//转成json数据
		String token = tokenJSon.getString("access_token");
		/**
		 * 请求参数为json格式
		 */
		JSONObject paramJson = new JSONObject();
		paramJson.put("modifyDate", "2017-10-30");
//		paramJson.put("facNameF","江西");
//		paramJson.put("convertF","盒");		
//		paramJson.put("nameCn", "片");
//		paramJson.put("smlNameF", "片");
//		paramJson.put("normF", "2G");
		/**
		 * 返回字段为字符串的list集合
		 */
		list.add("facNameF");
		list.add("convertF");
		list.add("nameCn");
		list.add("smlNameF");
		list.add("normF");
		String params = (StringUtils.strip(list.toString(), "[]").replaceAll(" ", ""));//删除集合中的空格
		/**
		 * 分页
		 * 默认:page="1";size="15"
		 * 注:请求头为Authorization,值为Bearer加空格加token
		 */
		String page = "1";
		String size = "10";
//		String resultUrl = "https://localhost:8443/api/v1.0/catZxmedProduct/getCatZxmedProduct?page="+page+"&size="+size+"&list="+params+"&account="+client_id;
		String resultUrl = "https://localhost:8443/api/v1.0/catZxmedProduct/getCatZxmedProductByDate?page="+page+"&size="+size+"&list="+params+"&account="+client_id;
		//String resultUrl = "https://localhost:8443/api/v1.0/demo/HXUDP0000000000000000000000034?account="+client_id;
		//注:若无json请求参数,则paramJson = null;
		httpsGetData.Do(resultUrl,"Authorization","Bearer "+token,"POST",paramJson.toString());//请求获取数据
	}



分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    java实现读取证书访问https接口

    总结来说,Java实现读取证书访问HTTPS接口涉及的关键知识点包括:X.509证书、Java KeyStore、SSL/TLS协议、`HttpURLConnection`和`HttpsURLConnection`的使用、SSLContext、TrustManager和KeyManager的配置。...

    Java下载https文件并上传阿里云oss服务器

    在提供的代码示例中,创建了一个名为`X509TrustUtil`的类,该类实现了`X509TrustManager`接口。`X509TrustManager`是Java安全模型的一部分,负责检查服务器的证书是否可信。在`X509TrustUtil`中,三个方法`...

    java后台调用HttpURLConnection类模拟浏览器请求实例(可用于接口调用)

    本篇文章将深入讲解如何使用`HttpURLConnection`类来模拟浏览器请求,并通过实例展示其在接口调用中的应用。 首先,`HttpURLConnection`是`java.net.URLConnection`的一个子类,用于处理HTTP协议。在使用`...

    HttpClient和HttpsUrlConnection

    在Android开发中,访问Web服务是常见的需求,尤其是与服务器进行数据交互时。HttpClient和HttpsUrlConnection是Android系统中用于实现HTTP和HTTPS请求的两个主要工具。本文将深入探讨这两种方式,以及它们在处理...

    java client访问https server(客户端代码、服务器端配置)

    Java客户端访问HTTPS服务器涉及到的是网络安全通信中的SSL/TLS协议,主要目的是确保数据传输的安全性,防止数据被篡改或窃取。在这个过程中,Java的JSSE(Java Secure Socket Extension)框架提供了实现HTTPS通信的...

    java网络编程(中文)

    Java网络编程是Java开发中的重要领域,它涵盖了网络通信的所有基本概念和技术,使得Java应用程序能够通过互联网进行数据传输和交互。本教程详细介绍了这一主题,旨在帮助初学者和有一定经验的开发者深入理解Java网络...

    Java连接实现代码 (JAVA代码和VC代码 已更正)

    Java可以用来开发自己的VPNs,通过隧道技术将私有网络连接到公共网络,实现安全的远程访问。 综上所述,"Java连接实现代码"可能涵盖了上述多种网络连接技术,对于抓取Google数据这样的任务,可能使用了HTTP或HTTPS...

    Java_Advanced_Programming_Internet_Access_code.rar_java programm

    同时,Java也提供了SSL/TLS支持,通过HttpsURLConnection进行安全的HTTPS通信,防止数据在传输过程中被窃取或篡改。 七、实战案例 "InternetAccess"项目可能包含了实现上述功能的示例代码,例如,创建一个简单的...

    Java发https请求证书问题

    - 以上两行代码的作用是告诉 Java 虚拟机信任 `tomcat.keystore` 中的证书,并使用指定的密码访问密钥库。 5. **发送 HTTPS 请求**: - 使用上述配置后的环境发送 HTTPS 请求,此时应该能正确地与服务器建立安全...

    Java与网络编程.rar

    Java的`Thread`类和`Runnable`接口使得创建和管理线程变得简单。 4. URL和URLConnection:除了套接字编程,Java还提供了`java.net.URL`和`java.net.URLConnection`类,用于访问和操作网络资源,如下载文件或执行...

    java网络编程

    Java网络编程是Java开发中的重要领域,它涉及如何在不同设备之间通过网络交换数据。Java提供了丰富的API,如Socket、ServerSocket、URL、HttpURLConnection等,使得开发者能够创建高效的网络应用。以下是一些关于...

    Java网络编程基础用法详解.rar

    - Java网络编程主要依赖于Java的`java.net`和`java.io`包,它们提供了丰富的类和接口来处理网络连接。 - `Socket`和`ServerSocket`是Java网络编程的核心类,分别用于客户端和服务器端通信。 2. **TCP和UDP协议** ...

    java网络编程相关知识

    - **多路复用I/O(Multiplexing I/O)**:Java的Selector和Channel接口实现了I/O多路复用,通过一个线程监视多个连接。 4. **多线程与并发** - **线程池**:ExecutorService接口和ThreadPoolExecutor类用于管理...

    图像传输java

    - **输入/输出流**:`java.io.InputStream`和`java.io.OutputStream`是处理I/O的基本接口,可以用于读取和写入文件、网络连接等。 4. **网络传输**: - **HTTP协议**:使用`java.net.HttpURLConnection`或第三方...

    java_proxy_end

    这个代理服务可能被设计为一个灵活且安全的解决方案,允许开发者通过Java代码来控制网络通信,比如转发请求,进行数据过滤或者添加额外的安全层。以下是关于Java中实现代理服务的一些关键知识点: 1. **Java Proxy ...

    Java网络编程实例

    Java网络编程是Java开发中的重要组成部分,它允许程序通过网络发送和接收数据,实现与远程服务器的交互。在本教程中,我们将深入探讨Java如何进行网络编程,主要围绕"访问网络资源实例"和"Applet编程实例"这两个主题...

    多线程小项目源代码(Java)

    2. **线程控制**:Java提供了一些方法来控制线程的行为,如`start()`启动线程,`sleep()`让线程休眠,`join()`等待线程完成,以及`synchronized`关键字用于同步访问共享资源。 3. **线程通信与协作**:`wait()`, `...

Global site tag (gtag.js) - Google Analytics