分布式Tomcat共享Session方案

Spring Session是目前最好的解决session共享问题的方法

解决方法:

使用spring-session模式,即将session从Tomcat、容器中剥离,存储到独立的存储服务器中,例如MongoDB,Database,Redis。

设计思路:

设计一个filter,利用HttpServletRequestWrapper,实现自己的getSession(),接管servlet对session的创建和管理,spring-session也是这样设计的(用spring-session替换HttpSession)。

利用servlet容器提供的插件,自己定义session实现的策略,并通过配置的方式替换原有的策略。

由此问题扩展的问题:

什么是前后端分离?

答:前后端分离是互联网项目开发的标准方式,通过nginx+tomcat方式(也可以中间加一个nodejs中间件)进行解耦,

web.xml文件的作用?

答:xml文件是一种描述性文件,作用是描述一些东西,保存一些数据,web.xml文件的作用是告诉tomcat容器这是一个web项目,否则,tomcat容器不知道这是web项目,会将其当成普通文件夹处理。

HttpServlet程序的简介?

答:以let结尾的单词都有微小的意思,server是服务器,servlet的意思是服务器小程序,继承了HttpServlet接口的方法可以重写doGet、doPost方法来对请求进行预处理。

如何将项目部署到tomcat?

答:

常用的方式一般是,将项目打成war包,放到tomcat安装路径下的webapps下,手动启动tomcat后,访问项目war包名字路径(eg:localhost:8080/war包名字),tomcat会自行解压war包启动web项目。

另一种方式就是使用开发工具eclipse或idea,通过项目映射的方式将项目部署到tomcat上。

什么是war包?

答:

war包就是一个可以直接运行的web模块,开发web项目时都会使用一个webapp文件夹进行开发,这个文件夹直接放到Tomcat的webapps文件夹下就可以启动该项目了,而war包就是对这个文件夹进行打包。

idea中如何热部署web项目?

答:idea的tomcat配置页面有两个选项

一、On Update action:当文件有修改时执行此操作,一般选择Update classes and resources,意思是当有java文件和资源文件(jsp、xml等文件)修改时,立刻生效。

二、On frame deactivation:当idea失去焦点时执行此操作,一般选择Do nothing,因为idea失去焦点的可能性较大。

当idea将web项目部署到tomcat容器时,如果使用的是war包,则On Update action与On frame deactivation中的选项也是不一样的,没有Update resources和 Update classes and resources这种选项,取而代之的是Hot Swap Classes选项,本质的意思是一样的

servlet中@WebServlet注解的使用?

答:@WebServlet有几个属性,其中value是访问路径,当客户端访问此路径时,服务器就会进入servlet,读取其中的信息,在servlet3.0以前,需要在web.xml中配置servlet,3.0以后,可以直接使用@WebServlet注解进行配置(name 属性相当于<servlet-name>,value 属性相当于<url-pattern>等),servlet一般都会继承htteServlet类,重写其中的doGet、doPost方法。

request.getSession()与request.getSession(true/false)的区别?

答:request.getSession()和request.getSession(true)一样,当request中没有session信息时,则会创建一个,而request.getSession(false)request中没有session时,返回null。

分布式的好处以及要共享Session的原因和原理?

答:分布式通过分发请求的方式,让多个服务器处理请求,减少了单一服务器的压力,提高了服务器的性能。

原因:

当客户端发起第一个请求的时候,服务器端判断请求中无Session,让其进行登录操作并得到响应,客户端会得到响应的session(即sessionId),存储在客户端

当客户端第二次发送请求时,会携带sessionId,从而跳过登录,而此时请求在另一个服务器上处理,由于另一个服务器上没有session,当操作session时,程序会报错,无法正常响应。

原理:第一次请求后,服务器生成session,存到redis,第二次请求时,拿着客户端的sessionId去redis中取session,拿到session就能执行接下来的操作了。

session是在哪里产生的?

session是在浏览器访问tomcat服务器时,由HttpServletRequest的getSession(true)创建的,tomcat将其保存在内存中,也可以持久化到file、数据库、redis等,客户端只保存sessionId到cookie中,同一个客户端,不管打开几个页面,cookie中保存的sesssionId是一样的,session销毁只能通过invalidate或超时,关掉浏览器并不会关闭session。

如何获取服务器端的session信息?

答:request.getSession()是在服务器端运行的,意义相当于用request中保存的sessionid,去服务器的内存里找到对应的session,而不是从request中取出session对象。

javaWeb之过滤器Filter的作用?

Servlet Api 提供了一个Filter接口,实现这个接口的java类可以称之为Filter过滤器,其作用是在客户端访问某个资源时web容器对本次访问进行拦截,在访问资源前对请求进行拦截,在资源向web容器返回响应时进行拦截。

实现了Filter接口的过滤器需要重写doFilter方法,具体的逻辑也是在这个方法中完成的,其中的FilterChain.doFilter方法意思是如果还有下一个过滤器则执行下一个过滤器,否则访问目标资源。

Filter实现拦截的原理?

实现Filter接口,重写doFilter方法,并配置对哪个web资源进行拦截后,web服务器每次调用web资源的service方法前,都会先调用doFilter方法。

filter-mapping标签中servlet-name与url-pattern?

可以直接使用url-pattern对对应的请求路径进行拦截,也可以使用servlet-name对相应的servlet拦截,对应servlet-name标签的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值