• 关于

    java登录扩展

    的搜索结果

问题

php如何实现获取本地域帐号而不用输入用户名和密码登录网站?

落地花开啦 2019-12-01 20:01:50 1883 浏览量 回答数 1

回答

1、Java编程思想,入门2、可以学习新的Java Spring. Boot 2.0,这个也有阿里的直播课程,全系列。有地址。3、扩展学习Java大数据、微服务、分布式架构等高级知识。4、有空也可以扩展看看NoSQL数据库,MongoDBLinux等最新《阿里巴巴Java Spring Boot 2.0开发实战课程》持续更新 完全免费第01课:Spring Boot2.0新特性和入门实战,https://yq.aliyun.com/live/583 第02课:Spring Boot2.0开发MVC网站并显示图片,https://yq.aliyun.com/live/592第03课:Spring Boot2.0实战MySQL和3个高级面试题,https://yq.aliyun.com/live/612第04课:Spring Boot2.0实战MVC用户登录和注册和Java面试题https://yq.aliyun.com/live/644第05课:Spring Boot2.0实战三层MVC架构实战与架构分层误区(Java面试题)https://yq.aliyun.com/live/655第06课:Spring Boot2.0实战MyBatis与优化(Java面试题)https://yq.aliyun.com/live/687第07课:Spring Boot2.0安全机制、漏洞与MVC身份验证实战(Java面试题) https://yq.aliyun.com/live/712第08课:Spring Boot2.0自动化配置机制解析(Java面试题) 课件 PPT下载 https://yq.aliyun.com/live/729第09课:Spring Boot2.0实战MongoDB4.0(MongoDB面试题) https://yq.aliyun.com/live/782第10课:Spring Boot2.0实战高并发缓存Redis面试题) https://yq.aliyun.com/live/791第11课:Spring Boot2.0实战RabbitMQ中间件与API原理解析 https://yq.aliyun.com/live/806第12课:Spring Boot2.0性能监控实战与Actuator机制解析 https://yq.aliyun.com/live/815第13课:Spring Boot2.0性能监控实战ElasticSearch搜索引擎中间件 https://yq.aliyun.com/live/844第14课:Spring Boot 2.0实战MyBatis连接池阿里Druid与SQL性能监控 https://yq.aliyun.com/live/855第15课:Spring Boot 2.0 API接口实战Swagger和Spring REST Docs帮助文档 https://yq.aliyun.com/live/859第16课:Spring Boot 2.0实战Apache Kafka百万级高并发消息中间件 https://yq.aliyun.com/live/868

徐雷frank 2019-12-02 01:57:27 0 浏览量 回答数 0

回答

动态代理:在运行时,创建目标类,可以调用和扩展目标类的方法。 Java 中实现动态的方式:JDK 中的动态代理 和 Java类库 CGLib            当想要给实现了某个接口的类中的方法,加一些额外的处理,比如加日志,加事务,加权限,Spring的AOP等。 应用场景如: 统计每个 api 的请求耗时 统一的日志输出 校验被调用的 api 是否已经登录和权限鉴定 Spring的 AOP 功能模块就是采用动态代理的机制来实现切面编程  

问问小秘 2020-01-03 14:08:00 0 浏览量 回答数 0

阿里云高校特惠,助力学生创业梦!0元体验,快速入门云计算!

学生动手场景应用,快速了解并掌握云服务器的各种新奇玩法!

问题

Shiro认证(加密出错)的问题,请高手解决,在线等,急!?报错

爱吃鱼的程序员 2020-06-14 18:39:25 0 浏览量 回答数 1

回答

  MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。   我们可以从这里下载该项目的实例代码,并且可以找到一个采用PHP书写的服务器端实现。   架构如下所示:   wmqtt.jar 是IBM提供的MQTT协议的实现。你可以从如下站点下载它。你可以将该jar包加入你自己的Android应用程序中。   Really Small Message Broker (RSMB) ,他是一个简单的MQTT代理,同样由IBM提供。缺省打开1883端口,应用程序当中,它负责接收来自服务器的消息并将其转发给指定的移动设备。   SAM是一个针对MQTT写的PHP库。你可以从这个下载它.   send_mqtt.php是一个通过POST接收消息并且通过SAM将消息发送给RSMB的PHP脚本。   实例代码:   Ø 采用XMPP协议实现Android推送   这是我在项目中采用的方案。事实上Google官方的C2DM服务器底层也是采用XMPP协议进行的封装。   XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。   androidpn是一个基于XMPP协议的java开源Android push notification实现。它包含了完整的客户端和服务器端。经过源代码研究我发现,该服务器端基本是在另外一个开源工程openfire基础上修改实现的,不过比较郁闷的是androidpn的文档是由韩语写的,所以整个研究过程基本都是读源码。它的实现示意图如下:   androidpn客户端需要用到一个基于java的开源XMPP协议包asmack,这个包同样也是基于openfire下的另外一个开源项目smack,不过我们不需要自己编译,可以直接把androidpn客户端里面的asmack.jar拿来使用。客户端利用asmack中提供的XMPPConnection类与服务器建立持久连接,并通过该连接进行用户注册和登录认证,同样也是通过这条连接,接收服务器发送的通知。   androidpn服务器端也是java语言实现的,基于openfire开源工程,不过它的Web部分采用的是spring框架,这一点与openfire是不同的。Androidpn服务器包含两个部分,一个是侦听在5222端口上的XMPP服务,负责与客户端的XMPPConnection类进行通信,作用是用户注册和身份认证,并发送推送通知消息。另外一部分是Web服务器,采用一个轻量级的HTTP服务器,负责接收用户的Web请求。服务器架构如下:   最上层包含四个组成部分,分别是SessionManager,Auth Manager,PresenceManager以及Notification Manager。SessionManager负责管理客户端与服务器之间的会话,Auth Manager负责客户端用户认证管理,Presence Manager负责管理客户端用户的登录状态,NotificationManager负责实现服务器向客户端推送消息功能。   服务器端界面如下,分别对应了上述的几个功能模块:   发送以后,我们可以在手机端看到接收的消息:    答案来源网络,供参考,希望对您有帮助

问问小秘 2019-12-02 02:20:50 0 浏览量 回答数 0

回答

好久没有上来了,关于几个问题我是这么想的: 1. BeanUtils类用的java反射机制来实现,参考过commons和spring中的相关类,没有基于get和set方法是考虑灵活性。因为我有时会用它操作一些第三方包的类,这些类可能不提供get和set方法,这是双刃剑,用的时候是需要小心。 2. 这一块的封装是基于我以往项目的常见场景,我大多做的都是后台管理系统。UI框架选型DWZ也是因为如此,适合做后台管理系统的快速开发。你说的几种情况可以扩展或覆盖已有的组件来实现,User、Organ、Actor、Role都是基于最简属性构建的基类,到实际应用是需要扩展属性的。登录方法以及相关组件都是基于spring的组件注入的,你可以修改、覆盖甚至直接用新的组件替代。 3. 关于XSS注入问题,我个人觉得不是在封装宏这个层面来解决的。 近半年时间因为工作没用到的关系,没有对coo进行持续的改进。coo会改造成基于spring boot的,可以应用到spring cloud微服务架构中去。另外,UI这块备受争议,我考虑做成前后端分离,不再集成UI框架,只提供API接口。coo是个人积累的应用框架,基本上都是我自己带队的产品和项目才会使用。你最好不要直接使用,可以将里面一些你觉得好的机制或组件移植到你自己的框架中去。

kun坤 2020-06-03 14:43:23 0 浏览量 回答数 0

回答

解决 根据命名规则获取文件名/URL 登录 媒体处理控制台 > 媒体管理 > 媒体库设置 > 工作流,选择所需的工作流,并单击右侧的 查看。移动鼠标到转码/截图等模块,可以看到对应的输出bucket截输出路径,对应的输出文件名就是输出路径,其中自定义变量替换为具体的值即可。对应的URL为:Bucketname.Endpoint/输出路径.后缀。 2 注意: 输出Object中可以设置静态常量和变量,其中静态常量即直接编写,而动态变量需要通过大括号({})引用使用。输出 Object 中可选如下变量: {RunId}: 媒体工作流执行ID; {ObjectPrefix}: 不含Bucket信息的原文件路径; {FileName}: 不含扩展名的原文件名; {ExtName}: 原文件扩展名; Endpoint的意义,参见 Endpoint设置。 控制台获取文件名/URL 登录 媒体处理控制台 > 媒体库,选择所需的视频,并单击 管理 > 媒体地址获取 > TRANSCODE > 复制,即可获取。 2 程序获取文件名/URL 在工作流中配置消息服务的队列或者通知(参见获取工作流通知消息实例。)> 业务端消费对应的消息 > 当收到相应工作流实例“Report”消息,代表转码结束 > 根据输入Object的URL或者媒体ID(MediaId),调用媒体转码API接口。接口参见 查询媒体-使用OSS文件地址 和 查询媒体-使用媒体ID。 根据输入ObjectURL查询转码结果,Java代码示例: static QueryMediaListByURLResponse queryMediaListByURL(DefaultAcsClient client) { QueryMediaListByURLRequest request = new QueryMediaListByURLRequest(); request.setFileURLs(objecturl); request.setIncludePlayList(true); QueryMediaListByURLResponse response = null; try { response = client.getAcsResponse(request); } catch (ServerException e) { throw new RuntimeException("QueryMediaListByURLRequest Server failed"); } catch (ClientException e) { throw new RuntimeException("QueryMediaListByURLRequest Client failed"); } return response; } 根据输入媒体ID查询转码结果,Java代码示例: static QueryMediaListResponse QueryMediaList(DefaultAcsClient client) { QueryMediaListRequest request = new QueryMediaListRequest(); request.setMediaIds("媒体ID"); request.setIncludePlayList(true); QueryMediaListResponse response = null; try { response = client.getAcsResponse(request); } catch (ServerException e) { throw new RuntimeException("QueryMediaListRequest Server failed"); } catch (ClientException e) { throw new RuntimeException("QueryMediaListRequest Client failed"); } return response; } 执行工作流输出文件怎么没有提供CDN地址 场景 视频上传,工作流转码任务触发后,在 媒体处理控制台 > 媒体库 > 管理 > 媒体地址获取 > 媒体地址 不显示媒资文件对应的CDN地址。 3 解决 编辑或者删除对应的工作流,重新配置工作流,在 配置工作流 > 配置内容分发网络(CDN) 中添加CDN加速域名。之后该工作流新创建的转码任务中,新增的CDN域名就会显示在输出文件的URL地址中。 2 原因 只有在新建工作流配置中有CDN域名,对应转码输出后的资源才会带CDN域名地址的链接,如果当时创建工作流不存在CDN域名,之后在bucket中绑定域名并进行加速,这样的域名是不会在输出媒体地址中显示的。 注意事项 媒体地址获取中,原文件地址获取是不能获取到CDN地址的,用户需自己绑定或者代码实现将bucket域名替换为对应的CDN域名。 2 输出文件支持如下变量设置 输出 Object 中可选如下变量: {RunId}:媒体工作流执行ID {ObjectPrefix}:不含Bucket信息的原文件(输入文件)路径 {FileName}:不含扩展名的原文件(输入文件)名 {ExtName}:原文件(输入文件)扩展名 如何触发工作流的执行 当工作流的配置的输入Bucket路径中存在文件的增量输入,对应的工作流就会被触发,进行相关的转码截图任务等。 6 关于如何上传文件到工作流的输入Bucket路径中,参见上传视频文件的方法。

保持可爱mmm 2020-03-30 11:55:21 0 浏览量 回答数 0

回答

引用来自“AiryLinus”的评论 1. 装 PHP 的时候记得装 PDO 扩展和 PDO_PGSQL 扩展,在安装  drupal, wordpress, phpbb 的时候选择使用 PDO_PGSQL 驱动。 2. 单独装 phppgadmin 就下载 php 代码包,自己新建 nginx 虚拟主机或者放到 web 根目录下面的某个子目录。 多谢6楼,终于得到一个答案! 同时多谢大家的捧场和建议,这次本人就要钻牛角尖,所以决定 postgresql 一条路走到黑了 ^^; 另外,我一边作环境一边把过程记录下来,我觉得对本身是大有益处的。或者过后在把整理出来的内容发给大家,希望对同道们有些帮助 ###### PHP+MySQL是黄金搭档,不喜欢Oracle,你可以用MariaDB或者Percona Server。 另外WordPress默认只支持MySQL数据库,还有国内很多PHP程序也都使用MySQL的,比如Discuz!  编译过PHP你就知道,PHP现在都是在内置MySQL数据库驱动mysqlnd,数据库连接和操作性能更好,另外还针对MySQL开发了mysqli扩展,提供一系列MySQL操作函数,从phpMyAdmin也可以看到PHP对MySQL的控制能力。另外MySQL管理程序HeidiSQL、MySQL-Front、MySQL Workbench都很不错,不输于PGAdmin3。 ######用nativecat吧,如果没安装桌面的话,安装 PGAdmin3干嘛,既然在虚拟机,可以在物理机安装PGAdmin3或者nativecat,ssh登录啊######哦,原来是劝我改行啊! 不过暂时还不想改呀... ###### PHP除了MySQL外,对其他数据库支持都不好。 这里说的不好,指得一个是数据库扩展的功能和性能上的跟进(比如PHP针对MySQL驱动做了特殊优化,对其他数据库则没有),其他数据库在PHP里都是二等公民;其次是PHP不支持连接池,对Pg、Oracle等进程型数据库来说是不能接受的;最后,也是最重要的,社区支持。你几乎找不到PHP和其他数据库配合使用的代码和项目、讨论等,比如你要找JAVA和Oracle,MySQL,H2,Sqlite等搭配,.NET和MSSQL,MySQL等搭配的文章,烂大街,但你找PHP,只能找到PHP+MySQL的文章或软件。遇到问题基本也是孤军奋战。 所以说,虽然理论上PHP支持各种数据库,但现实是,PHP只能搭配MySQL。 说完PHP,再说PG。PG在日本和对日外包中用的多,国内很少很少。 ######如果不允许盗版,PG就会多起来的了, MySQL有它水土不服的领域。######PHP内置SQLite3数据库和MySQL数据库驱动,当然连接其他数据库也完全可以,使用PDO也很方便:http://us.php.net/manual/zh/refs.database.php###### 果断 MySQL,还用说吗?! 你想学 php,就专注在上面,不要搞七搞八的。 ###### 1. 装 PHP 的时候记得装 PDO 扩展和 PDO_PGSQL 扩展,在安装 drupal, wordpress, phpbb 的时候选择使用 PDO_PGSQL 驱动。 2. 单独装 phppgadmin 就下载 php 代码包,自己新建 nginx 虚拟主机或者放到 web 根目录下面的某个子目录。 ######支持楼主######呵呵,推荐mysql这种垃圾的也不知道是什么心理

kun坤 2020-06-04 11:20:25 0 浏览量 回答数 0

回答

拿PHP提供的session来说,默认使用的是文件存储的方式,会话文件就保存在当前的服务器,一般是/tmp下: session.save_handler=files session.save_path=/tmp PHP的会话机制会给客户端设置一个cookie用来保存sesseion_id,对应服务器上的会话文件/tmp/sess_ sesseion_id 把这些session绑定在本机的Web应用放到 Nginx的upstream应用集群应该是不合适的,就算 设置ip_hash让固定IP只访问一个后端, 但如果客户端IP在会话中改变,那就有可能连上后端其他的服务器,这样会导致找不到会话. 还有如果这台后端服务器宕机,那用户的会话也会丢失. 所以最好还是自己用cookie实现一套适合自己的session机制,比如用mysql内存表或者memcached来保存cookie对应的会话数据,非关键和不敏感的数据直接设置cookie保存到客户端,这样会话数据就不会存储在具体的应用服务器上,方便了使用Nginx的 upstream进行php-fpm应用服务器集群扩展. 引用来自“eechen”的答案 拿PHP提供的session来说,默认使用的是文件存储的方式,会话文件就保存在当前的服务器,一般是/tmp下: session.save_handler=files session.save_path=/tmp PHP的会话机制会给客户端设置一个cookie用来保存sesseion_id,对应服务器上的会话文件/tmp/sess_ sesseion_id 把这些session绑定在本机的Web应用放到 Nginx的upstream应用集群应该是不合适的,就算 设置ip_hash让固定IP只访问一个后端, 但如果客户端IP在会话中改变,那就有可能连上后端其他的服务器,这样会导致找不到会话. 还有如果这台后端服务器宕机,那用户的会话也会丢失. 所以最好还是自己用cookie实现一套适合自己的session机制,比如用mysql内存表或者memcached来保存cookie对应的会话数据,非关键和不敏感的数据直接设置cookie保存到客户端,这样会话数据就不会存储在具体的应用服务器上,方便了使用Nginx的 upstream进行php-fpm应用服务器集群扩展. 回复 @eechen:同样多谢大神,我刚开始学习nginx,太复杂的话反而我怕造成其他问题,ip_hase这样的方式也算是适合我们想在的系统环境了,不是完全“均衡”的负载,但是也能分担单个节点压力,存在节点的宕机风险导致部分用户无法使用,也好过现在单个节点承受的风险,是不是这个道理哈~~这个你最好问下Tengine作者 @shudu,看看有没有可行的方法。把内网特定的IP段用Nginx分流到后端Tomcat上,可以试着这样干: server{if($remote_addr=192.168.0.20){location~\.(jsp|do)${proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$remote_addr;proxy_set_headerHost$host;proxy_passhttp://192.168.0.1:8080;}}} 把来自192.168.0.20的jsp和do请求proxy给后面192.168.0.1的服务器。 条件$remote_addr 那里可以用正则匹配一个IP段,这样应该就可以把该IP段的动态请求导到指定的Tomcat服务器上。后台系统是java吗?回复 @夏天198801:不一定非要序列化,可以后台转换成json,存入memcached,取出json再映射成session回复 @屁屁果:额,这个之前试过,但是后来发现tomcat里面有一个工程的session没有序列化,做不了session共享,上面描述问题里面我也提到过了,我们的开发不好协调,找他们做session序列化没做好回复 @夏天198801:可以扩展tomcat,实现容器级别的session共享,就和应用没有关系了http://www.9iu.org/2011/11/25/tomcat-memcached-session-sso.html是啊,后台是java,容器是tomcat 可以把session托管到memcache或者redis嘛 推荐你使用Tengine: 1、使用Tengine的consistent_hash功能,以你的登录的cookie为key,这样的话一个固定的用户(登录cookie值)可以hash到一台固定的机器上。 2、如果没有登录(即没有登录cookie),则使用round-robin方式(默认的负载均衡方式)。 3、你可以使用if来判断cookie值是否为空。兼容从nginx转tengine有无什么限制?都兼容么?赞一个mark客户端服务器session是靠浏览器cookie维持的,每次去请求都会带一个参数SESSIONID。so...只要把nginx的分发策略设置为根据cookie中的SESSIONID来分发。可以满足你的需求。只要第一次登陆(不管ip是否登陆过)都会走负载,重新分配节点;如果已经访问过(带cookie)则可以保证分配到同一节点。QQ:875881559欢迎交流

爱吃鱼的程序员 2020-06-22 14:22:45 0 浏览量 回答数 0

回答

装 PHP 的时候记得装 PDO 扩展和 PDO_PGSQL 扩展,在安装 <span style=""font-family:Verdana, sans-serif, 宋体;font-size:14px;line-height:22px;background-color:#FFFFFF;"">drupal, wordpress, phpbb 的时候选择使用 PDO_PGSQL 驱动。 <span style=""font-family:Verdana, sans-serif, 宋体;font-size:14px;line-height:22px;background-color:#FFFFFF;"">2. 单独装 <span style=""font-family:Verdana, sans-serif, 宋体;font-size:14px;line-height:22px;background-color:#FFFFFF;"">phppgadmin 就下载 php 代码包,自己新建 nginx 虚拟主机或者放到 web 根目录下面的某个子目录 ###### PHP+MySQL是黄金搭档,不喜欢Oracle,你可以用MariaDB或者Percona Server。 另外WordPress默认只支持MySQL数据库,还有国内很多PHP程序也都使用MySQL的,比如Discuz!  编译过PHP你就知道,PHP现在都是在内置MySQL数据库驱动mysqlnd,数据库连接和操作性能更好,另外还针对MySQL开发了mysqli扩展,提供一系列MySQL操作函数,从phpMyAdmin也可以看到PHP对MySQL的控制能力。另外MySQL管理程序HeidiSQL、MySQL-Front、MySQL Workbench都很不错,不输于PGAdmin3。 ######用nativecat吧,如果没安装桌面的话,安装 PGAdmin3干嘛,既然在虚拟机,可以在物理机安装PGAdmin3或者nativecat,ssh登录啊 ###### PHP除了MySQL外,对其他数据库支持都不好。 这里说的不好,指得一个是数据库扩展的功能和性能上的跟进(比如PHP针对MySQL驱动做了特殊优化,对其他数据库则没有),其他数据库在PHP里都是二等公民;其次是PHP不支持连接池,对Pg、Oracle等进程型数据库来说是不能接受的;最后,也是最重要的,社区支持。你几乎找不到PHP和其他数据库配合使用的代码和项目、讨论等,比如你要找JAVA和Oracle,MySQL,H2,Sqlite等搭配,.NET和MSSQL,MySQL等搭配的文章,烂大街,但你找PHP,只能找到PHP+MySQL的文章或软件。遇到问题基本也是孤军奋战。 所以说,虽然理论上PHP支持各种数据库,但现实是,PHP只能搭配MySQL。 说完PHP,再说PG。PG在日本和对日外包中用的多,国内很少很少。 2. 单独装 phppgadmin 就下载 php 代码包,自己新建 nginx 虚拟主机或者放到 web 根目录下面的某个子目录。

一枚小鲜肉帅哥 2020-05-28 13:33:16 0 浏览量 回答数 0

问题

移动干货分享:APP应用如何把图片存到云存储服务器中?

笑傲江虎 2019-12-01 21:35:15 9988 浏览量 回答数 2

回答

window下还要用emacs,真是苦逼了~######我也是没办法我不是开发人员我只是个爱好者,还在读书,学习教学的都是基于win平台,就好像全中国的都用qq.我就算不喜欢但是跟别人交流也只能使用qq咯.######搞Java啊?爱好者?那还是用Eclipse吧。######@云溪 : 只要你有信心,就坚持下去吧。 我最开始接触Emasc的时候,朋友跟我说,它比我的年龄还大。哈哈。######@puras : emacs的远程功能能替代我使用其他远程软件,emacs的dired模式能替代linux下的文件管理命令,emacs有shell模式,emacs有上网 播放MP3功能等等所以我真的很喜欢这个瑞士军刀######@云溪 : Emacs确实是个好东西,以前我还用过好久呢。不过开发Java,还是用Eclipse之类的IDE要快一些######我很喜欢emacs的定制性,并且我是个懒人,不喜欢经常换开发软件, 普通的用emacs写java是没什么问题的了,只是想进行扩展,拥有一些IDE的功能而已.######这样折腾为什么不直接用Linux呢?OpenJDK很好的 ######linux下的话我也是面临这个问题,只是系统换了而已,linux+emacs23+openJDK 如何成为开发环境 首先我会使用emacs编辑java并且会进入shell模式调用java工具进行编译,不过我自己是想emacs具有IDE的某些功能,所以想进行扩展~~~需要用到的软件包我都下载好了就是不会配置######你如果不是长期的emacs忠实用户,习惯了用它快速编辑文本,则完全没必要选择emacs。 你应该选择一个主流IDE,比如Eclipse, IntelliJ IDEA, Netbeans。 我想你之所以会听到这个东西,可能是问了某个“所谓”的高手,推荐了你个装B的做法。 其实对于真正的程序员来说,如果你的打字速度制约你的开发速度,只能说明你做的工作还停留在Ctrl+C Ctrl+V的阶段######@吀夜 : 这个我修改的键盘键位用得正爽呢.vi不是不好啊,问题是我已经有emacs了,我不能始乱终弃!######@云溪 : 可爱的少年,用鼠标会打断你的思路,难道Ctrl,Alt,Shift这些边缘按键不会打断你的思路? 回到Vi的怀抱吧,少年######其实我使用Emacs其中有一个很重要的原因那就是我很讨厌鼠标,经常使用鼠标点击按键会有一种打断思路的感觉.######有你把emacs折腾好,折腾完善的时间,你都不知道能开发多少个java项目出来了 不要为了使用emacs而去使用emacs,少年!######emacs就像毒药,我无药可救了........,你还是放弃我吧- -######想清楚了..Emacs投入的成本非常大,因为你要为这东西学习一门语言(elisp),而且你在Windows用得到的回报少得可怜。这里还是不计较损失了编译型语言的即时错误提示。 如果刚入门+下定决心要学习的话,可以找我拿点资料:)  ######@Sanatir : 你的资料我下载了,我的问题虽然还没解决,不过还是说声谢谢.######@云溪 : 并不是说emacs和elisp在win下用得少,只不过使用体验不同而已。另外,我自己用得不多,不能给予多大帮助XD..######反正我是那种越折腾越痛快的人,不折腾浑身不舒服,至于你说的win下能用emacs跟elisp的地方很少,我是win7系统,vmware虚拟机,我是想使用emacs的远程功能去操作linux虚拟机的,win下的emacs远程问题我到现在还没搞定呢,我现在是使用putty远程登录linux的shell,然后在shell打开emacs的,其实说什么都是假,想找个人指点下才是真的.怎样找你要资料?######CEDET的安装方法: You can install all these packagees at once with the CEDET build and install scripts: 1) Copy source files somewhere. 2) Byte compile    There are several ways to get CEDET compiled:    a) make    b) make EMACS=<your favorite emacs>     You might also have trouble with makeinfo.  If you need to upgrade     makeinfo, you can do this:   c) make MAKEINFO=/usr/local/bin/makeinfo     Note: For speedbar, and older versions of Emacs, you may also need           to byte-compile the version of INFO and RMAIL that come with           your version of emacs.   d) make MAKEINFO=echo     To skip making the doc.   e) cedet-build.el     If you do not have "make", are on Windows, or otherwise cannot use     the Makefiles, you can build CEDET from within Emacs.  See the     commentary in cedet-build.el 以下我对yasnippet的配置,或许对你有用 ;;yasnippet设置 ;;web site: http://code.google.com/p/yasnippet/ (add-to-list 'load-path                   "~/.emacs.d/plugins/yasnippet") (require 'yasnippet) ;; not yasnippet-bundle (yas/initialize) (yas/load-directory "~/.emacs.d/plugins/yasnippet/snippets")######JAVA,Eclipse王道 ######@云溪 : 加油######我就想用而已我有不是让人看我多厉害######装B######emacs是什么道?######楼主想用Emacs就用吧,做好孤独的准备 ######我的同学个个都用ide~就我自己用emacs,我确实是被孤立了,我不懂只能自己找答案,同学有时候会鄙视我,说我装模作样的呢,可问题emacs我觉得真的很优秀,我很喜欢.######为什么不来最简单的,用emacs编辑好源文件,命令行下编译就是了 BTW.楼主忽视那些苦口婆心劝你不要用emacs换这个IDE那个IDE的吧,你现在学会了emacs,一辈子都是你的技能.而所有的IDE都可以在你以后工作之后很快学会.在学校,多学一点是一点.在学校,时间往往很多,知识一般不够多.你感兴趣的,就去学.管别人怎么说,说你装逼也罢,二逼也好,和他解释那么多,不如多记两个emacs命令.哈哈哈.... 以上的所有"emacs"都可以换成"vim".######嗯我一直都坚持自己的想法~~,直接编译我已经会了,不过就是如果代码多了的话是需要IDE这些东西的,况且我也是想学习怎么配置呵呵.

kun坤 2020-06-05 13:16:50 0 浏览量 回答数 0

回答

"window下还要用emacs,真是苦逼了~######我也是没办法我不是开发人员我只是个爱好者,还在读书,学习教学的都是基于win平台,就好像全中国的都用qq.我就算不喜欢但是跟别人交流也只能使用qq咯.######搞Java啊?爱好者?那还是用Eclipse吧。######<a href=""http://my.oschina.net/PokerFace"" class=""referer"" target=""_blank"">@云溪 : 只要你有信心,就坚持下去吧。 我最开始接触Emasc的时候,朋友跟我说,它比我的年龄还大。哈哈。######<a href=""http://my.oschina.net/puras"" class=""referer"" target=""_blank"">@puras : emacs的远程功能能替代我使用其他远程软件,emacs的dired模式能替代linux下的文件管理命令,emacs有shell模式,emacs有上网 播放MP3功能等等所以我真的很喜欢这个瑞士军刀######<a href=""http://my.oschina.net/PokerFace"" class=""referer"" target=""_blank"">@云溪 : Emacs确实是个好东西,以前我还用过好久呢。不过开发Java,还是用Eclipse之类的IDE要快一些######我很喜欢emacs的定制性,并且我是个懒人,不喜欢经常换开发软件, 普通的用emacs写java是没什么问题的了,只是想进行扩展,拥有一些IDE的功能而已.######这样折腾为什么不直接用Linux呢?OpenJDK很好的 ######linux下的话我也是面临这个问题,只是系统换了而已,linux+emacs23+openJDK 如何成为开发环境 首先我会使用emacs编辑java并且会进入shell模式调用java工具进行编译,不过我自己是想emacs具有IDE的某些功能,所以想进行扩展~~~需要用到的软件包我都下载好了就是不会配置###### 你如果不是长期的emacs忠实用户,习惯了用它快速编辑文本,则完全没必要选择emacs。 你应该选择一个主流IDE,比如Eclipse, IntelliJ IDEA, Netbeans。 我想你之所以会听到这个东西,可能是问了某个“所谓”的高手,推荐了你个装B的做法。 其实对于真正的程序员来说,如果你的打字速度制约你的开发速度,只能说明你做的工作还停留在Ctrl+C Ctrl+V的阶段###### @吀夜 : 这个我修改的键盘键位用得正爽呢.vi不是不好啊,问题是我已经有emacs了,我不能始乱终弃!###### @云溪 : 可爱的少年,用鼠标会打断你的思路,难道Ctrl,Alt,Shift这些边缘按键不会打断你的思路? 回到Vi的怀抱吧,少年######其实我使用Emacs其中有一个很重要的原因那就是我很讨厌鼠标,经常使用鼠标点击按键会有一种打断思路的感觉.###### 有你把emacs折腾好,折腾完善的时间,你都不知道能开发多少个java项目出来了 不要为了使用emacs而去使用emacs,少年!######emacs就像毒药,我无药可救了........,你还是放弃我吧- -###### 想清楚了..Emacs投入的成本非常大,因为你要为这东西学习一门语言(elisp),而且你在Windows用得到的回报少得可怜。这里还是不计较损失了编译型语言的即时错误提示。 如果刚入门+下定决心要学习的话,可以找我拿点资料:)  ###### @Sanatir : 你的资料我下载了,我的问题虽然还没解决,不过还是说声谢谢.###### @云溪 : 并不是说emacs和elisp在win下用得少,只不过使用体验不同而已。另外,我自己用得不多,不能给予多大帮助XD..######反正我是那种越折腾越痛快的人,不折腾浑身不舒服,至于你说的win下能用emacs跟elisp的地方很少,我是win7系统,vmware虚拟机,我是想使用emacs的远程功能去操作linux虚拟机的,win下的emacs远程问题我到现在还没搞定呢,我现在是使用putty远程登录linux的shell,然后在shell打开emacs的,其实说什么都是假,想找个人指点下才是真的.怎样找你要资料?###### CEDET的安装方法: You can install all these packagees at once with the CEDET build and install scripts: 1) Copy source files somewhere. 2) Byte compile    There are several ways to get CEDET compiled:    a) make    b) make EMACS=<your favorite emacs>     You might also have trouble with makeinfo.  If you need to upgrade     makeinfo, you can do this:   c) make MAKEINFO=/usr/local/bin/makeinfo     Note: For speedbar, and older versions of Emacs, you may also need           to byte-compile the version of INFO and RMAIL that come with           your version of emacs.   d) make MAKEINFO=echo     To skip making the doc.   e) cedet-build.el     If you do not have "make", are on Windows, or otherwise cannot use     the Makefiles, you can build CEDET from within Emacs.  See the     commentary in cedet-build.el 以下我对yasnippet的配置,或许对你有用 ;;yasnippet设置 ;;web site: http://code.google.com/p/yasnippet/ (add-to-list 'load-path                   "~/.emacs.d/plugins/yasnippet") (require 'yasnippet) ;; not yasnippet-bundle (yas/initialize) (yas/load-directory "~/.emacs.d/plugins/yasnippet/snippets")######JAVA,Eclipse王道 ###### @云溪 : 加油######我就想用而已~~我有不是让人看我多厉害~~######装B######emacs是什么道?######楼主想用Emacs就用吧,做好孤独的准备 ######我的同学个个都用ide~~~就我自己用emacs,我确实是被孤立了,我不懂只能自己找答案,同学有时候会鄙视我,说我装模作样的呢,可问题emacs我觉得真的很优秀,我很喜欢.###### 为什么不来最简单的,用emacs编辑好源文件,命令行下编译就是了~~ BTW.楼主忽视那些苦口婆心劝你不要用emacs换这个IDE那个IDE的吧,你现在学会了emacs,一辈子都是你的技能.而所有的IDE都可以在你以后工作之后很快学会.在学校,多学一点是一点.在学校,时间往往很多,知识一般不够多.你感兴趣的,就去学.管别人怎么说,说你装逼也罢,二逼也好,和他解释那么多,不如多记两个emacs命令.哈哈哈.... 以上的所有"emacs"都可以换成"vim".######嗯我一直都坚持自己的想法~~,直接编译我已经会了,不过就是如果代码多了的话是需要IDE这些东西的,况且我也是想学习怎么配置呵呵." ![image.png](https://ucc.alicdn.com/pic/developer-ecology/4c6836169d074e608530252736da036d.png)

python小菜菜 2020-06-02 17:32:44 0 浏览量 回答数 0

问题

java 进销存 crm websocket即时聊天发图片文字 好友群组 SSM源码

游客ydre72cd7ywew 2019-12-01 19:53:21 40 浏览量 回答数 0

回答

.推送方式基础知识:当我们开发需要和服务器交互的应用程序时,基本上都需要获取服务器端的数据,比如《地震应急通》就需要及时获取服务器上最新的地震信息。要获取服务器 上不定时更新的信息一般来说有两种方法,第一种是客户端使用Pull(拉)的方式,隔一段时间就去服务器上获取信息,看是否有更新的信息出现。第二种就是 服务器使用Push(推送)的方式,当服务器端有新信息了,则把最新的信息Push到客户端上。 虽然Pull和Push两种方式都能实现获取服务器端更新信息的功能,但是明显来说Push is better than pull。因为Pull方式更费客户端的网络流量,更主要的是费电量。  在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,我会在以后详细介绍IPhone中的解决方案,可是Android平台上实现起来却相对比较麻烦,最近利用几天的时间对Android的推送通知服务进行初步的研究。 在Android手机平台上,Google提供了C2DM(Cloudto Device Messaging)服务,起初我就是准备采用这个服务来实现自己手机上的推送功能。  Android Cloud to Device Messaging (C2DM)是一个用来帮助开发者从服务器向Android应用程序发送数据的服务。该服务提供了一个简单的、轻量级的机制,允许服务器可以通知移动应用程序直接与服务器进行通信,以便于从服务器获取应用程序更新和用户数据。C2DM服务负责处理诸如消息排队等事务并向运行于目标设备上的应用程序分发这些消息。关于C2DM具体使用过程,我会以后的博文中再详细介绍,这里大家先了解下大致方案情况。C2DM操作过程图:但是经过一番研究发现,这个服务存在很大的问题:1)C2DM内置于Android的2.2系统上,无法兼容老的1.6到2.1系统;2)C2DM需要依赖于Google官方提供的C2DM服务器,由于国内的网络环境,这个服务经常不可用,如果想要很好的使用,我们的App Server必须也在国外,这个恐怕不是每个开发者都能够实现的; 有了上述两个使用上的制约,导致我最终放弃了这个方案,不过我想利用另外一篇文章来详细的介绍C2DM的框架以及客户端和App Server的相应设置方法,可以作为学习与参考之用。 即然C2DM无法满足我们的要求,那么我们就需要自己来实现Android手机客户端与App Server之间的通信协议,保证在App Server想向指定的Android设备发送消息时,Android设备能够及时的收到。几种常见的解决方案1)轮询(Pull):应用程序应当阶段性的与服务器进行连接并查询是否有新的消息到达,你必须自己实现与服务器之间的通信,例如消息排队等。而且你还要考虑轮询的频率,如果太慢可能导致某些消息的延迟,如果太快,则会大量消耗网络带宽和电池。2)SMS(Push):在Android平台上,你可以通过拦截SMS消息并且解析消息内容来了解服务器的意图。这是一个不错的想法,我就见过采 用这个方案的应用程序。这个方案的好处是,可以实现完全的实时操作。但是问题是这个方案的成本相对比较高,你很难找到免费的短消息发送网关,关于这个方案的实现。3)持久连接(Push):这个方案可以解决由轮询带来的性能问题,但是还是会消耗手机的电池。Apple的推送服务之所以工作的很好,是因为每一 台手机仅仅保持一个与服务器之间的连接,事实上C2DM也是这么工作的。不过这个方案也存在不足,就是我们很难在手机上实现一个可靠的服务。Android操作系统允许在低内存情况下杀死系统服务,所以你的通知服务很可能被操作系统Kill掉了。 前两个方案存在明显的不足,第三个方案也有不足,不过我们可以通过良好的设计来弥补,以便于让该方案可以有效的工作。毕竟,我们要知道GMail,GTalk以及GoogleVoice都可以实现实时更新的。MQTT协议实现Android推送采用MQTT协议实现Android推送 MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。 wmqtt.jar 是IBM提供的MQTT协议的实现。我们可以从这里下载该项目的实例代码,并且可以找到一个采用PHP书写的服务器端实现。架构如下所示:wmqtt.jar 是IBM提供的MQTT协议的实现。我们可以从如下站点下载它。你可以将该jar包加入你自己的Android应用程序中。4.RSMB实现推送:Really Small Message Broker (RSMB) ,他是一个简单的MQTT代理,同样由IBM提供。缺省打开1883端口,应用程序当中,它负责接收来自服务器的消息并将其转发给指定的移动设备。SAM是一个针对MQTT写的PHP库。我们可以从这个下载它.send_mqtt.php是一个通过POST接收消息并且通过SAM将消息发送给RSMB的PHP脚本。Really Small Message Broker (RSMB) ,他是一个简单的MQTT代理,同样由IBM提供。缺省打开1883端口,应用程序当中,它负责接收来自服务器的消息并将其转发给指定的移动设备。XMPP协议实现Android推送这是我在项目中采用的方案。事实上Google官方的C2DM服务器底层也是采用XMPP协议进行的封装。 XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。关于XMPP协议我在上篇博文中已经介绍,大家可以参考:http://www.cnblogs.com/hanyonglu/archive/2012/03/04/2378956.htmlandroidpn是一个基于XMPP协议的java开源Android push notification实现,我会在以后的博文中详细介绍androidpn。它包含了完整的客户端和服务器端。经过源代码研究我发现,该服务器端基本是在另外一个开源工程openfire基础上修改实现的,不过比较郁闷的是androidpn的文档是由韩语写的,所以整个研究过程基本都是读源码。实现意图如下图所示:androidpn 客户端需要用到一个基于java的开源XMPP协议包asmack,这个包同样也是基于openfire下的另外一个开源项目smack,不过我们不需要 自己编译,可以直接把androidpn客户端里面的asmack.jar拿来使用。客户端利用asmack中提供的XMPPConnection类与服 务器建立持久连接,并通过该连接进行用户注册和登录认证,同样也是通过这条连接,接收服务器发送的通知。androidpn服务器端也是java语言实现的,基于openfire开源工程,不过它的Web部分采用的是spring框架,这一点与 openfire是不同的。Androidpn服务器包含两个部分,一个是侦听在5222端口上的XMPP服务,负责与客户端的 XMPPConnection类进行通信,作用是用户注册和身份认证,并发送推送通知消息。另外一部分是Web服务器,采用一个轻量级的HTTP服务器, 负责接收用户的Web请求。服务器架构如下:最上层包含四个组成部分,分别是SessionManager,Auth Manager,PresenceManager以及Notification Manager。SessionManager负责管理客户端与服务器之间的会话,Auth Manager负责客户端用户认证管理,Presence Manager负责管理客户端用户的登录状态,NotificationManager负责实现服务器向客户端推送消息功能。这个解决方案的最大优势就是简单,我们不需要象C2DM那样依赖操作系统版本,也不会担心某一天Google服务器不可用。利用XMPP协议我们还可以进一步的对协议进行扩展,实现更为完善的功能。 采用这个方案,我们目前只能发送文字消息,不过对于推送来说一般足够了,因为我们不能指望通过推送得到所有的数据,一般情况下,利用推送只是告诉手机端服务器发生了某些改变,当客户端收到通知以后,应该主动到服务器获取最新的数据,这样才是推送服务的完整实现。作者:qq_594336505 来源:CSDN 原文:https://blog.csdn.net/qq_23174861/article/details/51730760 版权声明:本文为博主原创文章,转载请附上博文链接!

auto_answer 2019-12-02 01:48:09 0 浏览量 回答数 0

回答

本文介绍如何使用弹性伸缩、消息服务和函数计算,将弹性扩张时创建的ECS实例自动添加到Redis实例的白名单。 前提条件 使用本教程进行操作前,请确保您已经注册了阿里云账号。如还未注册,请先完成账号注册。 已经开通云数据库Redis、消息服务、弹性伸缩和函数计算。 背景信息 使用弹性伸缩时,伸缩组可以关联负载均衡实例和云数据库RDS实例,但是暂时不能关联云数据库Redis实例。如果您将业务数据存储在Redis实例上,会需要配置伸缩组内的ECS实例加入Redis实例的访问白名单。等待ECS实例创建完成后再逐个手动添加至Redis实例白名单不仅费时费力,也容易出现失误,在维护大量实例时成本较高。 针对这种情况,您可以在伸缩组中创建生命周期挂钩,生命周期挂钩在弹性扩张时会自动向指定的MNS主题发送消息,然后通过函数计算中的MNS主题触发器,触发执行上传的代码,自动将ECS实例添加到Redis实例的白名单。 说明 请在相同地域创建消息服务主题和函数计算服务,相同区域内的产品内网可以互通。 自动化管理实践-添加ECS实例到Redis白名单流程 本文以Java语言的形式给出示例代码,您可以根据业务需求,将此类最佳实践扩展到其它语言。 操作步骤 执行以下操作自动将伸缩组ECS实例添加到Redis实例白名单: 步骤一:创建Redis实例 步骤二:创建MNS主题和MNS队列 步骤三:创建伸缩组和生命周期挂钩 步骤四:创建服务和函数 步骤一:创建Redis实例 登录云数据库Redis控制台。 创建一台Redis实例。 具体操作请参见创建Redis实例,用于为自动创建的ECS实例提供数据库服务。 查看Redis实例的白名单,确定执行代码前的白名单状态。 自动化管理实践-查看Redis实例白名单 步骤二:创建MNS主题和MNS队列 登录消息服务控制台。 创建一个MNS主题。 用作执行函数的触发器,本示例主题的名称为fc-trigger。自动化管理实践-创建MNS主题消息 创建一个MNS队列。 用作函数执行结果的接收器,本示例队列的名称为fc-callback。示例代码中通过QUEUE_NAME指定该队列,发送包含函数执行结果的消息。自动化管理实践-创建MNS队列消息 步骤三:创建伸缩组和生命周期挂钩 登录弹性伸缩控制台。 创建一个伸缩组。 具体操作请参见创建伸缩组或者使用实例启动模板创建伸缩组。 创建一个生命周期挂钩。 具体操作请参见创建生命周期挂钩。 适用的伸缩活动类型配置为弹性扩张活动,用于通知弹性扩张事件。 通知方式配置为MNS主题,与MNS队列相比,主题可以通知多个订阅者,执行多种操作。 MNS主题配置为fc-trigger,用于在自动创建的ECS实例进入加入挂起中状态时执行代码,将ECS实例添加到云数据库Redis的白名单。 根据需要配置其它选项。 步骤四:创建服务和函数 登录函数计算控制台。 新建一个服务。 具体操作请参见创建服务,用于承载需要执行的函数,本示例服务的名称为as-hook-mns-fc-redis。自动化管理实践-创建函数计算服务 在服务下新建函数,订阅MNS主题并上传代码。 具体操作请参见新建函数。 在函数模板页面中,选择空白函数。 在触发器配置页面中,选择MNS 主题触发器,然后根据需要配置其它选项。 自动化管理实践-配置函数触发器 在基础管理配置页面中,所在服务配置为as-hook-mns-fc-redis,函数入口配置为fc.Example::handleRequest,然后根据需要配置其它选项。 函数入口由代码决定,请根据实际情况配置。 本文示例采用上传jar包,实现将自动创建的ECS实例添加到云数据库Redis的白名单。有关编程语言说明,请参见函数计算Java编程说明。 自动化管理实践-配置函数基础信息自动化管理实践-配置函数基础信息-函数入口 在权限配置页面中,根据需要授予函数访问其它资源的权限,并授予消息服务调用函数的权限。 说明 建议遵循权限最小化原则,仅授予必需的权限,防范潜在风险。 自动化管理实践-配置权限-函数计算操作其它资源自动化管理实践-配置权限-调用函数 在信息核对页面中,核对函数信息和触发器信息,然后单击创建。 执行效果 配置完成后,执行效果如下: 在满足弹性扩张的条件时,伸缩组触发伸缩活动,自动创建ECS实例。 生命周期挂钩挂起伸缩活动,同时发送消息到MNS主题。 函数计算中,MNS主题触发器触发函数执行过程,并将消息内容作为输入信息(包括ECS实例的ID等信息),执行Java代码。 代码执行时,会通过接口获取ECS实例的私网IP,然后将私网IP添加到Redis实例的白名单(default 分组)。 代码执行结果会发送到MNS队列fc-callback,您可以在消息服务控制台查看结果详情。查看消息内容中success为true,即表明ECS实例成功添加到了Redis实例的白名单。自动化管理实践-查看执行效果 您还可以继续消费MNS队列中的消息,比如获取success、LifecycleHookId和LifecycleActionToken,编程提前结束生命周期挂钩。 上述最佳实践供您参考,您也在其它场景下通过多款产品实现自动化管理,从而更加灵活地管理伸缩组内的资源。 示例代码 示例代码仅供参考,请结合具体业务进行测试改造。主要功能涉及四个java文件,通过Maven管理,目录结构如下: 自动化管理实践-Jar包结构 Maven依赖如下: 4.0.0 com.aliyun.fc.wujin demo 1.0-SNAPSHOT com.aliyun aliyun-java-sdk-ecs 4.10.1 com.aliyun.fc.runtime fc-java-core 1.0.0 com.aliyun aliyun-java-sdk-core 3.2.6 com.aliyun aliyun-java-sdk-r-kvstore 2.0.3 com.alibaba fastjson 1.2.25 org.springframework spring-context 4.2.5.RELEASE org.apache.httpcomponents httpclient 4.5.2 org.apache.commons com.springsource.org.apache.commons.lang 2.6.0 com.aliyun.mns aliyun-sdk-mns 1.1.8.4 maven-assembly-plugin 3.1.0 jar-with-dependencies false make-assembly package single org.apache.maven.plugins maven-compiler-plugin 1.8 1.8 Example.java代码如下: package fc; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.aliyun.fc.runtime.Context; import com.aliyun.fc.runtime.StreamRequestHandler; import com.aliyun.mns.client.CloudAccount; import com.aliyun.mns.client.CloudQueue; import com.aliyun.mns.client.MNSClient; import com.aliyun.mns.model.Message; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.ecs.model.v20140526.DescribeInstancesRequest; import com.aliyuncs.ecs.model.v20140526.DescribeInstancesResponse; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; import com.aliyuncs.r_kvstore.model.v20150101.DescribeSecurityIpsRequest; import com.aliyuncs.r_kvstore.model.v20150101.DescribeSecurityIpsResponse; import com.aliyuncs.r_kvstore.model.v20150101.ModifySecurityIpsRequest; import model.FCResult; import model.HookModel; import model.MnsMessageModel; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang.StringUtils; import org.springframework.util.CollectionUtils; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Example implements StreamRequestHandler { /** * 专有网络类型,此参数不用变 */ private static final String VPC_NETWORK = "vpc"; private static final String CHAR_SET = "UTF-8"; /** * 接收input数组大小,4096通常够用 */ private static final Integer MAX_BYTE_LENGTH = 4096; /** * REDIS 白名单默认分组 */ private static final String DEFAULT_SECURITY_GROUP_NAME = "default"; /** * REDIS 修改白名单的模式 */ private static final String MODIFY_MODE_APPEND = "Append"; /** * MNS 客户端发送消息地址 */ private static final String MNS_END_POINT = "http://%s.mns.%s.aliyuncs.com/"; /** * 待添加的REDIS实例ID,根据个人情况替换 */ private static final String REDIS_ID = ""; /** * 接收本次函数计算执行结果的队列名称,根据个人情况替换 */ private static final String QUEUE_NAME = "wujin-fc-callback"; /** * 阿里云账号UID,根据跟人情况替换 */ private static final Long USER_ID = 1111111111111111111L; /** * 伸缩组 MNS FC 所属的region,根据个人情况替换 */ private static final String REGION_ID = "cn-hangzhou"; @Override public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) { FCResult result = new FCResult(); String akId = context.getExecutionCredentials().getAccessKeyId(); String akSecret = context.getExecutionCredentials().getAccessKeySecret(); String securityToken = context.getExecutionCredentials().getSecurityToken(); try { //获取MNS触发函数计算时输入的内容 String input = readInput(inputStream); MnsMessageModel mnsMessageModel = JSON.parseObject(input, new TypeReference<MnsMessageModel>() { }); if (mnsMessageModel == null) { result.setSuccess(false); result.setMessage("mnsMessageModel is null"); sendMns(akId, akSecret, securityToken, result.toString()); return; } HookModel contentModel = mnsMessageModel.getContent(); if (contentModel == null) { result.setSuccess(false); result.setMessage("contentModel is null"); sendMns(akId, akSecret, securityToken, result.toString()); return; } IAcsClient client = buildClient(akId, akSecret, securityToken); //获取本次伸缩活动对应实例的私网IP List<String> privateIps = getInstancesPrivateIps(contentModel.getInstanceIds(), client); if (CollectionUtils.isEmpty(privateIps)) { result.setSuccess(false); result.setMessage("privateIps is empty"); sendMns(akId, akSecret, securityToken, result.toString()); return; } List<String> needAppendIps = filterPrivateIpsForAppend(privateIps, client); if (!CollectionUtils.isEmpty(needAppendIps)) { modifySecurityIps(client, needAppendIps); result.setLifecycleHookId(contentModel.getLifecycleHookId()); result.setLifecycleActionToken(contentModel.getLifecycleActionToken()); sendMns(akId, akSecret, securityToken, result.toString()); } } catch (Exception ex) { result.setSuccess(false); result.setMessage(ex.getMessage()); sendMns(akId, akSecret, securityToken, result.toString()); } } /** * 构建请求 ECS Redis 接口客户端 * * @param akId * @param akSecret * @param securityToken * @return */ private IAcsClient buildClient(String akId, String akSecret, String securityToken) { IClientProfile clientProfile = DefaultProfile.getProfile(REGION_ID, akId, akSecret, securityToken); return new DefaultAcsClient(clientProfile); } /** * 将执行结果发送消息到MNS * * @param ak * @param aks * @param securityToken * @param msg */ private void sendMns(String ak, String aks, String securityToken, String msg) { MNSClient client = null; try { CloudAccount account = new CloudAccount(ak, aks, String.format(MNS_END_POINT, USER_ID, REGION_ID), securityToken); client = account.getMNSClient(); CloudQueue queue = client.getQueueRef(QUEUE_NAME); Message message = new Message(); message.setMessageBody(msg); queue.putMessage(message); } finally { if (client != null) { client.close(); } } } /** * 过滤出需要添加到redis的私网IP * * @param privateIps 过滤以前的私网IP * @param client * @return * @throws ClientException */ private List<String> filterPrivateIpsForAppend(List<String> privateIps, IAcsClient client) throws ClientException { List<String> needAppendIps = new ArrayList<>(); if (CollectionUtils.isEmpty(privateIps)) { return needAppendIps; } DescribeSecurityIpsRequest request = new DescribeSecurityIpsRequest(); request.setInstanceId(REDIS_ID); DescribeSecurityIpsResponse response = client.getAcsResponse(request); List<DescribeSecurityIpsResponse.SecurityIpGroup> securityIpGroups = response .getSecurityIpGroups(); if (CollectionUtils.isEmpty(securityIpGroups)) { return privateIps; } for (DescribeSecurityIpsResponse.SecurityIpGroup securityIpGroup : securityIpGroups) { if (!securityIpGroup.getSecurityIpGroupName().equals(DEFAULT_SECURITY_GROUP_NAME)) { continue; } String securityIps = securityIpGroup.getSecurityIpList(); if (securityIps == null) { continue; } String[] securityIpList = securityIps.split(","); List<String> existIps = Arrays.asList(securityIpList); if (CollectionUtils.isEmpty(existIps)) { continue; } for (String ip : privateIps) { if (!existIps.contains(ip)) { needAppendIps.add(ip); } } } return privateIps; } /** * 修改REDIS实例DEFAULT分组私网IP白名单 * * @param client * @param needAppendIps * @throws ClientException */ private void modifySecurityIps(IAcsClient client, List<String> needAppendIps) throws ClientException { if (CollectionUtils.isEmpty(needAppendIps)) { return; } ModifySecurityIpsRequest request = new ModifySecurityIpsRequest(); request.setInstanceId(REDIS_ID); String ip = StringUtils.join(needAppendIps.toArray(), ","); request.setSecurityIps(ip); request.setSecurityIpGroupName(DEFAULT_SECURITY_GROUP_NAME); request.setModifyMode(MODIFY_MODE_APPEND); client.getAcsResponse(request); } /** * 获取输入,并base64解码 * * @param inputStream * @return * @throws IOException */ private String readInput(InputStream inputStream) throws IOException { try { byte[] bytes = new byte[MAX_BYTE_LENGTH]; int tmp; int len = 0; //循环读取所有内容 while ((tmp = inputStream.read()) != -1 && len < MAX_BYTE_LENGTH) { bytes[len] = (byte) tmp; len++; } inputStream.close(); byte[] act = new byte[len]; System.arraycopy(bytes, 0, act, 0, len); return new String(Base64.decodeBase64(act), CHAR_SET); } finally { inputStream.close(); } } /** * 获取实例列表对应的私网IP,并限制每次请求实例数量不超过100 * * @param instanceIds 实例列表 * @param client 请求客户端 * @return * @throws Exception */ public List<String> getInstancesPrivateIps(List<String> instanceIds, IAcsClient client) throws Exception { List<String> privateIps = new ArrayList<>(); if (CollectionUtils.isEmpty(instanceIds)) { return privateIps; } int size = instanceIds.size(); int queryNumberPerTime = 100; int batchCount = (int) Math.ceil((float) size / (float) queryNumberPerTime); //support 100 instance for (int i = 1; i <= batchCount; i++) { int fromIndex = queryNumberPerTime * (i - 1); int toIndex = Math.min(queryNumberPerTime * i, size); List<String> subList = instanceIds.subList(fromIndex, toIndex); DescribeInstancesRequest request = new DescribeInstancesRequest(); request.setInstanceIds(JSON.toJSONString(subList)); DescribeInstancesResponse response = client.getAcsResponse(request); List<DescribeInstancesResponse.Instance> instances = response.getInstances(); if (CollectionUtils.isEmpty(instances)) { continue; } for (DescribeInstancesResponse.Instance instance : instances) { String privateIp = getPrivateIp(instance); if (privateIp != null) { privateIps.add(privateIp); } } } return privateIps; } /** * 从 DescribeInstancesResponse.Instance 中解析出私网 IP * * @param instance DescribeInstancesResponse.Instance */ private String getPrivateIp(DescribeInstancesResponse.Instance instance) { String privateIp = null; if (VPC_NETWORK.equalsIgnoreCase(instance.getInstanceNetworkType())) { DescribeInstancesResponse.Instance.VpcAttributes vpcAttributes = instance .getVpcAttributes(); if (vpcAttributes != null) { List<String> privateIpAddress = vpcAttributes.getPrivateIpAddress(); if (!CollectionUtils.isEmpty(privateIpAddress)) { privateIp = privateIpAddress.get(0); } } } else { List<String> innerIpAddress = instance.getInnerIpAddress(); if (!CollectionUtils.isEmpty(innerIpAddress)) { privateIp = innerIpAddress.get(0); } } return privateIp; } } FCResult.java代码如下: package model; import com.alibaba.fastjson.JSON; public class FCResult { private boolean success = true; private String lifecycleHookId; private String lifecycleActionToken; private String message; public boolean isSuccess() { return success; } public void setSuccess(boolean success) { this.success = success; } public String getLifecycleHookId() { return lifecycleHookId; } public void setLifecycleHookId(String lifecycleHookId) { this.lifecycleHookId = lifecycleHookId; } public String getLifecycleActionToken() { return lifecycleActionToken; } public void setLifecycleActionToken(String lifecycleActionToken) { this.lifecycleActionToken = lifecycleActionToken; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } @Override public String toString() { return JSON.toJSONString(this); } } HookModel.java代码如下: package model; import java.util.List; public class HookModel { private String lifecycleHookId; private String lifecycleActionToken; private String lifecycleHookName; private String scalingGroupId; private String scalingGroupName; private String lifecycleTransition; private String defaultResult; private String requestId; private String scalingActivityId; private List<String> instanceIds; public String getLifecycleHookId() { return lifecycleHookId; } public void setLifecycleHookId(String lifecycleHookId) { this.lifecycleHookId = lifecycleHookId; } public String getLifecycleActionToken() { return lifecycleActionToken; } public void setLifecycleActionToken(String lifecycleActionToken) { this.lifecycleActionToken = lifecycleActionToken; } public String getLifecycleHookName() { return lifecycleHookName; } public void setLifecycleHookName(String lifecycleHookName) { this.lifecycleHookName = lifecycleHookName; } public String getScalingGroupId() { return scalingGroupId; } public void setScalingGroupId(String scalingGroupId) { this.scalingGroupId = scalingGroupId; } public String getScalingGroupName() { return scalingGroupName; } public void setScalingGroupName(String scalingGroupName) { this.scalingGroupName = scalingGroupName; } public String getLifecycleTransition() { return lifecycleTransition; } public void setLifecycleTransition(String lifecycleTransition) { this.lifecycleTransition = lifecycleTransition; } public String getDefaultResult() { return defaultResult; } public void setDefaultResult(String defaultResult) { this.defaultResult = defaultResult; } public String getRequestId() { return requestId; } public void setRequestId(String requestId) { this.requestId = requestId; } public String getScalingActivityId() { return scalingActivityId; } public void setScalingActivityId(String scalingActivityId) { this.scalingActivityId = scalingActivityId; } public List<String> getInstanceIds() { return instanceIds; } public void setInstanceIds(List<String> instanceIds) { this.instanceIds = instanceIds; } } MnsMessageModel.java代码如下: package model; public class MnsMessageModel { private String userId; private String regionId; private String resourceArn; private HookModel content; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getRegionId() { return regionId; } public void setRegionId(String regionId) { this.regionId = regionId; } public String getResourceArn() { return resourceArn; } public void setResourceArn(String resourceArn) { this.resourceArn = resourceArn; } public HookModel getContent() { return content; } public void setContent(HookModel content) { this.content = content; } }

1934890530796658 2020-03-22 13:32:03 0 浏览量 回答数 0

问题

云效平台——基于jmeter的轻量级性能测试平台

云效平台 2019-12-01 21:46:58 24033 浏览量 回答数 2

回答

前提条件 步骤一:安装Symfony 步骤二:创建应用 步骤三:打包应用 步骤四:部署应用至Web+ 更多信息 Symfony是一个基于MVC模式的面向对象的PHP框架,本文档将演示如何使用Symfony创建一个应用,并将其部署到Web+上。 前提条件 设置PHP开发环境。 注意 Symfony 3需要PHP 5.5.9或更高版本,以及PHP的intl 扩展。 步骤一:安装Symfony 执行以下命令安装Symfony CLI。 curl -sS https://get.symfony.com/cli/installer | bash 将CLI的可执行文件移动到系统命令目录下。 mv ~/.symfony/bin/symfony /usr/local/bin/symfony 步骤二:创建应用 执行以下命令使用CLI工具快速创建一个Symfony演示项目。 symfony new --demo webplusdemo 创建过程需要几分钟,创建完成后将生成名为webplusdemo的项目。 进入项目目录执行以下命令安装依赖。 composer install 执行以下命令,使用CLI工具附带的开发服务器启动服务。 symfony server:start 打开浏览器访问http://localhost:8000,进入Symfony示例应用首页。 步骤三:打包应用 Web+支持您使用Nginx或Apache来作为Web服务器,若您希望使用Apache,可通过在项目目录下执行以下命令生成.htaccess文件,如果使用Nginx,则可跳过此步骤。 composer require symfony/apache-pack 执行以下命令完成应用打包,生成部署包文件webplusdemo.zip。 zip -r webplusdemo.zip ./ 步骤四:部署应用至Web+ 登录 Web+控制台,并在页面左上角选择所需地域。 在概览页最近更新的部署环境区域的右上角单击新建。 在应用基本信息页面选择技术栈类型为PHP,设置应用基本信息,设置完成后单击下一步。 在部署环境信息页面设置部署环境名称,部署包来源选择上传本地程序,上传您刚打包的webplusdemo.zip,设置部署包版本后单击完成创建。 在完成创建页面单击查看该应用或完成创建可进入应用详情页面。单击部署环境名称进入部署环境详情页面,然后单击公网访问地址右侧的链接进入应用首页。Symfony应用首页 更多信息 在控制台部署应用的详细配置步骤请参见部署应用。 使用CLI完成应用创建和部署的操作请参见使用CLI快速部署Java应用。 想了解更多Symfony信息,请进入Symfony官方网站查看。

1934890530796658 2020-03-23 14:24:48 0 浏览量 回答数 0

问题

用户指南- 典型应用 -开放搜索

李沃晟 2019-12-01 21:39:48 570 浏览量 回答数 0

问题

springboot windows10风格 activiti 整合项目框架源码 shiro 安全框

游客egqjd4t7mlyom 2019-12-01 19:54:38 72 浏览量 回答数 1

问题

springboot windows10风格 shiro 安全框 activiti 整合项目框架源

游客q6uipubrszn5g 2019-12-01 19:56:32 18 浏览量 回答数 0

问题

springboot windows10风格 activiti 整合项目框架源码 shiro 安全框

游客ydre72cd7ywew 2019-12-01 19:52:06 39 浏览量 回答数 0

问题

Springboot vue.js html 跨域 前后分离 shiro权限 websocket即时

游客ydre72cd7ywew 2019-12-01 20:00:40 16 浏览量 回答数 0

问题

Springboot vue.js html 跨域 前后分离 Activiti6 工作流

游客ydre72cd7ywew 2019-12-01 19:51:52 38 浏览量 回答数 0

问题

Springboot vue.js 前后分离 跨域 集成代码生成器 shiro权限

游客egqjd4t7mlyom 2019-12-01 21:49:37 40 浏览量 回答数 1

问题

Springboot vue.js html 跨域 前后分离 shiro权限 集成代码生成器

游客ydre72cd7ywew 2019-12-01 19:59:00 11 浏览量 回答数 0

问题

Springboot vue 前后分离 跨域 Activiti6 工作流 集成代码生成器 shiro

游客egqjd4t7mlyom 2019-12-01 19:53:56 49 浏览量 回答数 0

问题

Springboot vue 前后分离 跨域 Activiti6 工作流 集成代码生成器 shiro

游客ydre72cd7ywew 2019-12-01 21:49:01 85 浏览量 回答数 1

问题

Springboot vue.js html 跨域 前后分离 Activiti6 工作流 集成代码生

游客ydre72cd7ywew 2019-12-01 19:58:00 23 浏览量 回答数 0

问题

Springboot vue.js html 跨域 前后分离 Activiti6 工作流 集成代码生

游客egqjd4t7mlyom 2019-12-01 19:58:33 35 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站