[{"id":157,"createTime":"2016/06/23","modifyTime":1466644336000,"title":"软件测试工程师面试题","content":"
1、先做一下自我介绍、项目介绍。
2、你认为什么是软件测试,软件测试分为哪几个阶段?
答:软件测试是一个为了寻找软件中的错误而运行软件的过程,测试可以分为单元测试、集成测试、系统测试。
3、怎么判断一个测试是否是成功有效的?
一个成功的测试是指找到了迄今为止尚未发现的错误的测试。
4、白箱测试和黑箱测试是什么?什么是回归测试?
5、什么是兼容性测试?
答:兼容测试主要是检查软件在不同的硬件平台、软件平台上是否可以正常的运行,即是通常说的软件的可移植性。
6、测试人员在软件开发过程中的任务是什么?
答:寻找Bug;避免软件开发过程中的缺陷;衡量软件的品质;关注用户的需求。总的目标是:确保软件的质量。
7、软件测试工作从一个项目的什么时候开始,为什么?
答:从需求开始,测试人员会参与需求的整理,然后做测试计划和测试方案,等开发完成开发工作之后,开始测试。
8、在您以往的工作中,一条软件缺陷(或者叫Bug)记录都包含了哪些内容?如何提交高质量的软件缺陷(Bug)记录?
9、软件BUG的生命周期?
10、软件BUG等级应如何划分?
11、你发现一个BUG并且提交报告,程序员说这个是正确的,你怎么办?
12、怎么保证高效的工作效率和执行力,特别是面试QQ、微信、各大购物网站信息的干扰?
13、你的职业生涯规划是怎样的?
14、以前的工作是否会遇到项目紧迫,经常加班的情况,个人对加班的看法 ?
15、职业生涯遇到的最大困难是什么,自己怎么解决的?
16、基于WEB信息管理系统测试时应考虑的因素有哪些?
功能测试:链接测试、表单测试、cookie测试、数据库测试。
性能测试:连接速度测试、负载测试、压力测试。
可用性测试:导航测试、页面测试、兼容性测试、安全性测试。
17、QTP 怎么样进行自动化测试?例如使用什么工具?怎么使用?
QTP是quicktest Professional的简称,是一种自动测试工具。
使用QTP的目的是想用它来执行重复的自动化测试,主要是用于回归测试和测试同一软件的新版本。因此你在测试前要考虑好如何对应用程序进行测试,例如要测试哪些功能、操作步骤、输入数据和期望的输出数据等
18、roadrunner 压力测试和负载测试怎验进行?例如使用什么工具?怎么使用?
LoadRunner,是一种预测系统行为和性能的负载测试工具。通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner能够对整个企业架构进行测试。企业使用LoadRunner能最大限度地缩短测试时间,优化性能和加速应用系统的发布周期。 LoadRunner可适用于各种体系架构的自动负载测试,能预测系统行为并评估系统性能。
参考文档
https://www.ttlsa.com/nginx/use-nginx-proxy/
目前很多企业整天在喊着上下要一条心,要打造高效团队,实现企业目标。但是,在现实中却很少有企业能如愿以偿。其实原因有很多,其中主要原因就是企业在团队的组建上出了问题。如何打造高效团队?首先还应从团队建设开始。
一个高效的团队除了在人数方面有一定的要求外,更重要的就是要确保团队所有成员在以下四个方面应保持高度的一致性,即:信仰一致、目标一致、行动一致、语言一致。在对团队深入了解之前,我们首先还是先了解下群体与团队联系与区别,团队的特点和打造高效团队的举措及方法。
群体(group)也称团体。指两个以上个体之间为了一定的共同目的,以一定方式组合在一起,彼此之间相互依存和相互作用的个体组织。而团队(Team)是由员工和管理层(即两个以上不同层级和技能的个体)所组成的一个共同体,它合理利用每一个成员的知识和技能协同工作,解决问题,达到共同的目标。
团队与群体既有相同之外,也有着明显的差异性。相同之处表现在: 1、团队与群体一样由两个以上的个体组成; 2、团队与群体内的各成员之间相互作用并相互依存;3、团队与群体都有共同的目标。
团队与群体的差异表现为: 1、在人数方面。高效的团队在成员数量上有一定的限制,而群体在群体数量上没有明显的数量限制。2、在领导方面。作为群体应该有明确的领导人,而团队就不一定有,尤其是在团队发展到成熟阶段后,所有成员共享决策权。3、在目标方面。群体的目标必须跟组织保持一致性,但团队除了有共同的目标外,团队各成员还可以有自己的目标。4、协作方面。群体的协作性是中度的,有时也有些消极或对立;但团队是一种齐心和高度合作的,这也是团队与群体最根本的差异所在。5、责任方面。群体的领导要负很大的责任,而团队中除了领导者要承担责任之外,每一个团队的成员也要负相应的责任,或者说是一起承担责任。6、技能方面。群体成员的技能可以是相同的,也可能是不同的;而团队成员的技能是互补的,把具有不同知识、技能和经验的人综合在一起形成角色互补,从而达到有效的组合。7、结果方面。群体的绩效是每一个个体的绩效相加之和,而团队的结果或绩效是所有成员共同合作完成的。
什么样的团队才是高效团队?
高效团队应时刻有人扮演着不同的角色,各角色在团队中发挥着不同的作用。
协调者:确保工作目标清晰,成员均参与并承担责任。
检批者:对无效益之举提出质询及带头探索改善。
实干者:提醒各成员要面对现实,完成手上的工作。
思考者:提出新颖意见,将他人的意见加以发挥。
凝聚者:营造和谐的工作关系,舒缓紧张气氛。
以上谈到了高效团队各成员在团队中发挥不同的作用,接下来谈谈高效团队有哪些特点。具体如下:1、互补的技能,即团队各成员至少应具备为实现团队目标应有的科技专长和分析解决问题能力,沟通无障碍;2、有共同的目的,共同的目的可以为团队各成员提供指导和动力;3、可行的目标以使成员采取行动和充满活力;4、共同手段或方法来实现组织的目标;5、相互之间的责任,各成员对各自行为负责。
如何打造高效团队?下面结合实际谈谈打造高效团队的一些举措和方法。
1、增强领导才能,提高管理者领导能力
增强领导才能就是增强和发挥领导的指导作用。首先领导必须以身作则,对团队成员起榜样和示范作用。其次,要明确具体的工作目标;不能对所明确的相关事项作随时修改,以确保目标的严谨和前后的一致性。再次,明确各团队成员的角色和责任分工,充分发挥项目团队成员各自的作用;团队各成员所负责的工作应保证相对的稳定,不能随时调整和变换,避免因分工不明导致责任不清而影响整体目标的达成。除此之外,还应有针对性的进行分层次培训,提高管理者的素质和能力。
如何提高管理素质和能力?
⑴、要有针对性地进行分层次培训,提高管理者的素质和能力。在一个团队里,一把手是否出色是团队建设的关键。这需要给团队的一把手设定通道,明确权责,找准定位。值得注意的是,在领导个人所有素质中以德为先。
⑵、要加强团队意识培训,提高团队作战能力。一个团队首先要有相对稳定性,搭配要互补,个人能力与团队能力也要互补,成员之间要能形成心理契约,对发展战略有相当的认同度,成员之间能互相理解,支持,形成合力,其前提是领导在处理团队内部问题时能做到公开、公平、公正。
⑶、要建立完善的规章制度。首先做好团队的愿景规划,提高团队的吸引力;其次,给每个成员量身定做职业生涯规划,避免团队平庸化,解决效率问题;第三,要树立标杆,使之成为团队成员学习的榜样。
2、充分发挥领导的沟通和协调作用
首先,要加强团队成员之间的沟通和协调,有明确清楚的沟通方式和途径,为团队排忧解难。由于团队成员之间因价值观、性格、处世方法等方面的差异而产生各种冲突,会导致成员间人际关系陷入紧张局面,甚至出现敌视、强烈情绪以及向领导者挑战等各种情形。领导要发挥领导作用进行充分沟通,引导团队成员调整心态和准确定位好各自角色,把个人目标与工作目标结合起来,明确知道自己要做的事,以及清楚如何去做,减少没必要的资源浪费和消耗。
其次,团队成员与工作环境之间的沟通和协调。团队成员与周围环境之间也会产生不和谐,管理者应为团队提供一个好的工作氛围,帮助团队成员熟悉工作环境,学习并掌握相关的技术,以利于各项目目标能按时完成,从而达到总体任务按时完成的目的。
再次,团队与其他部门之间的沟通和协调。在工作过程中,团队与其他部门之间也会产生各种各样的矛盾冲突和不协调,这就需要管理者进行很好的沟通与协调,为团队争取更充足的资源与较好的工作氛围,并对工作进程以及工作目标与工作涉及到的关系人不断达成共识,更好地促进工作目标的实现。
3、充分发挥领导的激励作用
在工作过程中,由于严格的目标约束及多变的外部环境,领导必须巧妙地运用各种激励理论对各成员进行适当及时的激励,鼓励和激发团队成员的工作积极性和主动性,充分发挥团队成员的创造力。
4、灵活授权,及时决策
随着团队的建设和发展,领导要通过授权让团队成员分担责任,使团队成员更多地参与项目的决策过程,允许个人或小组以自己的更灵活的方式开展工作。
首先,通过灵活的授权,显示了领导对团队成员的信任,也给团队成员学习与成长的空间。这种信任可以奠定团队信任的基础,也是团队精神在领导与团队之间的体现。
其次,授权有利于充分发挥团队队员的积极性和创造性。每个人都有实现自我价值的愿望。富于挑战性的任务,使他们不断地拓展自己的知识技能,发掘他们的创造潜力。每一项工作的成功,不仅是领导管理的成功,更是所有实现自我价值的团队成员的成功。
再次,灵活授权,有利于及时决策。一方面团队成员在自己的授权范围内可根据内外部环境的变化及时决策,另一方面,通过灵活的授权,领导逐渐将工作重点转向关键点控制、目标控制和过程监控。领导的工作重心由内转向外,侧重于处理工作与企业或社会之间的关系,从外部保障项目团队的运作。
5、充分发挥团队凝聚力
团队凝聚力是无形的精神力量,是将一个团队的成员紧密地联系在一起的看不见的纽带。团队的凝聚力来自于团队成员自觉的内心动力和向心力,来自于共识的价值观,是团队精神的最高体现。一般情况下,高团队凝聚力带来高团队绩效。
团队凝聚力在外部表现为团队成员对团队的荣誉感及团队的地位。团队的荣誉感主要来源于工作目标,团队因工作目标而产生、为工作目标而存在。因此,必须设置较高的目标承诺,以较高的工作目标引领着团队前进的方向,使团队成员对工作目标形成统一和强烈的共识,激发团队成员对所在团队的荣誉感。同时,引导团队成员个人目标与工作目标的统一,增大团队成员对团队的向心力,使团队走向高效。
团队凝聚力在内部表现为团队成员之间的融合度和团队的士气。人是社会中的人,良好的人际关系是高效团队的润滑剂。因此,必须采取有效措施增强团队成员之间的融合度和亲和力,形成高昂的团队士气。团队是开放的,在不同阶段都会有新成员加入,高团队凝聚力会让团队成员在短期内树立起团队意识,形成对团队的认同感和归属感,缩短新成员与团队的磨合期,在正常运营期间,促使团队的工作绩效大幅提高。
只有打造高效团队,组织的目标才有保障,才能如期达成企业目标;否则,企业目标只能喊喊口号和流于形式。
转载自:http://blog.163.com/zhuangyuanlin@126/blog/static/1275513272010028415856/
问题描述
在Linux上安装nginx进行反向代理至后端的Tomcat WEB应用,出现加载不了js问题,直接访问相关js也发现内容确实只加载了一半,强制刷新无用,依然只有一半。但是直接访问tomcat的80或者8080端口发现是没有问题的。
问题原因
Nginx代理之后会有相应的代理缓存区,缓存区默认只有几十K,某些版本的nginx默认设置中没有相关处理,导致部分文件代理是会出现加载不全的现象,其实不仅仅是JS文件。只是因为框架的JS文件略大,所以经常出现类似问题。
问题解决
\t在Nginx.conf中添加 proxy_buffer_size 128k;
\t proxy_buffers 32 128k;
\t proxy_busy_buffers_size 128k;
然后重启nginx,即可。Nginx在代理了相应服务后或根据我们配置的UpStream和location来获取相应的文件,首先文件会被解析到nginx的内存或者临时文件目录中,然后由nginx再来响应。那么当proxy_buffers和proxy_buffer_size以及proxy_busy_buffers_size 都太小时,会将内容根据nginx的配置生成到临时文件中,但是临时文件的大小也有默认值。所以当这四个值都过小时就会导致部分文件只加载一部分。所以要根据我们的服务器情况适当的调整proxy_buffers和proxy_buffer_size以及proxy_busy_buffers_size、proxy_temp_file_write_size。具体几个参数的详细如下
proxy_buffers 32 128k; 设置了32个缓存区,每个的大小是128k
\tproxy_buffer_size 128k; 每个缓存区的大小是128k,当两个值不一致时没有找到具体哪个有效,建议和上面的设置一致。
proxy_busy_buffers_size 128k;设置使用中的缓存区的大小,控制传输至客户端的缓存的最大
proxy_temp_file_write_size 缓存文件的大小
参考文档
http://www.zving.com/dev/server/257610.shtml
打开控制台进入JDK安装目录下的bin目录:这里是“D:\\Program Files\\Java\\jdk1.7.0_51\\bin”
基本操作
1、创建一个证书
指定证书库为 D:/keystore,创建别名为 tomcat70 的一条证书,它指定用 RSA 算法生成,且指定密钥长度为 1024,证书有效期为 1 年:
keytool -genkey -alias tomcat70 -keyalg RSA -keysize 1024 -keystore D:/keystore -validity 365
2、显示证书库中的证书使用如下命令: 将显示 D:/keystore 证书库的的所有证书列表
keytool -list -keystore D:/keystore
3、导出到证书文件
使用命令:keytool -export -alias tomcat70 -file D:/tomcat70.cer -keystore D:/keystore 将把证书库D:/keystore 中的别名为 tomcat70 的证书导出到 tomcat70.cer 证书文件中,它包含证书主体的信息及证书的公钥,不包括私钥,可以公开。
导出的证书文件是以二进制编码文件,无法用文本编辑器正确显示,可以加上 -rfc参数以一种可打印的编者编码输出。 如:
keytool -export -alias tomcat70 -file D:/tomcat70.cer -keystore D:/keystore –rfc
4、查看证书的信息
通过命令: keytool -printcert -file D:/tomcat70.cer 可以查看证书文件的信息。 也可以在 Windows 资源管理器中双击产生的证书文件直接查看。
keytool -printcert -file D:/tomcat70.cer
5、删除密钥库中的条目
keytool -delete -alias tomcat70 -keystore D:/keystore
这条命令将 D:/keystore 库中的 tomcat70 这一条证书删除了。
keytool -delete -alias tomcat70 -keystore D:/keystore
6、修改证书条目口令
keytool -keypasswd -alias tomcat70 -keystore D:/keystore,可以以交互的方式修改 D:/keystore 证书库中的条目为 tomcat70 的证书。
Keytool -keypasswd -alias tomcat70 -keypass oldpasswd -new newpasswd -storepass storepasswd -keystore D:/keystore 这一行命令以非交互式的方式修改库中别名为 tomcat70 的证书的密码为新密码 newpasswd,行中的 oldpasswd 是指该条证书的原密码, storepasswd 是指证书库的密码。
Keytool -keypasswd -alias tomcat70 -keypass oldpasswd -new newpasswd -storepass storepasswd -keystore D:/keystore
基础知识
-genkey 在用户主目录中创建一个默认文件".keystore",还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和证书
-alias 产生别名
-keystore 指定密钥库的名称(产生的各类信息将不在.keystore文件中
-keyalg 指定密钥的算法
-validity 指定创建的证书有效期多少天
-keysize 指定密钥长度
-storepass 指定密钥库的密码
-keypass 指定别名条目的密码
-dname 指定证书拥有者信息 例如: "CN=sagely,OU=atr,O=szu,L=sz,ST=gd,C=cn"
-list 显示密钥库中的证书信息 keytool -list -v -keystore sage -storepass ....
-v 显示密钥库中的证书详细信息
-export 将别名指定的证书导出到文件 keytool -export -alias caroot -file caroot.crt
-file 参数指定导出到文件的文件名
-delete 删除密钥库中某条目 keytool -delete -alias sage -keystore sage
-keypasswd 修改密钥库中指定条目口令 keytool -keypasswd -alias sage -keypass .... -new .... -storepass ... -keystore sage
-import 将已签名数字证书导入密钥库 keytool -import -alias sage -keystore sagely -file sagely.crt
导入已签名数字证书用keytool -list -v 以后可以明显发现多了认证链长度,并且把整个CA链全部打印出来。
------------------------------------------------------------------------------------------------
keytool\n \nJAVA是个密钥和证书管理工具。它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据\n完整性以及认证服务。它还允许用户储存他们的通信对等者的公钥(以证书形式)。通过keytool –help查看其用法,详细信息可以参考http: \n//java.sun.com/j2se/1.5.0/docs/tooldocs/solaris/keytool.html
Java中的 keytool.exe (位于 JDK/Bin \n目录下)可以用来创建数字证书,所有的数字证书是以一条一条(采用别名区别)的形式存入证书库的中,证书库中的一条证书包含该条证书的私钥,公钥和对应的\n数字证书的信息。证书库中的一条证书可以导出数字证书文件,数字证书文件只包括主体信息和对应的公钥。
每一个证书库是一个文件组成,它有访问密码,在首次创建时,它会自动生成证书库,并要求指定访问证书库的密码。
在创建证书的的时候,需要填写证书的一些信息和证书对应的私钥密码。这些信息包括 CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx,它们的意思是:
?\n CN(Common Name - \n名字与姓氏):其实这个“名字与姓氏”应该是域名,比如说localhost或是blog.devep.net之类的。输成了姓名,和真正运行的时候域名\n不符,会出问题。浏览器访问时,弹出一个对话框,提示“安全证书上的名称无效,或者与站点名称不匹配”,用户选择继续还是可以浏览网页。但是用http \nclient写程序访问的时候,会抛出类似于“javax.servlet.ServletException: HTTPS hostname \nwrong: should be ”的异常。
? OU(Organization Unit - 组织单位名称)
? O(Organization - 组织名称)
? L(Locality - 城市或区域名称)
? ST(State - 州或省份名称)
? C(Country - 国家名称)
可以采用交互式让工具提示输入以上信息,也可以采用参数,如:-dname “CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx”来自动创建。
参考文档
http://deanandbai-gmail-com.iteye.com/blog/1538749
开篇说明
GridFS会将大文件对象分割成多个小的chunk(文件片段),一般为256k/个,每个chunk将作为mongodb的一个文档(document)被存储在chunks集合中..gridfs模块会为每个文件创建chunks和files信息.每个文件的实际内容被存在chunks(二进制数据)中,和文件有关的meta数据(filename,content_type,还有用户自定义的属性)将会被存在files集合中.files集合中的文档就是BSON格式,可以使用mongodb的索引等等特性。
对于GridFS文件的web访问方式,大家可以搜索一下Gridfs + nginx,既可获取相应的信息..
具体步骤
1、在applicationContext-mongodb.xml配置文件中添加GridFsTemplate配置:
\t<!-- GridFsTemplate -->\n\t<mongo:mapping-converter id="converter" />\n\t<bean class="org.springframework.data.mongodb.gridfs.GridFsTemplate">\n\t <constructor-arg ref="mongoDbFactory" />\n\t <constructor-arg ref="converter" />\n\t <constructor-arg value="imethan_sys_fs" /><!-- 指定GridFS Collections名称 -->\n\t</bean>
2、创建文件存取测试客户端,代码如下:
package cn.imethan.mongodb;\n\nimport java.io.FileInputStream;\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.util.List;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.mongodb.core.query.Criteria;\nimport org.springframework.data.mongodb.core.query.Query;\nimport org.springframework.data.mongodb.gridfs.GridFsOperations;\nimport org.springframework.test.context.ContextConfiguration;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\n\nimport com.mongodb.BasicDBObject;\nimport com.mongodb.DBObject;\nimport com.mongodb.gridfs.GridFSDBFile;\nimport com.mongodb.gridfs.GridFSFile;\n\n/**\n * GridFsClient.java\n *\n * @author Ethan Wong\n * @since JDK 1.7\n * @datetime 2016年1月18日下午3:03:02\n */\n@RunWith(SpringJUnit4ClassRunner.class)\n@ContextConfiguration(locations = { "classpath:/main/applicationContext.xml", "classpath:/mongodb/applicationContext-mongodb.xml" })\npublic class GridFsClient {\n\t\n\t@Autowired\n\tprivate GridFsOperations gridFsOperations;\n\t\n\t/**\n\t * 保存测试\n\t * \n\t * @author Ethan Wong\n\t * @datetime 2016年1月18日下午3:51:28\n\t */\n\t@Test\n\tpublic void storeFileToGridFs() {\n\t\tDBObject metaData = new BasicDBObject();\n\t\tmetaData.put("extra1", "anything 1");\n\t\tmetaData.put("extra2", "anything 2");\n\t\tInputStream inputStream = null;\n\t\ttry {\n\t\t\tinputStream = new FileInputStream("C:/Users/ETHAN/Pictures/e.png");\n\t\t\tGridFSFile gridFSFile = gridFsOperations.store(inputStream, "e.png", "image/png", metaData);\n\t\t\tSystem.out.println("gridFSFile:"+gridFSFile.toString());\n\t\t} catch (FileNotFoundException e) {\n\t\t\te.printStackTrace();\n\t\t} finally {\n\t\t\tif (inputStream != null) {\n\t\t\t\ttry {\n\t\t\t\t\tinputStream.close();\n\t\t\t\t} catch (IOException e) {\n\t\t\t\t\te.printStackTrace();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tSystem.out.println("Done");\n\t}\n\t\n\t/**\n\t * 读取测试\n\t * \n\t * @author Ethan Wong\n\t * @datetime 2016年1月18日下午3:51:28\n\t */\n\t@Test\n\tpublic void findFilesInGridFs() {\n\t\tList<GridFSDBFile> result = gridFsOperations.find(new Query().addCriteria(Criteria.where("filename").is("e.png")));\n\t\tfor (GridFSDBFile file : result) {\n\t\t\ttry {\n\t\t\t\tSystem.out.println(file.getFilename());\n\t\t\t\tSystem.out.println(file.getContentType());\n\t\t\t\t//save as another image\n\t\t\t\tfile.writeTo("C:/Users/ETHAN/Pictures/e1.png");\n\t\t\t} catch (IOException e) {\n\t\t\t\te.printStackTrace();\n\t\t\t}\n\t\t}\n\t\tSystem.out.println("Done");\n\t}\n}
3、登录mongoDB查看结果
db.getCollection('imethan_sys_file.files').find({})
/* 1 */\n{\n "_id" : ObjectId("569c9831c6a346b44944e6e8"),\n "chunkSize" : NumberLong(261120),\n "length" : NumberLong(3327),\n "md5" : "879a908fd59d7419b42d43e389886a0b",\n "filename" : "e.png",\n "contentType" : "image/png",\n "uploadDate" : ISODate("2016-01-18T07:45:53.828Z"),\n "aliases" : null,\n "metadata" : {\n "extra1" : "anything 1",\n "extra2" : "anything 2"\n }\n}
db.getCollection('imethan_sys_file.chunks').find({})
/* 1 */\n{\n "_id" : ObjectId("569c9831c6a346b44944e6e9"),\n "files_id" : ObjectId("569c9831c6a346b44944e6e8"),\n "n" : 0,\n "data" : { "$binary" : "iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD/gAIDAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAipJREFUeNrs3T9LHEEcxvHnt3/ucmoai5CkFCGNYCH4BmySKm0qy7R5HemSMkWaEF9ASJE3IIiIyCFY2SmJQVAMMR53N7Np0gXB3dvxZve+T7+w87mZ3wwzw62tfShE7pYEArDAAgsssMCCACywwAILLLAgAAsssBqUrOwDg7Fcw7cLU9ODLDzWyGtzVcuLKhrrZabjC20dKk8CYzmvjSWtPWl2z9r/oU/9KlhJhWHY9FRuAgUeLLDAmkK6WcUHs9Bvdv5H/TOl0fwoienoXKlFidX/qddf1cvjWpR20iixUlMvVy9rw/ilwIMFFlhggUXAAgsssMACi4AFFlhgNSnBN+Wc1/UoihPsXi6LHOvxgl4+q7iNW2NGTrunGjqZRYy18kjvn0+/Ww2dXnzWzVjZBFizUrMGY01eCSjwYIEF1j2lluk4+Gx4PdLZ70kXODW8xlC+iH6dtfddb75N/0S6kJyf9MpF8Eb4QkNX8SJGzRXHoh+GJiVWw4tS4MECi4AFFlhggQUWAQsssMACCywCVrnM0E7p/0mt3EZzcKz5jpYXK/6PQtCYdDXQ5aDELm7wRqw/1ZdXkQ6rjwd6t6OH3WiwEpv+FZpbG1+yYs90gS97a4zZEKxIsNpxAvhvQizZltIFfuzlvIpWSDkfEqub6u225vJWdCvp4kbznWBYZjr5Jd+WbxNkoVfw+QxPCcyGYIEFFlhgEbDAAgsssMAiYIEFFlhNyt8BAPkOZG4vtuN7AAAAAElFTkSuQmCC", "$type" : "00" }\n}
参考文档
http://docs.spring.io/spring-data/data-mongo/docs/1.8.2.RELEASE/reference/html/#gridfs
http://www.mkyong.com/mongodb/spring-data-mongodb-save-binary-file-gridfs-example/
开篇说明
持续集成工具可以使项目的构建、测试和部署等自动化,为软件开发节省大量的时间,这里主要简单介绍MAC下安装Jenkins,并且新建一个构建MAVEN的项目,使用SVN进行源码管理,构建成功后,安装部署到Tomcat 7.x。
环境准备
1、安装好JDK并且配置好环境变量,这里略过
2、安装好MAVEN并且配置好环境变量,这里略过
3、安装好Tomcat并且配置好端口和管理用户权限和角色
下载“apache-tomcat-7.0.67-windows-x64.zip”解压为“apache-tomcat-7.0.67”
编辑“conf/tomcat-users.xml”,配置管理员账号和权限
<role rolename="manager-gui"/>\n<role rolename="manager-script"/> \n<role rolename="manager-jmx"/> \n<role rolename="manager-status"/> \n<user username="admin" password="123456" roles="manager-gui"/> \n<user username="tomcat" password="123456" roles="manager-script,manager-jmx,manager-status"/>
由于Jenkins默认安装的端口是8080,所有这里需要修改Tomcat的端口为7777
编辑“conf/server.xml”
<Connector port="7777" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"
具体步骤
1、访问http://jenkins-ci.org/下载适合自己操作系统的版本的安装包。
MAC下载安装“jenkins-1.644.pkg”,浏览器打开:http://localhost:8080,显示Jenkins表示安装成功。
2、默认安装的Jenkins没有自带“Deploy to container Plugin”插件,所里这里需要安装这个插件,在Jenkins首页进入到“系统管理”-》“插件管理”-》“可选插件”,选择“Deploy to container Plugin”并且安装。
3、进行“系统管理”-》“系统配置”
1)Maven Configuration
2)Maven -》 Maven安装
3)邮件通知
4、在Jenkins首页新建一个“构建一个maven项目”的项目
1)源码管理配置:svn://localhost/svn-repository/appone
2)构建触发器 Poll SCM : */5 * * * * //5分钟执行一次
3)构建后操作 构建成功后部署到Tomcat
其他说明
1、mac下使用如下命令可以进行Jenkins的启动和关闭
sudo launchctl unload\n/Library/LaunchDaemons/org.jenkins-ci.plist
sudo launchctl load\n/Library/LaunchDaemons/org.jenkins-ci.plist
2、mac下默认安装的Jenkins的目录是“/Users/Shared/Jenkins/Home”
参考文档
http://www.cnblogs.com/itech/archive/2011/11/23/2260009.html
","channelName":"程序员笔记","channelId":7,"prev":null,"next":null,"labels":[{"id":23,"createTime":"2016/01/15","modifyTime":null,"name":"持续集成","orderNo":null,"check":false},{"id":21,"createTime":"2016/01/05","modifyTime":null,"name":"Tomcat","orderNo":1,"check":false}],"publish":true},{"id":139,"createTime":"2016/01/15","modifyTime":1452844377000,"title":"Tomcat使用Redis缓存实现分布式Session共享","content":"前置场景描述
在两台linux服务器上分别安装Tomcat,并且部署相同的WEB应用,通过前置服务器的nginx反向代理,达到这两个Tomcat的负载均衡的目的,实现分布式部署;当发生单点故障或者临时停机,nginx会将用户当前访问的WEB应用切换到其他正常服务器到应用上,这个时候如果session不同步,则会导致用户会话超时,提示再次登录的现象,会给用户产生非常不好的体验。
所以出现了Tocmat Session共享的课题,用于解决session不同步,应用切换时会话超时的问题。
Tomcat Session共享的实现方式有多种,例如使用memcache、mongodb、redis等,本文主要针对使用redis来实现Tomcat的Session共享。
实际操作步骤
1、访问https://github.com/jcoleman/tomcat-redis-session-manager/releases ,下载"1.2-tomcat-7-java-7.zip"并解压后将项目导入Eclipse,构建成功,并且导出“tomcat-redis-session-manager-1.2-tomcat-7.jar”
2、将如下jar包放到tomcat的lib目录下
tomcat-redis-session-manager-1.2-tomcat-7.jar
commons-pool2-2.2.jar
jedis-2.5.2.jar
tomcat-juli-7.0.27.jar
3、编辑tomcat配置文件context.xml,加入如下内容
<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />\n <Manager className="com.radiadesign.catalina.session.RedisSessionManager"\n host="localhost" \n port="6379" \n database="0" \n maxInactiveInterval="60" \n />
这里使用的是本机默认安装的redis
4、启动tomcat并且访问应用,查看redis缓存内容如下
127.0.0.1:6379> get 33B32CE273EE4375C78B75CD8BE684DA
"\\xac\\xed\\x00\\x05sr\\x00Ncn.zblink.framework.redis.session.manager.tomcat7.SessionSerializationMetadata\\xdea\\xb1\\n\\x9a\\xcdn\\xff\\x03\\x00\\x01[\\x00\\x15sessionAttributesHasht\\x00\\x02[Bxpw\\x14\\x00\\x00\\x00\\x10V\\x1b\\x96:\\xe1r\\x97_m'k\\xbb\\xca\\xeb\\x0e\\x1axsr\\x00\\x0ejava.lang.Long;\\x8b\\xe4\\x90\\xcc\\x8f#\\xdf\\x02\\x00\\x01J\\x00\\x05valuexr\\x00\\x10java.lang.Number\\x86\\xac\\x95\\x1d\\x0b\\x94\\xe0\\x8b\\x02\\x00\\x00xp\\x00\\x00\\x01RDC\\"\\x02sq\\x00~\\x00\\x03\\x00\\x00\\x01RDC\\"\\x02sr\\x00\\x11java.lang.Integer\\x12\\xe2\\xa0\\xa4\\xf7\\x81\\x878\\x02\\x00\\x01I\\x00\\x05valuexq\\x00~\\x00\\x04\\x00\\x00\\a\\bsr\\x00\\x11java.lang.Boolean\\xcd r\\x80\\xd5\\x9c\\xfa\\xee\\x02\\x00\\x01Z\\x00\\x05valuexp\\x01q\\x00~\\x00\\nsq\\x00~\\x00\\x03\\x00\\x00\\x01RDC\\"\\x03t\\x00 33B32CE273EE4375C78B75CD8BE684DAsq\\x00~\\x00\\a\\x00\\x00\\x00\\x01t\\x00\\x15justForSessionTestKeyq\\x00~\\x00\\x0ew\\b\\x00\\x00\\x01RDC\\"\\x02"
127.0.0.1:6379>
参考文档:
https://github.com/jcoleman/tomcat-redis-session-manager
","channelName":"程序员笔记","channelId":7,"prev":null,"next":null,"labels":[{"id":21,"createTime":"2016/01/05","modifyTime":null,"name":"Tomcat","orderNo":1,"check":false},{"id":9,"createTime":"2015/12/18","modifyTime":null,"name":"Redis","orderNo":13,"check":false}],"publish":true},{"id":138,"createTime":"2016/01/12","modifyTime":1453043387000,"title":"org.quartz.SchedulerException: Couldn't get host name! [See nested exception: java.net.UnknownHostException:","content":"hostname没有指向IP地址,编辑/etc/hosts,将hostname指向127.0.0.1即可
vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4\n::1 localhost localhost.localdomain localhost6 localhost6.localdomain6\n127.0.0.1 ticket.centerB
在使用nginx进行反向代理,转发指定的请求的时候没有配置端口转发,导致在程序里面获取不到端口
没有端口转发的配置:
upstream server {\n ip_hash;\n server 192.168.1.100:8080;\n}\n\nserver {\n listen 8080;\n server_name server ;\n\n charset utf-8;\n\n location / {\n root html;\n index index.html index.htm;\n proxy_pass http://server ;\n proxy_redirect off;\n proxy_set_header Host $host; \n proxy_set_header X-Real-IP $remote_addr; \n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; \n proxy_connect_timeout 1000;\n\n # proxy_read_timeout 1000;\n # proxy_send_timeout 1000;\n # proxy_buffer_size 16k;\n # proxy_buffers 4 32k;\n # proxy_busy_buffers_size 64k;\n }\n\n #error_page 404 /404.html;\n\n # redirect server error pages to the static page /50x.html\n #\n error_page 500 502 503 504 /50x.html;\n location = /50x.html {\n root /usr/local/nginx/html;\n }\n\n}
使用该配置,在服务端通过JAVA代码“String uri = request.getRequestURL().toString();”获取URL地址如下,没有端口
http://192.168.20.2/console/security_check
需要将配置
proxy_set_header Host $host;
改为
proxy_set_header Host $host:$server_port;;
重新在服务端通过JAVA代码“String uri = request.getRequestURL().toString();”获取URL地址如下,有端口
http://192.168.20.2:8080/console/security_check