cookie是否是必须客户端跳转完成以后才会被设置进去?若是我用response.setCookie后有服务器跳转,在服务器跳转后我去取这个cookie是否是就取不到啊?在显示页显示不了,可是我刷新一下就能找到cookie了。前端
对于Cookie的设置,有两种模式:java
WEB服务器自动设置:指的是你第一次访问里面的任何一个页面;jquery
手工的方式来设置Cookie;nginx
大部分开发者都会忽略一个关键性的问题,那么就是Cookie的路径问题。在默认状况下假设说你如今在“pages/back/msg”目录下,你在这个目录下执行了response.addCookie(c),那么这个时候的cookie是会存在此目录下。那么这个时候即便设置了Cookie,若是你更改了目录,例如:“/pages/back”下,那么也没法取到Cookie,由于路径不一样,因此就须要在设置Cookie的时候,若是肯定要保存,除了设置时间以外,也须要设置路径,路径就设置为根目录“request.getContextPath().”。web
能够取到,关键看cookie设置的路径。跳转也有两种形式,服务器端跳转和客户端跳转,若是用服务器端跳转,第一次确定取不到,必须在客户端刷新一下再次请求,才能够把cookie刷过来。面试
mvc模式中,各个层级的职能划分,哪些功能写在那块?算法
所谓的mvc设计模式其实是一种思想,虽然从总体上来讲是划分为了三层,可是实际上里面会划分许多的层。spring
好比有一个业务的完成,要分不少步,咱们是把这些步骤放在服务层仍是Servlet中?数据库
服务层是能够单独抽取的,也就是说若是你的一个项目要充分的考虑到可扩展性,那么绝对须要将业务层单独抽取出来实现RPC调用(WebService)。apache
必定要清楚的是控制层不负责任何与数据库的操做,是任何的操做都不负责,因此控制层只会存在有一个功能:调用业务层,业务的方法只有一个,若是业务操做要返回多个内容,那么就使用Map集合返回。
若是放在Servlet中会准确的把各个步骤的错进行捕获并处理,但这样会显得控制层很重,若是放在服务层的话Servlet又不能明确的对各个步骤失败进行处理了。
控制层必定要处理全部的错误操做,若是不处理,你能够直接选择一个抛出,然后在整个的web.xml文件里面配置一个错误页,这个错误页只要是产生了xxx异常,那么就自动跳转到一个错误页上显示。
可是我我的的习惯是本身手工来进行处理,由于以上的跳转属于全局模式,也就是说无论出现什么样的错误,都跳转到一个页面上进行显示,这样的作法会形成错误的信息不明确的问题。
各个层使用的技术
只有把单机的MVC完全弄清楚以后才可能牵扯到更多的实际的开发问题,而集群的开发也只是一种扩展而已。
MyEclipse如今比较悲催的一点就是它只能开发一些低版本程序了。
从MyEclipse2015开始,必须现有WEB项目,然后才能够创建WEB Server。
使用MyEclipse运行项目的时候必定要在网址后面加上项目名称。
所谓的单点登陆用在什么场景上?
CAS有一个本身的流程。
就是CAS服务器的配置,由于版本的区别很大,因此强烈建议你们使用稳定版本开发。同时这里面还须要针对源代码
进行大量的修改与配置才能够得来。
数据库的读、写分离。此种考虑须要根据你的实际业务要求,不能凭空设计。
在讲解Oracle的时候说过这样一个简单的架构:
信息的汇总表,同时为了保证查询的性能,须要增长索引,可是这张表平均每1秒要更新1000次,可是这样就和索引产生了冲突,因此定义两张表,一张表做为更新使用,另一张表在系统安静下来的时候进行差别的备份,然后进行数据的保存。
以上是在WEB2.0之前的概念,从WEB2.0开始(AJAX开始)数据量开始暴增,因而你的老板可能就要求你须要对系统进行大规模升级:要求保证更新速度,要求保证明时性,要求保证数据的有效性。
若是这个时候全部的设计仍是围绕着传统的关系型数据库展开,你的设计必定是失败的。
所谓的分布式锁指的是在高并发访问的状况下使用的一种技术,所谓的高并发访问指的就是多个线程对象(每个操做用户)为了保证资源的操做完整性而实现的一种技术,这样的技术能够简单的理解为锁。
若是如今多个线程在同一个虚拟机之中,正常编写一个程序。然后这个程序里面产生了若干个线程,而且这些线程要操做统一资源。那么在这样的状况下,为了保证资源操做的同步最简单的处理模式就是采用synchronized关键字来完成。
可是这样的作法只适合于单JVM运行状况下,而若是说如今划分到网络上。
可是若是是多虚拟机的状态下,这样的设计就必须作出更改了。
对于项目的开发须要考虑几个核心问题:高可用(主备关系)、高并发(能够承受大并发用户访问)、分布式。真正作到这个层次架构的时候,你的系统平均天天的访问量不可能低于500W-1000W用户,若是没有到这个用户的量级,那么能够确定的是用这样的架构会形成大量的额外硬件成本(云服务器(云服务器的出现解决了企业搭建私有云问题))。
在正规的项目开发过程之中确定会有专业的前端开发者,这类人员会使用ES6.0标准进行前端开发,例如JQuery、Vue.JS、React等,因此这部分的设计不作考虑。
在总体的设计过程之中,就必须去考虑性能的均衡,固然服务器的选择和你要使用的技术的选择也须要根据实际状况肯定。要根据你并发访问人数来决定你的技术架构。
评价一个项目的好与坏,有一个最简单的标准:时间复杂度和空间复杂度。
时间复杂度指的是你的处理逻辑很是的复杂,例如:递归、循环结构复杂,复杂度直接的影响就是你的CPU的占用率高。
空间复杂度:你占用的内存大,例如:在进行JDBC进行数据查询的时候实际上会出现一个问题:若是假设你的数据库有1000w条数据,没有使用分页,那么这些记录都将加载到内存之中。因此你的内存占用率就会很高,假设这些数据会占用20G的内存,那你的一个服务器必定须要为上万人服务,那么这个时候所占用的内存就会很是的庞大,你的服务器根本就没法处理。
对于空间复杂度的操做处理,是须要经过最简单的分页算法能够实现约定,而对于时间复杂度,若是太复杂的逻辑运算,每每不会在一台服务器上运行,须要设计多台的开发服务器。(不是如今能够理解的,只是3~4年工做经验)
最好的效果:处理块,占用内存小,你的程序必定要写到位。
若是你的面试公司给了你这样的一个问题,那么考虑的只是一个逻辑分析能力。由于这种开发的操做从现实来看都是经过硬件模拟的,那么若是非要经过软件模拟,就须要准备好可能使用到的技术:
java编写:Graphics类进行绘制开发:
WEB编写:HTML5中提供的Canvas进行编写
面对此类的问题必定要有一个假设前提:
是否须要有黄灯缓冲,缓冲的变动时间?
是否须要智能调整,若是发现车流量较大,则适当延迟经过时间;
对于违规的车辆的监控状况。
还可能考虑转向灯的设计
实现整个操做的技术环节:
定时器:Timer、TimerTask,可是这两个类是须要时钟支持,但是不许,若是要准确则须要QuartZ这个组件
描述全部的灯的变化,必定要有一个线程的同步处理机制、synchronized、使用单例实现;
既然有两组灯,就建议设计一个单独红绿灯类,这个类可使用一些参数变化完成,例如:
|-控制变量 =0:表示红灯;
|-控制变量 =1:表示绿灯;
|-控制变量 =2:表示转向灯;
|-控制变量 =3:表示黄灯(绿灯变为转向);
|-控制变量 =4:表示黄灯(转向变为红灯);
若是你如今只是但愿给出一组状态,实际上就能够设置一个如下几位:
111,能够描述七个值。
若是要编写还须要考虑传感器问题:包括监控传感器、流量传感器。
既然已经有了各类传感器,那么就能够再设置几个传感器:车速传感器,能够进行大数据的汇总,计算平均的车速,好为城市的交通规划做出数据的贡献。
开发流程:
一、须要先实现定时进行灯的切换处理,若是你须要程序编写,若是使用无界面编写,这个输出的信息很是麻烦;
二、须要考虑监控的问题,若是只是在软件上模拟,能够设置几个坐标点,而真实的环境须要有传感器
三、考虑数据分析问题,能够对相应数据进行采集与汇总。
一、项目中的人员安排
任何一个技术型的公司里面均可能有若干个开发团队,每一个团队的开发人数基本上就在3~6我的之间,这样基本上每一个团队都有一个架构师(写代码),并且每个团队对应的是一个具体的业务。在团队里面3个开发,以及一个美工,这些是正规的开发团队的组成,可是全部的团队之上都会有项目经理存在。
也有一部分的公司所有请的都是架构师,这些架构师本身直接实现代码,这一类的人群技术的要求是比较高的,可是在整个的项目公司里面还会有一些辅助人员:系统测试(多个组有两个,每一个组有一个),支撑的人员(打杂),这个就属于项目的维护人员。
因此若是你要想从事软件行业,那么最好的作法是不去作这些辅助的工做,而直接上手开发,这样对于你往后的发展是很是有帮助的,从最初的强调全栈工程师,到如今强调的是开发+运维,那么之后全员架构时代,也就是说全部的开发人员必定都是能独挡一面的高手,这类人的工资虽然高,可是整个企业运行来说,这样的成本是最低的。
在之后的开发之路,懂架构有将来,两年以后,这就是技术人员的基础要求了。
所谓的加密每每通常都会存在有一种解密程序。毒蛇出入七步以内必有解药。
最简单的加密,
你的原始密码:abc; 加密:cba;
那么说若是全部人都知道有这样的密码结构,那么就能够很轻松的破解,但是若是你在里面追加一些内容;
你的原始密码:abc; 盐值:_; 新密码:c_b_a_;
若是按照原始规则,那么如今就没法获得正确的原始密码。
也就是说盐值是让整个的密码看起来更加安全
MD5的结构特征是不可逆,可是使用时间长了有些人就开始找到了一些规律,那么为了避免让这些人破解个人密码,那么就在生成密码的时候增长一些额外的内容,这样的内容就是盐值,这样就能够避免这些人来破坏,不一样的项目使用不一样的盐值来进行处理。
Shiro里面盐值:password+({Base64的加密程序}),密码才保存的更加安全。
若是要进行商品秒杀的操做必定要有一个前提:预估数据量。
小米进行抢购的时候都须要针对数据量进行预估:全部的人须要报名参加抢购;
京东或淘宝的时候发现缺乏报名,它们是依靠大数据分析系统得来的预估数据量;
若是没有预估数据量,那么整个的系统的先期准备就会不足。如今假设若是要进行秒杀操做
用户进行秒杀的登记;
时间一到开始进行秒杀操做;
在秒杀的过程之中须要出现一个等待界面,若是此类界面刷新了,则抢购失败;
在通常的系统开发里面,对于一些调试的数据都不多去使用System.out进行输出,几乎都会配置Log4j开发包,这个开发并不复杂,你只须要配置上开发包,然后使用Logger类就可使用了。
里面分为几种级别:info()、error()、warning().若是出现了异常必定使用的是error()。
之因此使用log4j输出,主要是方便进行一些调整。日志是咱们解决问题的关键,也就是说全部的日志都应该输出到一个指定的目录之中,可是这样的配置都是固定的,不须要作特别的处理。
须要的就是配置log4j、slf4j这样的开发包就可使用日志输出了。
实际的环境的架构设计,必需要充分的考虑到你的业务需求以及所谓的高峰访问的状况,假如说你有一个系统一年就10我的访问,那么就不须要去搞架构了。
通常若是要进行架构设计,必须考虑一下几点:
该架构可否动态扩容;
该架构可否支持HA机制;
以上的集群设计是为了考虑性能平衡,可是会有一个问题存在:没有考虑到HA机制,若是考虑到高可用机制还须要追加更多的协助主机,这些主机将做为备选使用。(若是说企业架构的话,这样的一套集群涵盖了大部分的企业互联网开发的企业操做状况,作到了必定程度须要深度学习)
项目的开发之中有多少个数据库?
在实际的项目开发过程之中,只有一点是肯定的,那么就是Tomcat里面是没有数据库的。
若是要进行实际的项目开发,每每须要要有许多的子系统,因此如今的开发领域上常常出现一个概念:微架构。其中这种微架构的设计使用两种开发技术:Dubbo、SpringCloud.
若是要是将项目进行子系统的规划设计,全部的子系统里面包含的就是全部的业务层接口以及数据层的接口。
若是你是作的一些基础开发,那么对于整个的开发技术而言,你只须要一个数据库实现数据便可,固然这里面还须要考虑库表分离的问题,全部的数据库不可能无限制的让数据增加。
数据库自己是存储结构数据的,因此所谓的数据库优化都是指的是传统的关系型数据库操做。那么对于数据库的优化有如下的几个使用原则:
你须要有一个很是专业的DBA,能够根据你的服务器的配置调整你的服务器的配置调整你的数据库的运行环境;
数据库须要选择合适的操做系统才能够返回优点,例如:DB2只能在AIX下运行;
请保证你的查询语句不会写的特别荒唐(例如:你大量的采用了多表查询,而且在高并发的状况下依然采用一样的方式进行);
能够将部分的数据静态化到缓存之中,例如:城市、省份的信息、学校、住宅楼的信息基本不会发生变化;
若是以上的要求都作到了,数据库的操做依然很慢,那么就有多是数据量太大的缘由了,那么此时你再怎么进行优化,你的数据库的操做也不可能获得质的提高,那么这个时候就必须作先期的项目预估,这个预估的时候就须要考虑进行进行库表分离的有效设计:
数据库的分片保存(数据备份问题,一主多从的备份);
数据的读写分离(你可使用多个数据库同时完成数据的读取的负载均衡);
若是从程序自己的角度来说,每个用户的请求必定要及时的关闭好数据库的链接,不要打开过多的无效连接及在你的项目之中应该配置上数据源。
我本身的我的理解:
一、你须要清楚你所进行开发项目的行业背景;
|-若是在进行一个系统的设计之初进行了大量的分析与设计,结果最终作完成品设计与你的初期设计有很大的差异。那么就建议不要作特别具体的规划,可让甲方派人驻扎,这样能够随时进行业务沟通,随时进行设计;
二、在整个系统的设计之中,若是确实有必要会考虑将一些数据进行冗余处理;(不决定,根据系统决定)
三、在系统设计之中你必须进行并发访问的预估,非高峰时期的访问量、高峰时期的访问量;
四、你的系统须要使用那些额外的第三方接口才能够更好的完成功能,例如:支付宝;
五、你还须要考虑你项目的子系统设计问题,由于必需要考虑某一个系统的损坏,不会影响其余的系统;
|-若是要考虑到子系统的问题,那么就绝对不可能只使用一个服务器开发了,你每每须要的是一个服务器的集群,同时建议子系统的设计采用Restful架构完成;
六、还须要考虑与其余平台的交互问题;
七、考虑数据的安全问题;
实际上如今对于开发人员有些尴尬:咱们开发人员如今的定位好像不这么清楚,在许多非专业的人士看来,只要跟电脑有关的一切都应该交给开发技术人员完成。若是真的在工做之中进行架构的设计,每每应该有一些专业的搞服务器运维的人士来进行。
这些内容与你学习的开发代码只有一张纸的距离。(可是这层膜要一两年的经验才能破)
系统重构这一个概念实际上会发现常常出如今咱们的开发环境中,我第一次听到系统重构的概念是在2004年的时候听到的,当时我我的的第一反应:为何要重构?
对于如今的技术给出的网上资料其实特别的多,可是在当初的时代可以得到技术的来源只有图书,因此咱们都会翻阅图书进行查看,可是对于当时只有一些纯粹的理论概念上零散的讲了点所谓的重构知识。
【我的意见】我仅仅是以我我的意见进行说明:
系统重构前提:
|-你如今的系统已经没法知足用户的使用要求,也就是说在白天的时候该系统因为办公的人数较多,访问量也高,因此系统的负荷很大;
|-你如今业务的流程出现了改变。
重构的模式:
|-业务的从新梳理,也就是说你须要根据如今已有的业务实现进行升级的逻辑改造,这一改造就会牵扯到数据库的设计变动,同时这个变动还须要保留好原始的操做数据
|-将一个服务器上运行的项目,拆分到多个服务器上运行,这样能够有效的实现负载均衡;
|-须要将你的业务以子系统的形式出现,也就是说一个综合的系统之中须要拆分出无数个子系统进行共同的支撑,同时还须要准备出若干种RPC方案技术(Dubbo、Rest-微架构);
|-数据的备份存储问题,由于访问量大就有可能不是一台数据库能够支撑的;
|-你可能还须要准备出多个WEB端,那么这些WEB端的数据的共享,那么就须要准备出Redis(Redis-Cluster),这些WEB端须要同时被nginx或apache作反向代理。
【企业内部】这样重构的好处:
全部的业务子系统独立出去以后能够进行各类系统间的整合处理(各个子系统之间不要互相调用);
适合高并发操做访问,至少保证速度不会慢;
数据的操做都基于Redis缓存处理;
缺点;服务器的成本加大,由于若是要作高可用的配置的话,基本上还须要增长至少10台服务器的成本。
软件设计没有“1+1=2”这样的公式,咱们惟一能够作到的事情就是根据具体的业务进行分析。出发点:高可用,高并发,分布式。
一、项目实际上在咱们看来没有大小之分。有的只是你的业务逻辑是否清楚。
在你进行项目设计的时候应该更清楚这个项目的设计的业务,能够对某一个项目进行一些一些头脑风暴扩充;
你随意百度一个相似的项目信息或者是能够运行的项目代码,使用一次。
二、项目的解释必须有一个原则:你的项目的使用环境、预估的访问人数、并发量;
三、项目的开发技术,若是是单节点的开发技术,只须要传统的技术名词:jquery,Struts,hibernate,spring,shiro
四、若是你的项目设计的架构比较复杂,使用的服务节点比较多,这个时候你就须要清楚这些服务节点的做用,以及这些服务节点的安全处理你是如何进行的、节点间的数据互相同步处理;
五、描述这个项目之中具有多少个模块,完成的周期(比喻作一个cms新闻管理系统,两天就能够完成的工做用一个月)项目最快比喻(美工(一周)、测试(2~3天)、开发开发(大约3周,按照一天能够开发3~5(新手2~4)个模块来进行推算,并且一个项目团队的人数不会超过十我的,若是项目是通常的,基本上就能够考虑五、6我的,美工公用的))
六、你作了哪些项目,这些项目里面的具体的业务是什么。
若是要进行项目的开发必定会有一个源代码程序,可是这个源代码程序若是要想执行,确定要求将其部署到WEB容器之中,对于WEB容器可使用Tomcat。
实际上对于项目的开发流程与你的正常作饭吃饭是相同的。
肯定你要作的是什么饭,例如:你今天打算吃个火锅?或者吃个炒菜?吃个方便面?
须要为饭菜作一些准备,例如:购买食材、购买调料;
开始进行作饭的手势,例如:洗菜、摘菜、准备各类调料:葱姜蒜;
开始炒制,开始作饭;
开始吃;
开始收尾;
实际上项目的流程和它没有什么区别?
【10%】如今假设你是甲方老板,你须要开发某一款软件,进行某些业务功能的弥补,那么对于此时的乙方至关于得到了你的需求,然后能够针对于你的需求进行分析;将全部可能碰见的功能进行列表以及与甲方进行却,随后肯定这个项目能够,这个醒目作的时候出一些项目的执行方案(不少人会拿着你的方案本身去作了,若是你之后真的开公司进行项目开发,那么必定要跟甲方要钱,不给钱说明不给你作,不要给本身的方案给它)。
前期需求的时候必定要给出一些设计界面;
【30%】进行项目的先期规划设计,须要设计出数据库、设计出项目的架构、以及预估项目的访问量,同时须要考虑扩容性问题(你必须对要进行开发的行业很清楚,才可以作出来);
【50%】进行项目的编写开发,而在进行编写开发的过程之中,也会牵扯到一些问题:甲方的需求有可能变动,因此你的项目的结构设计必须知足于变动的需求,那么就须要对项目重构,最好使用Maven进行重构处理;
进行项目的内部测试,然后进行bug记录;
【10%】进行项目的上线以及项目的维护;(新人通常都作维护)
我的需求分析的实现方式:(需求分析没有固定的方法,什么的【10%】表明预付款,最后国内通常要不到)
明确的写出项目的业务流程,例如:该业务涉及到多少张数据表每张表的数据有什么做用?
明确的给出项目规划图(前端开发人员提供);
一、通常的,用户表,课程表,报名数据表的设计是第二范式,须要创建用户数据库,而后经过userid跟课程id来决定报名一个学生的报名状况,然而当前状况是用户帐号密码是调用webservice接口获取的,并且用户有可能会被注销,但愿老师提供解决思路
二、每个课程是有名额限制的,假如想让读者看到实时剩余名额,在线抢课的人可能比较多,应如何避免数据不一致的情形发生。
若是要想实现这样的架构设计,而且考虑并发访问的话,那么就须要更多的去解决你的吞吐量问题,如今作一个假设,参与秒杀的人数为5W。
高并发的状况下,不要过多的考虑数据库的设计范式,只须要按照总体的单表处理,全部的操做要经过业务层实现关联处理。
对于这种延迟加载问题,实际上属于spring+Hibernati时代的产物,这个也是Hibernate比较鸡肋的功能。之因此说它鸡肋主要是由于有以下问题:
一、几乎全部的配置都须要打开延迟加载,不然整个的程序性能会受到严重的影响;
二、有可能会产生严重的“1+N”查询,例如:如今一个分类下有多个新闻信息,那么如今很明显,若是此时没有打开延迟加载,就意味着若是你如今有10个分类的数据,那么就会自动查询10次的字表数据,那么若是每一个字表的字段包含有3000篇新闻,那么最终的结果就是30000w条数据,并且这些数据你不是直接去使用。
三、当spring与Hibernate结合的时候就会出现有一个页面数据的延迟打开问题,也就是说你可能但愿你的Session一直到页面后才进行关闭。
将Hibernate中的Session延迟到页面后进行关闭,那么对于整个的事务处理是很是麻烦的,并且这种操做还须要进行一个OpenSessionInView过滤器的配置。
正是由于这样的状况,在实际的开发过程之中,针对于须要进行显示的数据,例如:你如今在查询一个雇员的时候,但愿取得雇员对应的部门数据,并且很肯定这个雇员只对应有一个部门的信息,那么就建议在业务层里面,取得完雇员信息以后,直接再使用getter方法查询该雇员对应的部门的数据信息。
在业务层的控制是由于全部的AOP切入点都是在业务层上完成的。随后到了整个页面之中就能够直接在JSP页面里面利用emp对象“${emp.dept.dname}”。
对于程序的性能,基本上都出如今数据库上,而若是说用户不少,问题也会出如今数据库上,而咱们在开发的时候为了保证数据库的操做性能,最好的作法就是:保证你只是查询到你所须要的数据,不须要的数据绝对不要去查,由于查询会浪费磁盘的性能,而查询的结果会占用内存,而CPU是经过内存读取数据的,因此若是数据量一大,或者控制不合理,那么直接致使系统变慢。
若是你如今有多个系统须要统一的集成处理,那么就须要有一套统一的空间进行认证数据的保存,可是仅仅是保存认证数据而已。
通常在进行oauth(读:欧奥斯)处理的时候每每会使用spache、oltu组件来完成总体的开发操做。
若是说你如今想作一个全网络的站点访问统计,会包含一些核心的数据:用户从哪里来、访问的地址(UV、PV),访问的次数等,那么对于这样的设计确定须要一套分布式的处理架构。
如今假设对于全部的中国站点的访问量的设计里面每秒的传输的数据有1000w条,对于1000w条的访问量,那么确定不可以使用传统的关系型数据库处理了(传统的关系型数据库提供有事物的支持能力,一旦牵扯到了事务问题,那么就直接带来性能下降),因此在这种状况下确定要使用No-SQL数据库,既然要进行大并发访问,确定使用就是Redis数据库。并且既然每秒有1000w条