面试题:
http://www.importnew.com/22056.html
http://marlonyao.iteye.com/blog/344876
http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763104687270e54f72864879b5468d4e419ce3b46454762e0b82c3510738983233915ea141cbcff2102471453b08cb98b5daec885295f9f564267688c5613a30edfbd5151c337e150fed96af0bb806ac0ea81c4de2444bb52120d84e7fa291762cc78f1642692d78e3f15&p=9a769a4786cc41af59a6e6285c07cf&newp=8067c64ad4934eaf58eccb3861648b231610db2151d6d0106b82c825d7331b001c3bbfb423241200d7c07a6c00ac4e56ecf73d78350025a3dda5c91d9fb4c57479&user=baidu&fm=sc&query=%BB%A5%C1%AA%CD%F8%BD%F0%C8%DAjava%C3%E6%CA%D4%CC%E2&qid=d6cd91620001a7e2&p1=1
http://blog.csdn.net/luanlouis/article/details/40422941
http://ms.csdn.net/geek/79519
http://blog.csdn.net/u010154380/article/details/53557507
http://blog.csdn.net/qq_35124535/article/details/64129964
http://blog.csdn.net/pistolove/article/details/46753275
Redis并发注意点:http://qsalg.com/?p=423
RPC原理:http://www.cnblogs.com/LBSer/p/4853234.html
Java相关原理和深入学习:http://wiki.jikexueyuan.com/list/java/
微服务的一种开源实现方式——dubbo+zookeeper http://blog.csdn.net/zhdd99/article/details/52263609
RPC框架:
http://www.cnblogs.com/luxiaoxun/p/5272384.html
https://my.oschina.net/huangyong/blog/361751
JDK集合框架原理:http://yikun.github.io/tags/Java/
牛逼的博客:http://www.cnblogs.com/LBSer/p/4753112.html
编程狂人周刊:http://www.tuicool.com/mags
码农周刊:http://weekly.manong.io/issues/
http://blog.csdn.net/zhangliangzi/article/details/52526125
成为一个Java的架构师要学习哪些知识? 搜索知乎
soa和微服务架构的区别?搜索知乎
美团点评技术: http://tech.meituan.com/
http://blog.csdn.net/zhangliangzi/article/details/50995326
Java精华:
http://blog.csdn.net/kobejayandy/article/category/1216487
Java并发集合的实现原理:http://www.cnblogs.com/luxiaoxun/p/4638748.html
Java并发原理:http://blog.csdn.net/column/details/14531.html
数据库索引原理和B+树算法分析!!!数据库索引的实现(B+树介绍、和B树、R树区别)
分布式的幂等性和分布式CAP原理!!!
多读书:
JVM公众号推荐:你假笨
《core Java》多线程部分 《effective java》《深入理解Java虚拟机》《Java并发编程实战》
《Java多线程编程核心技术》《实战java高并发程序设计》《Java并发编程实战》《jcip》《深入理解Java虚拟机:JVM高级特性与最佳实践》《深入分析Java Web技术内幕》《Spring源码深度解析》
《大型网站技术架构 核心原理与案例分析》《大型网站系统与Java中间件实践》《高性能MySQL》
《重构 改善既有代码的设计》《企业应用架构模式》《从Paxos到ZooKeeper 分布式一致性原理与实践》
《分布式系统常用技术及案例分析》《精通Spring 4.x》
《高性能网站构建实战》《实用负载均衡技术:网站性能优化攻略》
书籍推荐:http://blog.jobbole.com/106093/
http://www.importnew.com/7099.html
阿里面试:http://www.importnew.com/22056.html
http://www.importnew.com/22637.html
http://yemengying.com/2016/06/05/interview/
面试必看:https://github.com/kdn251/interviews/blob/master/README-zh-cn.md
https://github.com/it-interview/easy-job
http://taoxiaoran.top/pages/tags.html#Java
https://github.com/hadyang/interview
数据结构:
动画版展示数据结构: http://zh.visualgo.net/
架构师技能:http://www.zhihu.com/question/29031276
AOP必看博客,架构分析+优化
http://blog.csdn.net/xvshu/article/details/46288953
http://blog.csdn.net/xvshu/article/category/2110821/2
http://blog.csdn.net/chenleixing/article/details/47099725
http://www.cnblogs.com/java-zhao/category/776210.html
http://www.iteye.com/topic/1122859
http://www.cnblogs.com/davidwang456/p/4213652.html
http://blog.csdn.net/z69183787/article/category/2175689/2
http://www.cnblogs.com/java-zhao/p/5106189.html
http://blog.csdn.net/xyw591238/article/category/6083265
https://github.com/jcalaz/jcalaBlog
Java并发容器源码分析:http://blog.csdn.net/Architect0719/article/category/6193805
书籍推荐:
http://blog.csdn.net/u013256816/article/details/52091850
读书:
深入理解计算机系统、Java并发编程实战、深入理解Java虚拟机第二版、tcp/ip详解 卷一、二、三,Java数据结构与算法
几个流行Java框架:
Spring MVC/Spring Boot
Spark
Dropwizard
Ninja framework
ZK
Ratpack 用于构建现代化HTTP程序的Java库
Jodd
jHipster
分布式协调框架:zookeeper etcd
Java 应用监控 https://github.com/stagemonitor/stagemonitor
http://wsmajunfeng.iteye.com/blog/1744587
7个监控项目: http://www.codeceo.com/article/7-monitor-tools.html
Swagger学习:
http://blog.csdn.net/u010827436/article/details/44417637
Java博客推荐:http://www.tuicool.com/articles/jUrQ7r6
http://www.cnblogs.com/swiftma/category/816241.html
http://www.cnblogs.com/skywang12345/category/489072.html
Java常见类底层实现分析:http://blog.csdn.net/column/details/chenssy-javaimpr.html
开发者头条、简书、码农周刊、推酷、http://www.importnew.com/ 、极客头条、stackoverflow、java world
深入Java:http://www.codeceo.com/article/tag/java 、http://hugnew.com/?cat=17 、 http://www.hollischuang.com/archives/1001 、
http://www.ibm.com/developerworks/cn/java/ 、 http://www.programcreek.com/ 、http://www.open-open.com/lib/tag/Spring 、
http://blog.csdn.net/pkueecser/article/details/50670601 、猿天地 http://cxytiandi.com/blog 、技术干货:http://www.primeton.com/pr/tech.php
国外技术趋势网站:
https://www.infoq.com
https://seroter.wordpress.com/category/aws/
http://www.theserverside.com/
https://dzone.com
https://www.javacodegeeks.com/2015/12/profile-successful-java-developer-2016.html?spm=5176.100239.blogcont54071.5.YXZzqC
http://ifeve.com/tech-related-sites/
Chrome插件:
掘金:http://gold.xitu.io/extension/
Postman:
需要熟练使用版本控制工具 Git(阅读:《Git 权威指南》),以及项目构建工具 Maven(阅读:《Maven实战》)。另外,在这个阶段可以尝试 TDD 开发。
进阶(2-6 个月)
目标:独立负责某个服务端项目。
技能:
掌握 web 开发最佳实践,掌握 Restful API 设计,理解 Spring 原理。推荐阅读《Spring 揭秘》。掌握项目分层、子模块划分。推荐阅读:《J2EE 核心模式》。
掌握 web 架构设计。包括 Http 反向代理,数据缓存,负载均衡,水平扩展和垂直扩展。推荐阅读:《分布式Java应用:基础与实践》。
掌握关系型数据库。包括设计 MySQL 表结构,根据业务特点分表分库,基于执行计划的 SQL 分析优化,以及数据库容量规划。推荐阅读:《MySQL 必知必会》、《高性能 MySQL》。
了解 NoSQL。我们大规模使用 Hadoop、HBase、Hive,同时部分项目使用 Redis、Storm。你需要学会这些工具最基本的使用。
学习 web 安全知识。了解 web 前端安全问题。设计安全 web 服务,包括加解密、防伪造、防重放攻击等。
掌握 Http(推荐阅读:《图解 Http》、《Http 权威指南》)、Thrift 等协议。
掌握服务容量规划,性能调优,可靠性保证,以及故障处理。学习容量规划和性能调优知识,梳理业务监控点,熟练使用我们的监控报警系统。推荐阅读:《深入理解 Java 虚拟机》。
其他。设计模式:从项目中学习,有时间可以看看《深入浅出设计模式》、《JDK 里的设计模式》。学习Java Socket 编程与多线程知识,可以看看《Java 并发编程实战》,并翻翻并发编程网的文章。
深入(6 个月-)
目标:分布式系统和中间件开发。
构建知识体系:《大型网站系统与 Java 中间件实践》、《大型网站技术架构:核心原理与案例分析》。
原理与设计:《大规模存储式系统》、《UNIX 网络编程 卷1:套接字联网 API》、《How Tomcat Works》。
学习开源项目:Apache Thrift、Zipkin、Netty、Rose、Jade、淘宝 RPC 系统 Dubbo 等。分析项目中的设计思路。比如,同样是RPC框架,Finagle 和 Dubbo 有什么异同。
其他。根据参与的项目加深学习吧。比如,如果需要写 DSL,可以读一下《领域特定语言》,对 Redis 感兴趣推荐读一下:《Redis 设计与实现》。有两本书,无论做什么项目,都推荐读:《Unix 编程艺术》、《UNIX 环境高级编程(第3版)》。
HashMap、TreeMap、数据库索引 原理,及常见的平衡二叉树,红黑树原理和实现,redis的几种数据结构原理和优缺点(Hash结构的ziplist和quicklist原理),Hash算法原理和实现
https://github.com/spotify/apollo
http://blog.csdn.net/column/details/java-vitual-machine.html
http://blog.csdn.net/column/details/yrp-java-algorithm.html?&page=2
http://blog.csdn.net/column/details/datastructureinjava.html
http://blog.csdn.net/yannanying/article/details/46956355
http://blog.csdn.net/column/details/datastructure-phn.html
http://blog.csdn.net/column/details/zhonghua.html
http://blog.csdn.net/column/details/datastructure.html
https://github.com/shekhargulati/52-technologies-in-2016
十二个程序员必备的优质资源推荐: http://blog.csdn.net/proginn/article/details/51614131
美团点评技术团队:http://tech.meituan.com/
阿里中间件团队:http://jm.taobao.org/
BAT 技术团队博客:http://blog.csdn.net/tengdazhang770960436/article/details/49963983
技术博客推荐:http://www.cnblogs.com/newpanderking/p/4366174.html
NB的技术社区:https://yq.aliyun.com/tags/type_blog-tagid_41/?spm=5176.100239.rightarea.8.4qenGu
Spring-session源码解析:https://yq.aliyun.com/articles/57425?spm=5176.100239.blogrightarea58510.22.DTpSqZ
Java上线用到的项目:
JMeter 测试
FindBugs SparkJava
JProfiler 约束内存泄漏和修复线程的问题。
Takipi
消息中间件:
Nats --- 速度超快 每秒能处理千万级别消息,占用CPU少,但不支持离线
Kafka --- 速度快,每秒处理百万级消息,能存储,适合大数据
推荐需要看的几本书:
《轻量级微服务架构(上册)》
<<Web Scalability for Startup Engineers--互联网创业核心技术:构建可伸缩的web应用>>
《Spring源码深度解析》《大型网站技术架构 核心原理与案例分析》《大型网站系统与Java中间件实践》《Effective Java中文版》《HotSpot实战》
《从Paxos到ZooKeeper 分布式一致性原理与实践》《深入分析Java Web技术内幕》《java多线程编程核心技术》《实战Java高并发程序设计》
《深入Java虚拟机第2版》《重构 改善既有代码的设计》 《高性能MySQL第3版》 《Java编程思想第4版》 《HTTP权威指南》 《精通正则表达式必知必会》
《Java解惑》 《Java并发编程实践》 《鸟哥的Linux私房菜》《How Tomcat Works(中英文版)》 《Maven权威指南》
《Java并发编程实战》
要求:
其次掌握的技能树主要有三个方面:
第一个是基础,比如对集合类,并发包,IO/NIO,JVM,内存模型,泛型,异常,反射,等有深入了解,最好是看过源码了解底层的设计。比如一般面试都会问ConcurrentHashMap,CopyOnWrite,线程池,CAS,AQS,虚拟机优化等知识点,因为这些对互联网的企业是绝对重要的。而且一般人这关都过不了,还发闹骚说这些没什么用,为什么要面试。举一例子,在使用线程池时,因为使用了无界队列,在远程服务异常情况下导致内层飙升,怎么去解决?你要是连线程池都不清楚,你怎么去玩?再举一例,由于对ThreadLocal理解出错,使用它做线程安全的控制,导致没能实现真的线程安全,你怪我哦?所以作为一个拿两万的JAVA程序员这点基础是必须的。
第二你需要有全面的互联网技术相关知识。从底层说起,你起码得深入了解mysql,redis,mongodb,nginx,tomcat,rpc,jms等方面的知识。你要问需要了解到什么程度,我可以给你说个大慨。首先对于MySQL,你要知道常见的参数设置,存储引擎怎么去选择,还需要了解常见的索引引擎,知道怎么去选择。知道怎么去设计表,怎么优化sql,怎么根据执行计划去调优。高级的你需要去做分库分表的设计和优化,一般互联网企业的数据库都是读写分离,还会垂直与水平拆分,所以这个也有经验的成分在里面。然后redis,mongodb都是需要了解原理,需要会调整参数的,而nginx和tomcat几乎都是JAVA互联网方面必配,其实很阿里的技术栈选择有点关系。至于rpc相关的就多的去,必须各种网络协议,序列化技术,SOA等等,你要有一个深入的理解。现在应用比较广的rpc框架,在国内就是dubbo了,可以自行搜索。至于jms相关的起码得了解原理吧,一般情况下不是专门开发中间件系统和支撑系统的不需要了解太多细节,国内企业常用的主要是activeMQ和kafka。你能对我说的都研究的比较深入,阿里p6我觉得是没问题的,当然这个还需要看你的架构能力方面的面试表现了。
第三就是编程能力,编程思想,算法能力,架构能力的考量。首先2W程序员对算法的要求我觉得还是比较低,再高级也最多红黑树吧,但是排序和查询的基本算法得会。编程思想是必须的,问你个AOP和IOC你起码的清清楚楚,设计模式不说每种都用过,但是也能深入理解个十四五种。编程能力这个我觉得不好去评价,但是拿一个2000W用户根据姓名年龄排序这种题目也能信手拈来。最后就是架构能力,这种不是说要你设计个多牛逼多高并发的系统,起码让你做一个秒杀系统,防重请求的设计能快速搞定而没有坑吧。
#深入理解Java虚拟机第2版
#Java并发编程实战
#MongoDB权威指南
#Netty权威指南
Netty Mina框架源码
2016新兴互联网公司前300:http://www.askci.com/news/hlw/20160425/941447185.shtml
面试:
1.数据传入的安全性解决方案?认证 SSL HTTPS 原理(eg:游戏中数据传输给服务器,如何保证数据安全和完整,防止外挂?)
2.如何使用多线程处理同一个大的任务?
3.蹲坑算法(数据量大的时候,根据内存空间的有序性,为每个数找各自对应的内存空间地址)
4.如何防止内存被击穿,最大并发限制,降级策略?(eg:游戏服务器,并发最多5000,超过就回击穿服务器内存,如果玩家>5000,如何处理?)
百万级访问量网站架构:http://www.biaodianfu.com/thinking-before-building-site.html
http://www.wtoutiao.com/p/12aqbAi.html
初期架构一般比较简单,web负载均衡+数据库主从+缓存+分布式存储+队列。
大方向上也确实就这几样东西,细节上也无数文章都重复过了,按照将来会有N多WEB,N多主从关系,N多缓存,N多xxx设计就行,基本方案都是现成的,
只是您比其他人厉害之处就在于设计上考虑到缓存失效时的雪崩效应、主从同步的数据一致性和时间差、队列的稳定性和失败后的重试策略、文件存储的效率和备份方式等等意外情况。
缓存总有一天会失效,数据库复制总有一天会断掉,队列总有一天会写不进去,电源总有一天会烧坏。根据墨菲定律,如果不考虑这些,网站早晚会成为茶几
需要加强学习的东西:
网络: Netty,mina,NIO,REST,OAuth
Web:Tapestry,DWR,GWT,WebX
搜索: ElasticSearch,Solr
缓存/DB: mongoDB、HBASE,Cassandra,Redis
中间件:RPC,Dubbo,Thrift,Zookeeper,ActiveMQ, Kafka
技能: Shell编程、性能调优、MAT、救火、故障排查
跨语言: shell、Go、NodeJS
大数据: hadoop、hbase、storm、hive、pig、spark
其他框架:Spring Boot、Spring Cloud、 Disruptor(Disruptor是一个用于在线程间通信的高效低延时的消息组件,它像个增强的队列)、Guava、Trove(高性能集合框架)
多线程推荐:
http://www.cnblogs.com/dolphin0520/category/602384.html
http://blog.csdn.net/qilixiang012/article/category/2857487
http://blog.csdn.net/column/details/java-dxc.html
1.Eclipse安装Activiti插件 http://activiti.org/designer/update/
2.Spring MVC 输出页面乱码 在mvc.xml中配置 StringHttpMessageConverter 编码格式
<mvc:message-converters>
<beans:bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></beans:bean>
<beans:bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"></beans:bean>
<beans:bean class="org.springframework.http.converter.StringHttpMessageConverter">
<beans:property name="supportedMediaTypes">
<beans:list>
<beans:value>text/plain;charset=UTF-8</beans:value>
<beans:value>text/html;charset=UTF-8</beans:value>
</beans:list>
</beans:property>
</beans:bean>
<beans:bean class="org.springframework.http.converter.ResourceHttpMessageConverter"></beans:bean>
<beans:bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"></beans:bean>
<beans:bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"></beans:bean>
</mvc:message-converters>
3.Spring MVC注解式统一异常处理:
--- 可根据异常,返回数据或指定页面
BaseController中添加方法处理异常
@ExceptionHandler(RuntimeException.class)
public @ResponseBody ResponseVo runtimeExceptionHandler(RuntimeException ex) {
ResponseVo responseVo = new ResponseVo();
responseVo.setSuccess(false);
responseVo.setMsg(ex.getMessage());
responseVo.setData(ex);
return responseVo;
}
4.几个最常用的Eclipse快捷键
1. ctrl+shift+r:打开资源,在workspace中快速按文件名查找
2. ctrl+o:快速outline,查看代码结构,显示类中方法和属性,能快速定位类的方法和属性
3. ctrl+e:快速转换编辑器
4. ctrl+2,L:为本地变量赋值
5. alt+shift+r:重命名
6. Alt+左右方向键
我们经常会遇到看代码时Ctrl+左键,层层跟踪,然后迷失在代码中的情况,
这时只需要按“Alt+左方向键”就可以退回到上次阅读的位置,
同理,按“Alt+右方向键”会前进到刚才退回的阅读位置
7.ctrl+shift+x和ctrl+shift+y:英文字母大小写的转换
8.ctrl+shift+f:格式化代码
9.ctrl+m:当前编辑页面窗口最大/小化
10.ctrl+shift+o:自动引入包和删除无用包
11.Ctrl+T 快速显示当前类的继承结构
12.Ctrl+W 关闭当前窗口
13.Alt+Shift+R 重命名
14.Alt+Shift+M 抽取方法
15.【Ct rl+K】、【Ct rl++Shift +K】 快速向下和向上查找选定的内容,从此不再需要用鼠标单击查找对话框
16.Ctrl+Shift+G 查找类、方法和属性的引用
17.Alt+Shift+w 查找当前文件所在项目中的路径
18.Ctrl+Shift+w 关闭所有文件
最实用的:
【Alt + ← 】 查看代码时,返回上次查看位置 --- 后退上次代码记录
【Alt + → 】 查看代码时,跟踪,回到下次浏览位置
点中类名+F4 查看类的继承关系
5.常见的内存移除的3种情况
1.JVM Heap(堆)溢出 java.lang.OutOfMemoryError:Java heap space
JVM在启动的时候会自动设置JVM Heap的值, 可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。
Heap的大小是Young Generation 和Tenured Generaion 之和。在JVM中如果98%的时间是用于GC,且可用的Heap size 不足2%的时候将抛出此异常信息
解决方法:
设置JVM Heap(堆)大小
即:-Xmn -Xms -Xmx等选项,以及 年轻代与年老代的比例 ratio等参数
2.PermGen space溢出 java.lang.OutOfMemoryError:PermGen space
永久带溢出 --- 一般发生在程序启动阶段
永久带被JVM存放Class和Meta信息,如果载入很多Class,可能出现PermGen space溢出
解决方法:
通过-XX:PermSize和-XX:MaxPermSize设置永久代大小即可
3.栈溢出 java.lang.StackOverflowError : Thread Stack space
可能原因:递归层次太多,导致栈溢出
解决方法:
1.修改程序
2.通过 -Xss 设置每个线程的Stack大小
Server容器启动时,需要设置的几个JVM参数:
-Xms:java Heap 堆初始大小, 默认是物理内存的1/64。
-Xmx:java Heap 堆最大值,不可超过物理内存。
-Xmn:young generation的heap堆大小,一般设置为Xmx的3、4分之一 。增大年轻代后,将会减小年老代大小,可以根据监控合理设置。
-Xss:每个线程的Stack大小,而最佳值应该是128K,默认值好像是512k。
-XX:PermSize:设定内存的永久保存区初始大小,缺省值为64M。
-XX:MaxPermSize:设定内存的永久保存区最大大小,缺省值为64M。
-XX:SurvivorRatio:Eden区与Survivor区的大小比值,设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10
-XX:+UseParallelGC:F年轻代使用并发收集,而年老代仍旧使用串行收集.
-XX:+UseParNewGC:设置年轻代为并行收集,JDK5.0以上,JVM会根据系统配置自行设置,所无需再设置此值。
-XX:ParallelGCThreads:并行收集器的线程数,值最好配置与处理器数目相等 同样适用于CMS。
-XX:+UseParallelOldGC:年老代垃圾收集方式为并行收集(Parallel Compacting)。
-XX:MaxGCPauseMillis:每次年轻代垃圾回收的最长时间(最大暂停时间),如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。
-XX:+ScavengeBeforeFullGC:Full GC前调用YGC,默认是true。
实例如:JAVA_OPTS=”-Xms4g -Xmx4g -Xmn1024m -XX:PermSize=320M -XX:MaxPermSize=320m -XX:SurvivorRatio=6″
6.Service或Dao层获取request和IP方法?
1.获取IP InetAddress.getLocalHost().getHostAddress()
2.获取request对象 http://my.oschina.net/u/2007041/blog/420956
7.JDK6在Linux下的安装
第一:用linux 的命令运行它: sh jdk-6u2-linux-i586-rpm.bin
第二:按多次回车后出现
Do you agree to the above license terms? [yes or no]
输入yes
第三:编辑环境变量
$gedit ~/.bashrc
加入如下五行:
JAVA_HOME=/usr/java/jdk1.6.0_02
JAVA_BIN=/usr/java/jdk1.6.0_02/bin
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH
第四步是必须的,不然它总是调用FC6自带的jdk1.4
第四:创建链接
#cd /usr/bin
#ln -s -f /usr/local/jdk1.5.0_05/jre/bin/java
#ln -s -f /usr/local/jdk1.5.0_05/bin/javac
或 环境变量配置 vi /etc/profile
#for java
export JAVA_HOME=/home/hetiewei/software/java/jdk1.8.0_40
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
#for go
export GOROOT=/home/hetiewei/go/soft/go
export PATH=$GOROOT/bin:$PATH
export GOPATH=/home/hetiewei/go/soft/go/pkg
#for node
export NODE_HOME=/home/hetiewei/node/software/node-v6.2.0-linux-x64
export PATH=$PATH:$NODE_HOME/bin
export NODE_PATH=$NODE_HOME/lib/node_modules
PATH=/usr/local/ssl/bin:/sbin/:$PATH:/usr/sbin
export PATH
#for hadoop
export HADOOP_HOME=/home/hetiewei/software/bigdata/hadoop/hadoop-2.6.4
export PATH=.:$HADOOP_HOME/bin:$PATH
source /etc/profile
8.Tomcat启动时,在initialing Spring root context 卡死:
解决:
1.查看数据库连接
2.清除Tomcat下的work目录
9.Maven install时出现编码异常解决方法:
mvn clean install -Dmaven.javadoc.skip=true
maven 安装时跳过 测试用例:
mvn clean install -Dmaven.test.skip=true
10.Spring和Mybatis整合时无法读取properties的处理方案:
方法一:
修改<property name="sqlSessionFactory" ref="sqlSessionFactory"/>为<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
原理:使用sqlSessionFactoryBeanName注入,不会立即初始化sqlSessionFactory, 所以不会引发提前初始化问题。
方法二:
直接删掉<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
注意:在没有配置这一行时,必须配置一个以sqlSessionFactory命名的org.mybatis.spring.SqlSessionFactoryBean。
11.token,Session的区别?
服务器在生成表单的时候同时生成一个CSRF token,插入到表单的一个hidden field里面,并且把这个token记录在服务器端,通常是用户的Session数据里面。
客户端啥都不用干,照常提交表单。当表单被提交的时候,服务端检查一个表单里面的token跟自己之前记录下来的是否匹配,匹配才继续处理。
CSRF劫持的请求也会带上网站的cookie的,所以光验证session并不能避免CSRF
token的关键是在于你在发送请求的时候一定要保证你是读取了这个页面的。。 而不是凭空就发送请求
对于HTTP协议来说,就是url,header,body
对于WEB页面来说,就是url,form/post body,cookie
好了,现在有的就是这么多东西,要怎么用呢?
首先是第一个问题,HTTP请求是无状态的,我怎么知道谁是谁?
解:让用户每次访问的时候告诉你它叫什么,怎么告诉?url,form/post body,cookie
然后是第二个问题,用户访问的时候说他自己是张三,他骗你怎么办?
解:在服务器端保存张三的信息,给他一个id,让他下次用id访问。id保存在url,form/post body,cookie中。这叫做session
现在是第三个问题,用户提交了一笔订单,你怎么保证他是在你的订单页面提交的?(referer可能是一个办法)
解:在你订单页面中放入一个加密的信息,只有真正打开了订单页才能知道,提交的时候将这个信息返回回来。这个东西,可以被叫做token
Token实现防止表单重复提交?
表单重复提交的两种情形:
1.通过浏览器回退功能,回到原来页面重复提交表单,服务器端应避免用户重复注册
2.提交完成后,单击浏览器的“刷新”按钮,浏览器会弹出对话框,询问是否重新提交数据。单击“是”,浏览器会重新提交数据。
如何防止?
每次请求都生产一个token标识
1.表单提交后,先匹配(使用Aop做)token,判断当前用户会话中token令牌值与当前请求参数的token令牌值是否一致
2.每次请求都创建一个新的token令牌,将其保存在当前会话(session)范围内
3.token在服务器端匹配后,就把session中的toke令牌值删除
12.Java线程安全的本质:线程中并没有存放任何对象数据,而是在执行时,去主内存(堆)中去同步数据,所有的对象数据都存在JVM的堆中,因此需要对资源进行共享锁!!!
堆 --- JVM的核心数据存储区 --- 线程共享的主内存
堆中为JVM的所有对象分配了内存空间用以存储和维护变量值等
栈 --- 线程私有的内存区,由值栈(线程栈)组成,存放8中基本数据类型和对象引用
每个线程都会生成一个自有的线程栈,线程栈中用存储了该线程的基本数据常量,变量值,以及对象长变量的引用
每个线程执行时,根据代码顺序,压栈 值栈(栈内存)
对象变量在线程执行时的过程:!!! --- 由JVM内存模型决定
1.线程根据栈中的引用去堆上同步该对象数据下来,然后在线程自己的内存中进行操作
2.操作之后再将线程栈撒花姑娘的运算结果同步到堆(主内存)中
3.多线程时,因为每个线程都操作自己从主内存(JVM堆)中同步过来的数据,如果不加锁,会导致线程安全问题(数据提交到主内存时不一致)
13.堆 --- JVM中所有对象的内存空间 分为: Young Gen, Old Gen
Young Gen 又分为:Eden区和两个大小相同的Survivor区(from 和 to)
Eden和Survivor默认比例 8:1 由 -XX:SurvivorRation设置
堆大小 -Xmx -Xms 设置
Young Gen -Xmn 设置
-XX:NewSize和-XX:MaxNewSize
用于设置年轻代的大小,建议设为整个堆大小的1/3或者1/4,两个值设为一样大。
Minor GC --- 发生在新生代的垃圾回收,Java 对象大多都具备朝生夕灭的特性,所以 Minor GC 非常频繁,一般回收速度也比较快,
年轻代的GC使用复制算法(将内存分为两块,每次只用其中一块,当这块内存用完,就将还活着的对象复制到另外一块上面,复制算法不会产生内存碎片)
Full GC --- 发生在年老代的GC, Full GC比较慢,尽量避免
新创建对象都会被分配到Eden区(一些大对象特殊处理),当Eden区满则进行Minor GC,
这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区, 对象在Survivor区中每熬过一次Minor GC,年龄增加1岁,
当年龄增加到一定程度后(默认15岁),会被移动到年老代中,
当年老代满时,经常Full GC
线程Stack 每个线程独有的操作数栈局部变量表方法入口 -Xss 设置
方法区 -XX:PermSize和-XX:MaxPermSize设置
JVM中的类加载机制: http://www.cnblogs.com/ITtangtang/p/3978102.html
14.Go,MongoDB,redis,node.js在Linux下的安全和配置
1.go
下载tar.gz后,
解压:tar -zxvf go1.6.2.linux-amd64.tar.gz
环境变量:
vi /etc/profile
在profile中添加一下内容:
GOPATH和GOROOT修改为你的路径即可!!!
export GOROOT=/home/forward/tools/go
export PATH=$GOROOT/bin:$PATH
export GOPATH=/home/forward/tools/gopkg
刷新环境变量:
source /etc/profile
验证:
go version
编译Go程序:
go build xx.go
直接运行Go程序:
go run xx.go
2.mongodb
解压:
tar -zxvf mongodb-linux-i686-3.2.6.tgz
环境变量:
--- (只当前用户有效)
export PATH=<mongodb-install-directory>/bin:$PATH
或
--- (全局有效)
vi /etc/profile
在profile中添加一下内容:
export PATH=<mongodb-install-directory>/bin:$PATH
刷新环境变量:
source /etc/profile
3.node.js
下载解压:
wget --no-check-certificate https://nodejs.org/dist/v6.2.0/node-v6.2.0-linux-x64.tar.gz
环境变量:
NODE_HOME 是node.js安全目录
export NODE_HOME=/home/hetiewei/node/software/node-v6.2.0-linux-x64
export PATH=$PATH:$NODE_HOME/bin
export NODE_PATH=$NODE_HOME/lib/node_modules
刷新环境变量: 让环境变量生效
source /etc/profile
验证:
命令行输入:node -v,查看node.js的版本
4.redis
参考官方源码安装说明
Redis Cluster集群的搭建与实践 http://lib.csdn.net/article/redis/60796
15.通过Spring在工具类中获取HttpServletRequest对象:
/**
* 获取当前Request
* @return
*/
private HttpServletRequest getRequest() {
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
return requestAttributes.getRequest();
}
16.Spring mvc在redirect请求中传递数据 http://shmilyaw-hotmail-com.iteye.com/blog/2246344
3种方式:1.Session 2.url template 3. flash attribute
17.logback与ActiveMQ的slf4j jar包冲突解决??? --- MQ使用指定版本, 不使用用activemq-all
<!-- Spring 整合ActiveMQ -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<!-- activeMQ begin -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.7.0</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
<version>5.7.0</version>
</dependency>
18.logback配置打印MyBatis执行的sql?
在logback.xml中配置 : dao所在的包名
<logger name="com.tuniu.plat.config.dao" level="DEBUG"/>
19.Spring MVC接收不到前端的参数???
试试: data:JSON.stringify(formData)
20.File文件目录中文无法解析的问题:
String path = Config.class.getClassLoader().getResource("").toURI().getPath();
21.Spring MVC 转发和重定向的传参问题?
1.转发 forward
1. this.getServletContext().getRequestDispatcher("/rentHouse.htm?method=display").forward(request,response);
return null;
2. return new ModelAndView("forward:/xxx.htm", map);
或
ModelAndView mv = new ModelAndView("forward:/xxx.htm");
mv.addAtrribute("param", value)
return mv;
2.重定向 redirect
1.无参数
return new ModelAndView("redirect:/toList");
return "redirect:/ toList ";
2.有参数
1.手动拼url
new ModelAndView("redirect:/toList?param1="+value1+"¶m2="+value2);
这样有个弊端,就是传中文可能会有乱码问题。
2.用RedirectAttributes
redirectAttributes.addFlashAttribute("message", "保存用户成功!");//使用addFlashAttribute,参数不会出现在url地址栏中
public String save(@ModelAttribute("form") Bean form,RedirectAttributes attr)
throws Exception {
String code = service.save(form);
if(code.equals("000")){
attr.addFlashAttribute("name", form.getName());
attr.addFlashAttribute("success", "添加成功!");
return "redirect:/index";
}else{
attr.addAttribute("projectName", form.getProjectName());
attr.addAttribute("enviroment", form.getEnviroment());
attr.addFlashAttribute("msg", "添加出错!错误码为:"+rsp.getCode().getCode()+",错误为:"+rsp.getCode().getName());
return "redirect:/maintenance/toAddConfigCenter";
}
}
注意:
1.使用RedirectAttributes的addAttribute方法传递参数会跟随在URL后面,如上代码即为http:/index.action?a=a
2.使用addFlashAttribute不会跟随在URL后面,会把该参数值暂时保存于session,待重定向url获取该参数后从session中移除,
这里的redirect必须是方法映射路径,jsp无效。你会发现redirect后的jsp页面中b只会出现一次,刷新后b再也不会出现了,
这验证了上面说的,b被访问后就会从session中移除。对于重复提交可以使用此来完成.
22.QQ 网页上的登陆模块(全程HTTP/GET请求) --- 前端数据的安全
QQ 在登陆时,对用户输入的密码加密的JS代码为:
function getEncryption(password, uin, vcode, isMd5) {
var str1 = hexchar2bin(isMd5 ? password : md5(password));
var str2 = md5(str1 + uin);
var str3 = md5(str2 + vcode.toUpperCase());
return str3
}
白话就是: md5(md5(md5(密码) + 用户的QQ号) + 验证码)
验证码是一次性的, 所以,在你在网络层拿到本次的请求之后,无法做 重放攻击, 因为验证码是不正确的.
23.git常用命令:
git init 将当前目录初始化为git仓库
git status 查看仓库状态
git add xx 添加文件,该文件等待提交
git add -A 或 git add . 添加当前目录下所有文件
git commit -m "备注" 提价到本地git仓库
git remote add origin https://github.com/jayfeihe/xx.git 为本地仓库指定远程仓库
git remote rm origin 断开远程仓库
git remote -v 查看远程仓库
git pull origin master 从远程仓库拉取文件
git push origin master 向远程仓库推送已提交内容
1,如何在提交代码前看看我的代码中不同文件的状态?
git status
2,如何把别人的代码拉取下来?
git clone url
url:一般都是在github上的仓库地址
执行这个命令后,仓库就会被下载到你指定的目录
3,如何把新的文件加入到git的索引中?
git add file1 file2 file3
这么增加很多文件的话一定很烦,那么请使用git add . 把所有文件加入到git索引中
git索引:代表了你的文件已经被git管理
4,如何看我将要提交到远程仓库的文件?
git diff --cached
5,如何给我的提交增加备注说明?
git commit -m “xxxx说明”这个命令是提交代码必须的
6,如何通过图形化的界面查看该项目的所有历史提交记录?
gitk
7,如何查看项目的日志?也就是你的提交记录
git log
8,如何合并git add 和git commit 命令的效果?
git commit -a -m“xxx说明”
注意,这会把所有文件add到git索引中,可能你会有不想被git管理的文件,所以你需要事先通过忽略文件来控制。
9,如何创建一个分支?
git branch a
a就是新分支,然后使用git checkout a来切换到a分支,创建分支的意义是,你可以在自己的分支下开发,在开发完成后和主版本master合并,尤其在团队中尤为重要
10,如何合并分支到主分支?
git merge a master
11,如何删除已经合并的分支?
git branch -D a
12,如何暂时保存我们的工作记录,去看一个例如修复版本bug的事情?
git stash “xxxxx” 暂时记录你的工作状态
进行你的修复工作
git commit -a -m “xxx提交你的修复”
git stash apply 回到你的工作
13,如何搞定远程分支和本地主版本的合并?
git branch --track [远程分支的名称] origin/[远程分支的名称]
例如:git branch --track a origin/a
git pull a
pull:这个命令同时做了下载远程a分支,并合并到本地master的动作。如果有冲突是会合并失败的,但是不会造成下载a分支失败。
14,如何根据关键字搜索其在代码中出现的位置?
git grep -n [key]
15,如果我想重置我的版本如何做?
git reset --hard HEAD
这个命令会把你做过的所有未提交(git commit -m)的内容清空
16,如果我只想重置一个文件怎么做?
git checkout --file
这时只会check出一个未修改过的文件
17,如何修复一个已经提交文件中的错误?
虽然有2种做法,创建一个新提交和checkout出老提交并修复,但是建议通过创建新提交去做。因为git对于历史内容被改动会出现不能合并的情况
24.ActiveMQ整合Spring,监听队列
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:jms="http://www.springframework.org/schema/jms"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd ">
<!-- ActiveMQ连接工厂 -->
<bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL"
value="failover:(tcp://mq.master.jd.tuniu-cie.org:61616)" />
</bean>
<!-- <bean id="productDetailListener" class="com.tuniu.plat.service.mq.ProductDetailListener"/> -->
<!--方式一:只监听一个队列 -->
<!-- 监听器队列 -->
<!--
<bean id="productDetailDestination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg index="0" value="${product_mq_queue}" />
-->
</bean>
<!-- 消息监听容器(Queue),配置连接工厂,监听的队列,监听器是:mq的产品消息监听器 -->
<!--
<bean id="jmsContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="amqConnectionFactory" />
<property name="destination" ref="productDetailDestination" />
<property name="messageListener" ref="productDetailListener" />
</bean>
-->
<!--方式二:监听多个队列 -->
<jms:listener-container destination-type="queue" container-type="default" connection-factory="amqConnectionFactory" acknowledge="auto">
<jms:listener destination="${product_mq_queue}" ref="productDetailListener"/>
</jms:listener-container>
<!-- Spring JmsTemplate 的消息生产者 start -->
<!-- 定义JmsTemplate的Queue类型 -->
<bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate">
<!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
<constructor-arg ref="amqConnectionFactory" />
<!-- 非pub/sub模型(发布/订阅),即队列模式 -->
<property name="pubSubDomain" value="false" />
</bean>
<!-- 定义JmsTemplate的Topic类型 -->
<bean id="jmsTopicTemplate" class="org.springframework.jms.core.JmsTemplate">
<!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
<constructor-arg ref="amqConnectionFactory" />
<!-- pub/sub模型(发布/订阅) -->
<property name="pubSubDomain" value="true" />
</bean>
<!--Spring JmsTemplate 的消息生产者 end -->
</beans>
25.JSP中无法解析后端传递的数据(jstl,el表达式不生效)?
1.web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
</web-app>
2.jsp页面
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page isELIgnored="false" %>
26.关于LinkedBlockQueue
阻塞的线程安全队列,底层采用链表实现,LinkedBlockingQueue不接受null
添加元素: 都是向队尾添加元素
put 向队尾添加元素,如果队列满了会发生阻塞,一直等待空间,以加入元素
add 添加元素时,超出队列长度会直接抛异常
offer 添加元素时,如果队列已满,直接返回false
移除元素: 都是从队头移除元素
poll 队列为空,返回null
remove 队列为空,抛出NoSuchElementException异常
take 队列为空,发送阻塞,等到有元素
BlockingQueue阻塞队列的4个实现类:
ArrayBlockingQueue:规定大小的BlockingQueue,其构造函数必须带一个int参数来指明其大小.其所含的对象是以FIFO(先入先出)顺序排序的
LinkedBlockingQueue:大小不定的BlockingQueue,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制,若不带大小参数,所生成的BlockingQueue的大小由Integer.MAX_VALUE来决定.其所含的对象是以FIFO(先入先出)顺序排序的 ,不允许放null
PriotityBlockingQueue:类似于LinkedBlockQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数的Comparator决定的顺序
SynchronousQueue:对其的操作必须是放和取交替完成的
LinkedBlockingQueue的数据吞吐量要大于ArrayBlockingQueue,但在线程数量很大时其性能的可预见性低于ArrayBlockingQueue
27.MyBatis批量更新参考:
http://my.oschina.net/zouqun/blog/405424
http://blog.csdn.net/tolcf/article/details/39213217
28.Spring 中配置的@Aspect 不起作用:
1.添加注解:@Component
2.在Spring MVC的配置文件中添加 <aop:aspectj-autoproxy proxy-target-class="true"/>
29.Spring Boot 遇到的问题?
Spring Boot Mapper无法注入:启动类上添加注解 @MapperScan("com.jay.spring.boot.demo10.multidb.dao")
30.Maven指定打包环境:http://haohaoxuexi.iteye.com/blog/1900568
3个地方可以指定profile环境:
web.xml
maven的setting.xml --- 默认是:dev
项目的pom.xml
eg:pom.xml
<profiles>
<profile>
<id>development</id>
<properties>
<profile.path>config/dev</profile.path>
</properties>
</profile>
<profile>
<id>sit</id>
<properties>
<profile.path>config/sit</profile.path>
</properties>
</profile>
<profile>
<id>product</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<profile.path>config/prd</profile.path>
</properties>
</profile>
</profiles>
1.通过下面配置指定默认环境:
<activation>
<activeByDefault>true</activeByDefault>
</activation>
或
2.通过命令指定环境:(说明:-P profile_id)
mvn package –P product
31.Spring中的几个Listener监听器和类 http://www.cnblogs.com/damowang/p/4305153.html
1.ServletContextListener接口 --- Web容器启动时执行,此时Bean还未初始化,不能在里面获取依赖的bean
--- 适合做一些容器初始化工作
Why ServletContextListener接口无法获取Spring中定义的Bean?
eg:
public class ConfigListener implements ServletContextListener {
@Autowired
private ConfigService configService;
@Override
public void contextInitialized(ServletContextEvent sce) {
configService.initConfig(); //这里会报空指针异常,无法获取注入的configService
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
}
}
要理解这个问题,首先要区分Listener的生命周期和spring管理的bean的生命周期
(1)Listener的生命周期是由servlet容器(例如tomcat)管理的,项目启动时上例中的ConfigListener是由servlet容器实例化并调用其contextInitialized方法,而servlet容器并不认得@Autowired注解,因此导致ConfigService实例注入失败。
(2)而spring容器中的bean的生命周期是由spring容器管理的。
(3)即:此时Spring管理的Bean还未初始化完成
修改:
@Override
public void contextInitialized(ServletContextEvent sce) {
ConfigService configService = WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext()).getBean(ConfigService.class);
configService.initConfig();
}
特别注意:
以上代码有一个前提,那就是servlet容器在实例化ConfigListener并调用其方法之前,要确保spring容器已经初始化完毕!而spring容器的初始化也是由Listener(ContextLoaderListener)完成,因此只需在web.xml中先配置初始化spring容器的Listener,然后在配置自己的Listener,配置如下
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
http://www.importnew.com/22056.html
http://marlonyao.iteye.com/blog/344876
http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763104687270e54f72864879b5468d4e419ce3b46454762e0b82c3510738983233915ea141cbcff2102471453b08cb98b5daec885295f9f564267688c5613a30edfbd5151c337e150fed96af0bb806ac0ea81c4de2444bb52120d84e7fa291762cc78f1642692d78e3f15&p=9a769a4786cc41af59a6e6285c07cf&newp=8067c64ad4934eaf58eccb3861648b231610db2151d6d0106b82c825d7331b001c3bbfb423241200d7c07a6c00ac4e56ecf73d78350025a3dda5c91d9fb4c57479&user=baidu&fm=sc&query=%BB%A5%C1%AA%CD%F8%BD%F0%C8%DAjava%C3%E6%CA%D4%CC%E2&qid=d6cd91620001a7e2&p1=1
http://blog.csdn.net/luanlouis/article/details/40422941
http://ms.csdn.net/geek/79519
http://blog.csdn.net/u010154380/article/details/53557507
http://blog.csdn.net/qq_35124535/article/details/64129964
http://blog.csdn.net/pistolove/article/details/46753275
Redis并发注意点:http://qsalg.com/?p=423
RPC原理:http://www.cnblogs.com/LBSer/p/4853234.html
Java相关原理和深入学习:http://wiki.jikexueyuan.com/list/java/
微服务的一种开源实现方式——dubbo+zookeeper http://blog.csdn.net/zhdd99/article/details/52263609
RPC框架:
http://www.cnblogs.com/luxiaoxun/p/5272384.html
https://my.oschina.net/huangyong/blog/361751
JDK集合框架原理:http://yikun.github.io/tags/Java/
牛逼的博客:http://www.cnblogs.com/LBSer/p/4753112.html
编程狂人周刊:http://www.tuicool.com/mags
码农周刊:http://weekly.manong.io/issues/
http://blog.csdn.net/zhangliangzi/article/details/52526125
成为一个Java的架构师要学习哪些知识? 搜索知乎
soa和微服务架构的区别?搜索知乎
美团点评技术: http://tech.meituan.com/
http://blog.csdn.net/zhangliangzi/article/details/50995326
Java精华:
http://blog.csdn.net/kobejayandy/article/category/1216487
Java并发集合的实现原理:http://www.cnblogs.com/luxiaoxun/p/4638748.html
Java并发原理:http://blog.csdn.net/column/details/14531.html
数据库索引原理和B+树算法分析!!!数据库索引的实现(B+树介绍、和B树、R树区别)
分布式的幂等性和分布式CAP原理!!!
多读书:
JVM公众号推荐:你假笨
《core Java》多线程部分 《effective java》《深入理解Java虚拟机》《Java并发编程实战》
《Java多线程编程核心技术》《实战java高并发程序设计》《Java并发编程实战》《jcip》《深入理解Java虚拟机:JVM高级特性与最佳实践》《深入分析Java Web技术内幕》《Spring源码深度解析》
《大型网站技术架构 核心原理与案例分析》《大型网站系统与Java中间件实践》《高性能MySQL》
《重构 改善既有代码的设计》《企业应用架构模式》《从Paxos到ZooKeeper 分布式一致性原理与实践》
《分布式系统常用技术及案例分析》《精通Spring 4.x》
《高性能网站构建实战》《实用负载均衡技术:网站性能优化攻略》
书籍推荐:http://blog.jobbole.com/106093/
http://www.importnew.com/7099.html
阿里面试:http://www.importnew.com/22056.html
http://www.importnew.com/22637.html
http://yemengying.com/2016/06/05/interview/
面试必看:https://github.com/kdn251/interviews/blob/master/README-zh-cn.md
https://github.com/it-interview/easy-job
http://taoxiaoran.top/pages/tags.html#Java
https://github.com/hadyang/interview
数据结构:
动画版展示数据结构: http://zh.visualgo.net/
架构师技能:http://www.zhihu.com/question/29031276
AOP必看博客,架构分析+优化
http://blog.csdn.net/xvshu/article/details/46288953
http://blog.csdn.net/xvshu/article/category/2110821/2
http://blog.csdn.net/chenleixing/article/details/47099725
http://www.cnblogs.com/java-zhao/category/776210.html
http://www.iteye.com/topic/1122859
http://www.cnblogs.com/davidwang456/p/4213652.html
http://blog.csdn.net/z69183787/article/category/2175689/2
http://www.cnblogs.com/java-zhao/p/5106189.html
http://blog.csdn.net/xyw591238/article/category/6083265
https://github.com/jcalaz/jcalaBlog
Java并发容器源码分析:http://blog.csdn.net/Architect0719/article/category/6193805
书籍推荐:
http://blog.csdn.net/u013256816/article/details/52091850
读书:
深入理解计算机系统、Java并发编程实战、深入理解Java虚拟机第二版、tcp/ip详解 卷一、二、三,Java数据结构与算法
几个流行Java框架:
Spring MVC/Spring Boot
Spark
Dropwizard
Ninja framework
ZK
Ratpack 用于构建现代化HTTP程序的Java库
Jodd
jHipster
分布式协调框架:zookeeper etcd
Java 应用监控 https://github.com/stagemonitor/stagemonitor
http://wsmajunfeng.iteye.com/blog/1744587
7个监控项目: http://www.codeceo.com/article/7-monitor-tools.html
Swagger学习:
http://blog.csdn.net/u010827436/article/details/44417637
Java博客推荐:http://www.tuicool.com/articles/jUrQ7r6
http://www.cnblogs.com/swiftma/category/816241.html
http://www.cnblogs.com/skywang12345/category/489072.html
Java常见类底层实现分析:http://blog.csdn.net/column/details/chenssy-javaimpr.html
开发者头条、简书、码农周刊、推酷、http://www.importnew.com/ 、极客头条、stackoverflow、java world
深入Java:http://www.codeceo.com/article/tag/java 、http://hugnew.com/?cat=17 、 http://www.hollischuang.com/archives/1001 、
http://www.ibm.com/developerworks/cn/java/ 、 http://www.programcreek.com/ 、http://www.open-open.com/lib/tag/Spring 、
http://blog.csdn.net/pkueecser/article/details/50670601 、猿天地 http://cxytiandi.com/blog 、技术干货:http://www.primeton.com/pr/tech.php
国外技术趋势网站:
https://www.infoq.com
https://seroter.wordpress.com/category/aws/
http://www.theserverside.com/
https://dzone.com
https://www.javacodegeeks.com/2015/12/profile-successful-java-developer-2016.html?spm=5176.100239.blogcont54071.5.YXZzqC
http://ifeve.com/tech-related-sites/
Chrome插件:
掘金:http://gold.xitu.io/extension/
Postman:
需要熟练使用版本控制工具 Git(阅读:《Git 权威指南》),以及项目构建工具 Maven(阅读:《Maven实战》)。另外,在这个阶段可以尝试 TDD 开发。
进阶(2-6 个月)
目标:独立负责某个服务端项目。
技能:
掌握 web 开发最佳实践,掌握 Restful API 设计,理解 Spring 原理。推荐阅读《Spring 揭秘》。掌握项目分层、子模块划分。推荐阅读:《J2EE 核心模式》。
掌握 web 架构设计。包括 Http 反向代理,数据缓存,负载均衡,水平扩展和垂直扩展。推荐阅读:《分布式Java应用:基础与实践》。
掌握关系型数据库。包括设计 MySQL 表结构,根据业务特点分表分库,基于执行计划的 SQL 分析优化,以及数据库容量规划。推荐阅读:《MySQL 必知必会》、《高性能 MySQL》。
了解 NoSQL。我们大规模使用 Hadoop、HBase、Hive,同时部分项目使用 Redis、Storm。你需要学会这些工具最基本的使用。
学习 web 安全知识。了解 web 前端安全问题。设计安全 web 服务,包括加解密、防伪造、防重放攻击等。
掌握 Http(推荐阅读:《图解 Http》、《Http 权威指南》)、Thrift 等协议。
掌握服务容量规划,性能调优,可靠性保证,以及故障处理。学习容量规划和性能调优知识,梳理业务监控点,熟练使用我们的监控报警系统。推荐阅读:《深入理解 Java 虚拟机》。
其他。设计模式:从项目中学习,有时间可以看看《深入浅出设计模式》、《JDK 里的设计模式》。学习Java Socket 编程与多线程知识,可以看看《Java 并发编程实战》,并翻翻并发编程网的文章。
深入(6 个月-)
目标:分布式系统和中间件开发。
构建知识体系:《大型网站系统与 Java 中间件实践》、《大型网站技术架构:核心原理与案例分析》。
原理与设计:《大规模存储式系统》、《UNIX 网络编程 卷1:套接字联网 API》、《How Tomcat Works》。
学习开源项目:Apache Thrift、Zipkin、Netty、Rose、Jade、淘宝 RPC 系统 Dubbo 等。分析项目中的设计思路。比如,同样是RPC框架,Finagle 和 Dubbo 有什么异同。
其他。根据参与的项目加深学习吧。比如,如果需要写 DSL,可以读一下《领域特定语言》,对 Redis 感兴趣推荐读一下:《Redis 设计与实现》。有两本书,无论做什么项目,都推荐读:《Unix 编程艺术》、《UNIX 环境高级编程(第3版)》。
HashMap、TreeMap、数据库索引 原理,及常见的平衡二叉树,红黑树原理和实现,redis的几种数据结构原理和优缺点(Hash结构的ziplist和quicklist原理),Hash算法原理和实现
https://github.com/spotify/apollo
http://blog.csdn.net/column/details/java-vitual-machine.html
http://blog.csdn.net/column/details/yrp-java-algorithm.html?&page=2
http://blog.csdn.net/column/details/datastructureinjava.html
http://blog.csdn.net/yannanying/article/details/46956355
http://blog.csdn.net/column/details/datastructure-phn.html
http://blog.csdn.net/column/details/zhonghua.html
http://blog.csdn.net/column/details/datastructure.html
https://github.com/shekhargulati/52-technologies-in-2016
十二个程序员必备的优质资源推荐: http://blog.csdn.net/proginn/article/details/51614131
美团点评技术团队:http://tech.meituan.com/
阿里中间件团队:http://jm.taobao.org/
BAT 技术团队博客:http://blog.csdn.net/tengdazhang770960436/article/details/49963983
技术博客推荐:http://www.cnblogs.com/newpanderking/p/4366174.html
NB的技术社区:https://yq.aliyun.com/tags/type_blog-tagid_41/?spm=5176.100239.rightarea.8.4qenGu
Spring-session源码解析:https://yq.aliyun.com/articles/57425?spm=5176.100239.blogrightarea58510.22.DTpSqZ
Java上线用到的项目:
JMeter 测试
FindBugs SparkJava
JProfiler 约束内存泄漏和修复线程的问题。
Takipi
消息中间件:
Nats --- 速度超快 每秒能处理千万级别消息,占用CPU少,但不支持离线
Kafka --- 速度快,每秒处理百万级消息,能存储,适合大数据
推荐需要看的几本书:
《轻量级微服务架构(上册)》
<<Web Scalability for Startup Engineers--互联网创业核心技术:构建可伸缩的web应用>>
《Spring源码深度解析》《大型网站技术架构 核心原理与案例分析》《大型网站系统与Java中间件实践》《Effective Java中文版》《HotSpot实战》
《从Paxos到ZooKeeper 分布式一致性原理与实践》《深入分析Java Web技术内幕》《java多线程编程核心技术》《实战Java高并发程序设计》
《深入Java虚拟机第2版》《重构 改善既有代码的设计》 《高性能MySQL第3版》 《Java编程思想第4版》 《HTTP权威指南》 《精通正则表达式必知必会》
《Java解惑》 《Java并发编程实践》 《鸟哥的Linux私房菜》《How Tomcat Works(中英文版)》 《Maven权威指南》
《Java并发编程实战》
要求:
其次掌握的技能树主要有三个方面:
第一个是基础,比如对集合类,并发包,IO/NIO,JVM,内存模型,泛型,异常,反射,等有深入了解,最好是看过源码了解底层的设计。比如一般面试都会问ConcurrentHashMap,CopyOnWrite,线程池,CAS,AQS,虚拟机优化等知识点,因为这些对互联网的企业是绝对重要的。而且一般人这关都过不了,还发闹骚说这些没什么用,为什么要面试。举一例子,在使用线程池时,因为使用了无界队列,在远程服务异常情况下导致内层飙升,怎么去解决?你要是连线程池都不清楚,你怎么去玩?再举一例,由于对ThreadLocal理解出错,使用它做线程安全的控制,导致没能实现真的线程安全,你怪我哦?所以作为一个拿两万的JAVA程序员这点基础是必须的。
第二你需要有全面的互联网技术相关知识。从底层说起,你起码得深入了解mysql,redis,mongodb,nginx,tomcat,rpc,jms等方面的知识。你要问需要了解到什么程度,我可以给你说个大慨。首先对于MySQL,你要知道常见的参数设置,存储引擎怎么去选择,还需要了解常见的索引引擎,知道怎么去选择。知道怎么去设计表,怎么优化sql,怎么根据执行计划去调优。高级的你需要去做分库分表的设计和优化,一般互联网企业的数据库都是读写分离,还会垂直与水平拆分,所以这个也有经验的成分在里面。然后redis,mongodb都是需要了解原理,需要会调整参数的,而nginx和tomcat几乎都是JAVA互联网方面必配,其实很阿里的技术栈选择有点关系。至于rpc相关的就多的去,必须各种网络协议,序列化技术,SOA等等,你要有一个深入的理解。现在应用比较广的rpc框架,在国内就是dubbo了,可以自行搜索。至于jms相关的起码得了解原理吧,一般情况下不是专门开发中间件系统和支撑系统的不需要了解太多细节,国内企业常用的主要是activeMQ和kafka。你能对我说的都研究的比较深入,阿里p6我觉得是没问题的,当然这个还需要看你的架构能力方面的面试表现了。
第三就是编程能力,编程思想,算法能力,架构能力的考量。首先2W程序员对算法的要求我觉得还是比较低,再高级也最多红黑树吧,但是排序和查询的基本算法得会。编程思想是必须的,问你个AOP和IOC你起码的清清楚楚,设计模式不说每种都用过,但是也能深入理解个十四五种。编程能力这个我觉得不好去评价,但是拿一个2000W用户根据姓名年龄排序这种题目也能信手拈来。最后就是架构能力,这种不是说要你设计个多牛逼多高并发的系统,起码让你做一个秒杀系统,防重请求的设计能快速搞定而没有坑吧。
#深入理解Java虚拟机第2版
#Java并发编程实战
#MongoDB权威指南
#Netty权威指南
Netty Mina框架源码
2016新兴互联网公司前300:http://www.askci.com/news/hlw/20160425/941447185.shtml
面试:
1.数据传入的安全性解决方案?认证 SSL HTTPS 原理(eg:游戏中数据传输给服务器,如何保证数据安全和完整,防止外挂?)
2.如何使用多线程处理同一个大的任务?
3.蹲坑算法(数据量大的时候,根据内存空间的有序性,为每个数找各自对应的内存空间地址)
4.如何防止内存被击穿,最大并发限制,降级策略?(eg:游戏服务器,并发最多5000,超过就回击穿服务器内存,如果玩家>5000,如何处理?)
百万级访问量网站架构:http://www.biaodianfu.com/thinking-before-building-site.html
http://www.wtoutiao.com/p/12aqbAi.html
初期架构一般比较简单,web负载均衡+数据库主从+缓存+分布式存储+队列。
大方向上也确实就这几样东西,细节上也无数文章都重复过了,按照将来会有N多WEB,N多主从关系,N多缓存,N多xxx设计就行,基本方案都是现成的,
只是您比其他人厉害之处就在于设计上考虑到缓存失效时的雪崩效应、主从同步的数据一致性和时间差、队列的稳定性和失败后的重试策略、文件存储的效率和备份方式等等意外情况。
缓存总有一天会失效,数据库复制总有一天会断掉,队列总有一天会写不进去,电源总有一天会烧坏。根据墨菲定律,如果不考虑这些,网站早晚会成为茶几
需要加强学习的东西:
网络: Netty,mina,NIO,REST,OAuth
Web:Tapestry,DWR,GWT,WebX
搜索: ElasticSearch,Solr
缓存/DB: mongoDB、HBASE,Cassandra,Redis
中间件:RPC,Dubbo,Thrift,Zookeeper,ActiveMQ, Kafka
技能: Shell编程、性能调优、MAT、救火、故障排查
跨语言: shell、Go、NodeJS
大数据: hadoop、hbase、storm、hive、pig、spark
其他框架:Spring Boot、Spring Cloud、 Disruptor(Disruptor是一个用于在线程间通信的高效低延时的消息组件,它像个增强的队列)、Guava、Trove(高性能集合框架)
多线程推荐:
http://www.cnblogs.com/dolphin0520/category/602384.html
http://blog.csdn.net/qilixiang012/article/category/2857487
http://blog.csdn.net/column/details/java-dxc.html
1.Eclipse安装Activiti插件 http://activiti.org/designer/update/
2.Spring MVC 输出页面乱码 在mvc.xml中配置 StringHttpMessageConverter 编码格式
<mvc:message-converters>
<beans:bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></beans:bean>
<beans:bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"></beans:bean>
<beans:bean class="org.springframework.http.converter.StringHttpMessageConverter">
<beans:property name="supportedMediaTypes">
<beans:list>
<beans:value>text/plain;charset=UTF-8</beans:value>
<beans:value>text/html;charset=UTF-8</beans:value>
</beans:list>
</beans:property>
</beans:bean>
<beans:bean class="org.springframework.http.converter.ResourceHttpMessageConverter"></beans:bean>
<beans:bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"></beans:bean>
<beans:bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"></beans:bean>
</mvc:message-converters>
3.Spring MVC注解式统一异常处理:
--- 可根据异常,返回数据或指定页面
BaseController中添加方法处理异常
@ExceptionHandler(RuntimeException.class)
public @ResponseBody ResponseVo runtimeExceptionHandler(RuntimeException ex) {
ResponseVo responseVo = new ResponseVo();
responseVo.setSuccess(false);
responseVo.setMsg(ex.getMessage());
responseVo.setData(ex);
return responseVo;
}
4.几个最常用的Eclipse快捷键
1. ctrl+shift+r:打开资源,在workspace中快速按文件名查找
2. ctrl+o:快速outline,查看代码结构,显示类中方法和属性,能快速定位类的方法和属性
3. ctrl+e:快速转换编辑器
4. ctrl+2,L:为本地变量赋值
5. alt+shift+r:重命名
6. Alt+左右方向键
我们经常会遇到看代码时Ctrl+左键,层层跟踪,然后迷失在代码中的情况,
这时只需要按“Alt+左方向键”就可以退回到上次阅读的位置,
同理,按“Alt+右方向键”会前进到刚才退回的阅读位置
7.ctrl+shift+x和ctrl+shift+y:英文字母大小写的转换
8.ctrl+shift+f:格式化代码
9.ctrl+m:当前编辑页面窗口最大/小化
10.ctrl+shift+o:自动引入包和删除无用包
11.Ctrl+T 快速显示当前类的继承结构
12.Ctrl+W 关闭当前窗口
13.Alt+Shift+R 重命名
14.Alt+Shift+M 抽取方法
15.【Ct rl+K】、【Ct rl++Shift +K】 快速向下和向上查找选定的内容,从此不再需要用鼠标单击查找对话框
16.Ctrl+Shift+G 查找类、方法和属性的引用
17.Alt+Shift+w 查找当前文件所在项目中的路径
18.Ctrl+Shift+w 关闭所有文件
最实用的:
【Alt + ← 】 查看代码时,返回上次查看位置 --- 后退上次代码记录
【Alt + → 】 查看代码时,跟踪,回到下次浏览位置
点中类名+F4 查看类的继承关系
5.常见的内存移除的3种情况
1.JVM Heap(堆)溢出 java.lang.OutOfMemoryError:Java heap space
JVM在启动的时候会自动设置JVM Heap的值, 可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。
Heap的大小是Young Generation 和Tenured Generaion 之和。在JVM中如果98%的时间是用于GC,且可用的Heap size 不足2%的时候将抛出此异常信息
解决方法:
设置JVM Heap(堆)大小
即:-Xmn -Xms -Xmx等选项,以及 年轻代与年老代的比例 ratio等参数
2.PermGen space溢出 java.lang.OutOfMemoryError:PermGen space
永久带溢出 --- 一般发生在程序启动阶段
永久带被JVM存放Class和Meta信息,如果载入很多Class,可能出现PermGen space溢出
解决方法:
通过-XX:PermSize和-XX:MaxPermSize设置永久代大小即可
3.栈溢出 java.lang.StackOverflowError : Thread Stack space
可能原因:递归层次太多,导致栈溢出
解决方法:
1.修改程序
2.通过 -Xss 设置每个线程的Stack大小
Server容器启动时,需要设置的几个JVM参数:
-Xms:java Heap 堆初始大小, 默认是物理内存的1/64。
-Xmx:java Heap 堆最大值,不可超过物理内存。
-Xmn:young generation的heap堆大小,一般设置为Xmx的3、4分之一 。增大年轻代后,将会减小年老代大小,可以根据监控合理设置。
-Xss:每个线程的Stack大小,而最佳值应该是128K,默认值好像是512k。
-XX:PermSize:设定内存的永久保存区初始大小,缺省值为64M。
-XX:MaxPermSize:设定内存的永久保存区最大大小,缺省值为64M。
-XX:SurvivorRatio:Eden区与Survivor区的大小比值,设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10
-XX:+UseParallelGC:F年轻代使用并发收集,而年老代仍旧使用串行收集.
-XX:+UseParNewGC:设置年轻代为并行收集,JDK5.0以上,JVM会根据系统配置自行设置,所无需再设置此值。
-XX:ParallelGCThreads:并行收集器的线程数,值最好配置与处理器数目相等 同样适用于CMS。
-XX:+UseParallelOldGC:年老代垃圾收集方式为并行收集(Parallel Compacting)。
-XX:MaxGCPauseMillis:每次年轻代垃圾回收的最长时间(最大暂停时间),如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。
-XX:+ScavengeBeforeFullGC:Full GC前调用YGC,默认是true。
实例如:JAVA_OPTS=”-Xms4g -Xmx4g -Xmn1024m -XX:PermSize=320M -XX:MaxPermSize=320m -XX:SurvivorRatio=6″
6.Service或Dao层获取request和IP方法?
1.获取IP InetAddress.getLocalHost().getHostAddress()
2.获取request对象 http://my.oschina.net/u/2007041/blog/420956
7.JDK6在Linux下的安装
第一:用linux 的命令运行它: sh jdk-6u2-linux-i586-rpm.bin
第二:按多次回车后出现
Do you agree to the above license terms? [yes or no]
输入yes
第三:编辑环境变量
$gedit ~/.bashrc
加入如下五行:
JAVA_HOME=/usr/java/jdk1.6.0_02
JAVA_BIN=/usr/java/jdk1.6.0_02/bin
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH
第四步是必须的,不然它总是调用FC6自带的jdk1.4
第四:创建链接
#cd /usr/bin
#ln -s -f /usr/local/jdk1.5.0_05/jre/bin/java
#ln -s -f /usr/local/jdk1.5.0_05/bin/javac
或 环境变量配置 vi /etc/profile
#for java
export JAVA_HOME=/home/hetiewei/software/java/jdk1.8.0_40
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
#for go
export GOROOT=/home/hetiewei/go/soft/go
export PATH=$GOROOT/bin:$PATH
export GOPATH=/home/hetiewei/go/soft/go/pkg
#for node
export NODE_HOME=/home/hetiewei/node/software/node-v6.2.0-linux-x64
export PATH=$PATH:$NODE_HOME/bin
export NODE_PATH=$NODE_HOME/lib/node_modules
PATH=/usr/local/ssl/bin:/sbin/:$PATH:/usr/sbin
export PATH
#for hadoop
export HADOOP_HOME=/home/hetiewei/software/bigdata/hadoop/hadoop-2.6.4
export PATH=.:$HADOOP_HOME/bin:$PATH
source /etc/profile
8.Tomcat启动时,在initialing Spring root context 卡死:
解决:
1.查看数据库连接
2.清除Tomcat下的work目录
9.Maven install时出现编码异常解决方法:
mvn clean install -Dmaven.javadoc.skip=true
maven 安装时跳过 测试用例:
mvn clean install -Dmaven.test.skip=true
10.Spring和Mybatis整合时无法读取properties的处理方案:
方法一:
修改<property name="sqlSessionFactory" ref="sqlSessionFactory"/>为<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
原理:使用sqlSessionFactoryBeanName注入,不会立即初始化sqlSessionFactory, 所以不会引发提前初始化问题。
方法二:
直接删掉<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
注意:在没有配置这一行时,必须配置一个以sqlSessionFactory命名的org.mybatis.spring.SqlSessionFactoryBean。
11.token,Session的区别?
服务器在生成表单的时候同时生成一个CSRF token,插入到表单的一个hidden field里面,并且把这个token记录在服务器端,通常是用户的Session数据里面。
客户端啥都不用干,照常提交表单。当表单被提交的时候,服务端检查一个表单里面的token跟自己之前记录下来的是否匹配,匹配才继续处理。
CSRF劫持的请求也会带上网站的cookie的,所以光验证session并不能避免CSRF
token的关键是在于你在发送请求的时候一定要保证你是读取了这个页面的。。 而不是凭空就发送请求
对于HTTP协议来说,就是url,header,body
对于WEB页面来说,就是url,form/post body,cookie
好了,现在有的就是这么多东西,要怎么用呢?
首先是第一个问题,HTTP请求是无状态的,我怎么知道谁是谁?
解:让用户每次访问的时候告诉你它叫什么,怎么告诉?url,form/post body,cookie
然后是第二个问题,用户访问的时候说他自己是张三,他骗你怎么办?
解:在服务器端保存张三的信息,给他一个id,让他下次用id访问。id保存在url,form/post body,cookie中。这叫做session
现在是第三个问题,用户提交了一笔订单,你怎么保证他是在你的订单页面提交的?(referer可能是一个办法)
解:在你订单页面中放入一个加密的信息,只有真正打开了订单页才能知道,提交的时候将这个信息返回回来。这个东西,可以被叫做token
Token实现防止表单重复提交?
表单重复提交的两种情形:
1.通过浏览器回退功能,回到原来页面重复提交表单,服务器端应避免用户重复注册
2.提交完成后,单击浏览器的“刷新”按钮,浏览器会弹出对话框,询问是否重新提交数据。单击“是”,浏览器会重新提交数据。
如何防止?
每次请求都生产一个token标识
1.表单提交后,先匹配(使用Aop做)token,判断当前用户会话中token令牌值与当前请求参数的token令牌值是否一致
2.每次请求都创建一个新的token令牌,将其保存在当前会话(session)范围内
3.token在服务器端匹配后,就把session中的toke令牌值删除
12.Java线程安全的本质:线程中并没有存放任何对象数据,而是在执行时,去主内存(堆)中去同步数据,所有的对象数据都存在JVM的堆中,因此需要对资源进行共享锁!!!
堆 --- JVM的核心数据存储区 --- 线程共享的主内存
堆中为JVM的所有对象分配了内存空间用以存储和维护变量值等
栈 --- 线程私有的内存区,由值栈(线程栈)组成,存放8中基本数据类型和对象引用
每个线程都会生成一个自有的线程栈,线程栈中用存储了该线程的基本数据常量,变量值,以及对象长变量的引用
每个线程执行时,根据代码顺序,压栈 值栈(栈内存)
对象变量在线程执行时的过程:!!! --- 由JVM内存模型决定
1.线程根据栈中的引用去堆上同步该对象数据下来,然后在线程自己的内存中进行操作
2.操作之后再将线程栈撒花姑娘的运算结果同步到堆(主内存)中
3.多线程时,因为每个线程都操作自己从主内存(JVM堆)中同步过来的数据,如果不加锁,会导致线程安全问题(数据提交到主内存时不一致)
13.堆 --- JVM中所有对象的内存空间 分为: Young Gen, Old Gen
Young Gen 又分为:Eden区和两个大小相同的Survivor区(from 和 to)
Eden和Survivor默认比例 8:1 由 -XX:SurvivorRation设置
堆大小 -Xmx -Xms 设置
Young Gen -Xmn 设置
-XX:NewSize和-XX:MaxNewSize
用于设置年轻代的大小,建议设为整个堆大小的1/3或者1/4,两个值设为一样大。
Minor GC --- 发生在新生代的垃圾回收,Java 对象大多都具备朝生夕灭的特性,所以 Minor GC 非常频繁,一般回收速度也比较快,
年轻代的GC使用复制算法(将内存分为两块,每次只用其中一块,当这块内存用完,就将还活着的对象复制到另外一块上面,复制算法不会产生内存碎片)
Full GC --- 发生在年老代的GC, Full GC比较慢,尽量避免
新创建对象都会被分配到Eden区(一些大对象特殊处理),当Eden区满则进行Minor GC,
这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区, 对象在Survivor区中每熬过一次Minor GC,年龄增加1岁,
当年龄增加到一定程度后(默认15岁),会被移动到年老代中,
当年老代满时,经常Full GC
线程Stack 每个线程独有的操作数栈局部变量表方法入口 -Xss 设置
方法区 -XX:PermSize和-XX:MaxPermSize设置
JVM中的类加载机制: http://www.cnblogs.com/ITtangtang/p/3978102.html
14.Go,MongoDB,redis,node.js在Linux下的安全和配置
1.go
下载tar.gz后,
解压:tar -zxvf go1.6.2.linux-amd64.tar.gz
环境变量:
vi /etc/profile
在profile中添加一下内容:
GOPATH和GOROOT修改为你的路径即可!!!
export GOROOT=/home/forward/tools/go
export PATH=$GOROOT/bin:$PATH
export GOPATH=/home/forward/tools/gopkg
刷新环境变量:
source /etc/profile
验证:
go version
编译Go程序:
go build xx.go
直接运行Go程序:
go run xx.go
2.mongodb
解压:
tar -zxvf mongodb-linux-i686-3.2.6.tgz
环境变量:
--- (只当前用户有效)
export PATH=<mongodb-install-directory>/bin:$PATH
或
--- (全局有效)
vi /etc/profile
在profile中添加一下内容:
export PATH=<mongodb-install-directory>/bin:$PATH
刷新环境变量:
source /etc/profile
3.node.js
下载解压:
wget --no-check-certificate https://nodejs.org/dist/v6.2.0/node-v6.2.0-linux-x64.tar.gz
环境变量:
NODE_HOME 是node.js安全目录
export NODE_HOME=/home/hetiewei/node/software/node-v6.2.0-linux-x64
export PATH=$PATH:$NODE_HOME/bin
export NODE_PATH=$NODE_HOME/lib/node_modules
刷新环境变量: 让环境变量生效
source /etc/profile
验证:
命令行输入:node -v,查看node.js的版本
4.redis
参考官方源码安装说明
Redis Cluster集群的搭建与实践 http://lib.csdn.net/article/redis/60796
15.通过Spring在工具类中获取HttpServletRequest对象:
/**
* 获取当前Request
* @return
*/
private HttpServletRequest getRequest() {
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
return requestAttributes.getRequest();
}
16.Spring mvc在redirect请求中传递数据 http://shmilyaw-hotmail-com.iteye.com/blog/2246344
3种方式:1.Session 2.url template 3. flash attribute
17.logback与ActiveMQ的slf4j jar包冲突解决??? --- MQ使用指定版本, 不使用用activemq-all
<!-- Spring 整合ActiveMQ -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<!-- activeMQ begin -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.7.0</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
<version>5.7.0</version>
</dependency>
18.logback配置打印MyBatis执行的sql?
在logback.xml中配置 : dao所在的包名
<logger name="com.tuniu.plat.config.dao" level="DEBUG"/>
19.Spring MVC接收不到前端的参数???
试试: data:JSON.stringify(formData)
20.File文件目录中文无法解析的问题:
String path = Config.class.getClassLoader().getResource("").toURI().getPath();
21.Spring MVC 转发和重定向的传参问题?
1.转发 forward
1. this.getServletContext().getRequestDispatcher("/rentHouse.htm?method=display").forward(request,response);
return null;
2. return new ModelAndView("forward:/xxx.htm", map);
或
ModelAndView mv = new ModelAndView("forward:/xxx.htm");
mv.addAtrribute("param", value)
return mv;
2.重定向 redirect
1.无参数
return new ModelAndView("redirect:/toList");
return "redirect:/ toList ";
2.有参数
1.手动拼url
new ModelAndView("redirect:/toList?param1="+value1+"¶m2="+value2);
这样有个弊端,就是传中文可能会有乱码问题。
2.用RedirectAttributes
redirectAttributes.addFlashAttribute("message", "保存用户成功!");//使用addFlashAttribute,参数不会出现在url地址栏中
public String save(@ModelAttribute("form") Bean form,RedirectAttributes attr)
throws Exception {
String code = service.save(form);
if(code.equals("000")){
attr.addFlashAttribute("name", form.getName());
attr.addFlashAttribute("success", "添加成功!");
return "redirect:/index";
}else{
attr.addAttribute("projectName", form.getProjectName());
attr.addAttribute("enviroment", form.getEnviroment());
attr.addFlashAttribute("msg", "添加出错!错误码为:"+rsp.getCode().getCode()+",错误为:"+rsp.getCode().getName());
return "redirect:/maintenance/toAddConfigCenter";
}
}
注意:
1.使用RedirectAttributes的addAttribute方法传递参数会跟随在URL后面,如上代码即为http:/index.action?a=a
2.使用addFlashAttribute不会跟随在URL后面,会把该参数值暂时保存于session,待重定向url获取该参数后从session中移除,
这里的redirect必须是方法映射路径,jsp无效。你会发现redirect后的jsp页面中b只会出现一次,刷新后b再也不会出现了,
这验证了上面说的,b被访问后就会从session中移除。对于重复提交可以使用此来完成.
22.QQ 网页上的登陆模块(全程HTTP/GET请求) --- 前端数据的安全
QQ 在登陆时,对用户输入的密码加密的JS代码为:
function getEncryption(password, uin, vcode, isMd5) {
var str1 = hexchar2bin(isMd5 ? password : md5(password));
var str2 = md5(str1 + uin);
var str3 = md5(str2 + vcode.toUpperCase());
return str3
}
白话就是: md5(md5(md5(密码) + 用户的QQ号) + 验证码)
验证码是一次性的, 所以,在你在网络层拿到本次的请求之后,无法做 重放攻击, 因为验证码是不正确的.
23.git常用命令:
git init 将当前目录初始化为git仓库
git status 查看仓库状态
git add xx 添加文件,该文件等待提交
git add -A 或 git add . 添加当前目录下所有文件
git commit -m "备注" 提价到本地git仓库
git remote add origin https://github.com/jayfeihe/xx.git 为本地仓库指定远程仓库
git remote rm origin 断开远程仓库
git remote -v 查看远程仓库
git pull origin master 从远程仓库拉取文件
git push origin master 向远程仓库推送已提交内容
1,如何在提交代码前看看我的代码中不同文件的状态?
git status
2,如何把别人的代码拉取下来?
git clone url
url:一般都是在github上的仓库地址
执行这个命令后,仓库就会被下载到你指定的目录
3,如何把新的文件加入到git的索引中?
git add file1 file2 file3
这么增加很多文件的话一定很烦,那么请使用git add . 把所有文件加入到git索引中
git索引:代表了你的文件已经被git管理
4,如何看我将要提交到远程仓库的文件?
git diff --cached
5,如何给我的提交增加备注说明?
git commit -m “xxxx说明”这个命令是提交代码必须的
6,如何通过图形化的界面查看该项目的所有历史提交记录?
gitk
7,如何查看项目的日志?也就是你的提交记录
git log
8,如何合并git add 和git commit 命令的效果?
git commit -a -m“xxx说明”
注意,这会把所有文件add到git索引中,可能你会有不想被git管理的文件,所以你需要事先通过忽略文件来控制。
9,如何创建一个分支?
git branch a
a就是新分支,然后使用git checkout a来切换到a分支,创建分支的意义是,你可以在自己的分支下开发,在开发完成后和主版本master合并,尤其在团队中尤为重要
10,如何合并分支到主分支?
git merge a master
11,如何删除已经合并的分支?
git branch -D a
12,如何暂时保存我们的工作记录,去看一个例如修复版本bug的事情?
git stash “xxxxx” 暂时记录你的工作状态
进行你的修复工作
git commit -a -m “xxx提交你的修复”
git stash apply 回到你的工作
13,如何搞定远程分支和本地主版本的合并?
git branch --track [远程分支的名称] origin/[远程分支的名称]
例如:git branch --track a origin/a
git pull a
pull:这个命令同时做了下载远程a分支,并合并到本地master的动作。如果有冲突是会合并失败的,但是不会造成下载a分支失败。
14,如何根据关键字搜索其在代码中出现的位置?
git grep -n [key]
15,如果我想重置我的版本如何做?
git reset --hard HEAD
这个命令会把你做过的所有未提交(git commit -m)的内容清空
16,如果我只想重置一个文件怎么做?
git checkout --file
这时只会check出一个未修改过的文件
17,如何修复一个已经提交文件中的错误?
虽然有2种做法,创建一个新提交和checkout出老提交并修复,但是建议通过创建新提交去做。因为git对于历史内容被改动会出现不能合并的情况
24.ActiveMQ整合Spring,监听队列
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:jms="http://www.springframework.org/schema/jms"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd ">
<!-- ActiveMQ连接工厂 -->
<bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL"
value="failover:(tcp://mq.master.jd.tuniu-cie.org:61616)" />
</bean>
<!-- <bean id="productDetailListener" class="com.tuniu.plat.service.mq.ProductDetailListener"/> -->
<!--方式一:只监听一个队列 -->
<!-- 监听器队列 -->
<!--
<bean id="productDetailDestination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg index="0" value="${product_mq_queue}" />
-->
</bean>
<!-- 消息监听容器(Queue),配置连接工厂,监听的队列,监听器是:mq的产品消息监听器 -->
<!--
<bean id="jmsContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="amqConnectionFactory" />
<property name="destination" ref="productDetailDestination" />
<property name="messageListener" ref="productDetailListener" />
</bean>
-->
<!--方式二:监听多个队列 -->
<jms:listener-container destination-type="queue" container-type="default" connection-factory="amqConnectionFactory" acknowledge="auto">
<jms:listener destination="${product_mq_queue}" ref="productDetailListener"/>
</jms:listener-container>
<!-- Spring JmsTemplate 的消息生产者 start -->
<!-- 定义JmsTemplate的Queue类型 -->
<bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate">
<!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
<constructor-arg ref="amqConnectionFactory" />
<!-- 非pub/sub模型(发布/订阅),即队列模式 -->
<property name="pubSubDomain" value="false" />
</bean>
<!-- 定义JmsTemplate的Topic类型 -->
<bean id="jmsTopicTemplate" class="org.springframework.jms.core.JmsTemplate">
<!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
<constructor-arg ref="amqConnectionFactory" />
<!-- pub/sub模型(发布/订阅) -->
<property name="pubSubDomain" value="true" />
</bean>
<!--Spring JmsTemplate 的消息生产者 end -->
</beans>
25.JSP中无法解析后端传递的数据(jstl,el表达式不生效)?
1.web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
</web-app>
2.jsp页面
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page isELIgnored="false" %>
26.关于LinkedBlockQueue
阻塞的线程安全队列,底层采用链表实现,LinkedBlockingQueue不接受null
添加元素: 都是向队尾添加元素
put 向队尾添加元素,如果队列满了会发生阻塞,一直等待空间,以加入元素
add 添加元素时,超出队列长度会直接抛异常
offer 添加元素时,如果队列已满,直接返回false
移除元素: 都是从队头移除元素
poll 队列为空,返回null
remove 队列为空,抛出NoSuchElementException异常
take 队列为空,发送阻塞,等到有元素
BlockingQueue阻塞队列的4个实现类:
ArrayBlockingQueue:规定大小的BlockingQueue,其构造函数必须带一个int参数来指明其大小.其所含的对象是以FIFO(先入先出)顺序排序的
LinkedBlockingQueue:大小不定的BlockingQueue,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制,若不带大小参数,所生成的BlockingQueue的大小由Integer.MAX_VALUE来决定.其所含的对象是以FIFO(先入先出)顺序排序的 ,不允许放null
PriotityBlockingQueue:类似于LinkedBlockQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数的Comparator决定的顺序
SynchronousQueue:对其的操作必须是放和取交替完成的
LinkedBlockingQueue的数据吞吐量要大于ArrayBlockingQueue,但在线程数量很大时其性能的可预见性低于ArrayBlockingQueue
27.MyBatis批量更新参考:
http://my.oschina.net/zouqun/blog/405424
http://blog.csdn.net/tolcf/article/details/39213217
28.Spring 中配置的@Aspect 不起作用:
1.添加注解:@Component
2.在Spring MVC的配置文件中添加 <aop:aspectj-autoproxy proxy-target-class="true"/>
29.Spring Boot 遇到的问题?
Spring Boot Mapper无法注入:启动类上添加注解 @MapperScan("com.jay.spring.boot.demo10.multidb.dao")
30.Maven指定打包环境:http://haohaoxuexi.iteye.com/blog/1900568
3个地方可以指定profile环境:
web.xml
maven的setting.xml --- 默认是:dev
项目的pom.xml
eg:pom.xml
<profiles>
<profile>
<id>development</id>
<properties>
<profile.path>config/dev</profile.path>
</properties>
</profile>
<profile>
<id>sit</id>
<properties>
<profile.path>config/sit</profile.path>
</properties>
</profile>
<profile>
<id>product</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<profile.path>config/prd</profile.path>
</properties>
</profile>
</profiles>
1.通过下面配置指定默认环境:
<activation>
<activeByDefault>true</activeByDefault>
</activation>
或
2.通过命令指定环境:(说明:-P profile_id)
mvn package –P product
31.Spring中的几个Listener监听器和类 http://www.cnblogs.com/damowang/p/4305153.html
1.ServletContextListener接口 --- Web容器启动时执行,此时Bean还未初始化,不能在里面获取依赖的bean
--- 适合做一些容器初始化工作
Why ServletContextListener接口无法获取Spring中定义的Bean?
eg:
public class ConfigListener implements ServletContextListener {
@Autowired
private ConfigService configService;
@Override
public void contextInitialized(ServletContextEvent sce) {
configService.initConfig(); //这里会报空指针异常,无法获取注入的configService
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
}
}
要理解这个问题,首先要区分Listener的生命周期和spring管理的bean的生命周期
(1)Listener的生命周期是由servlet容器(例如tomcat)管理的,项目启动时上例中的ConfigListener是由servlet容器实例化并调用其contextInitialized方法,而servlet容器并不认得@Autowired注解,因此导致ConfigService实例注入失败。
(2)而spring容器中的bean的生命周期是由spring容器管理的。
(3)即:此时Spring管理的Bean还未初始化完成
修改:
@Override
public void contextInitialized(ServletContextEvent sce) {
ConfigService configService = WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext()).getBean(ConfigService.class);
configService.initConfig();
}
特别注意:
以上代码有一个前提,那就是servlet容器在实例化ConfigListener并调用其方法之前,要确保spring容器已经初始化完毕!而spring容器的初始化也是由Listener(ContextLoaderListener)完成,因此只需在web.xml中先配置初始化spring容器的Listener,然后在配置自己的Listener,配置如下
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>