Java高级工程师常见面试题(三)-Java Web

博主其他相关文章:《Java高级工程师常见面试题-总结》

1. session和cookie的区别和联系,session的生命周期,多个服务部署时session管理。

cookie 和session 的区别:

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗, 考虑到安全应当使用session。

3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE。

4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

5、所以个人建议:

   将登陆信息等重要信息存放为SESSION。

   其他信息如果需要保留,可以放在COOKIE中。

cookie 和session 的联系:

由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的(保存这个session id的方式可以采用cookie),但实际上它还有其他选择。

经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。

还有一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如: 

<form name="testform" action="/xxx"> 

<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"> 

<input type="text"> 

</form> 

实际上这种技术可以简单的用对action应用URL重写来代替。

session的生命周期:

Session存储在服务器端,一般放在服务器的内存中(为了高速存取),Sessinon在用户访问第一次访问服务器时创建,需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session,可调用request.getSession(true)强制生成Session。

  Session什么时候失效?

  1. 服务器会把长时间没有活动的Session从服务器内存中清除,此时Session便失效。Tomcat中Session的默认失效时间为20分钟。

  2. 调用Session的invalidate方法。

多个服务部署时session管理:

1、在服务器端不保存Session,完全无状态

     对于不需要保持用户状态的Web应用,采用Stateless是最为恰当的,因此就不存在Session共享的问题。REST (Representational State Transfer) 算是最为典型的例子。

2、基于浏览器Cookie的Session共享

      此种方案把用户相关的Session信息存储到浏览器的Cookie中,也称为客户端Session。

      采用Flash Cookie、URL重写的方式传递Session信息的方案也可以归为此类。

      缺点:只能够存储字符串、数值等基本类型的数据;Cookie大小存在限制;安全性;带宽及数据解压缩、网络传输性能问题。

3、基于数据库的Session共享,实现分布式应用间Session共享

     此种方案把Session信息存储到数据库表,这样实现不同应用服务器间Session信息的共享。

优点:实现简单

缺点:由于数据库服务器相对于应用服务器更难扩展且资源更为宝贵,在高并发的Web应用中,最大的性能瓶颈通常在于数据库服务器。因此如果将 Session存储到数据库表,频繁的增加、删除、查询操作很容易造成数据库表争用及加锁,最终影响业务。

4、基于应用服务器/Servlet容器的Clustering机制

        一些常用的应用服务器及Servlet容器的Clustering机制可以实现Session Replication的功能,例如Tomcat Clustering/Session Replication、Jboss buddy replication。

         缺点:基于Clustering的Session复制性能很差,扩展性也很不行。

5、基于NFS的Session共享

         通过NFS方式来实现各台服务器间的Session共享,各台服务器只需要mount共享服务器的存储Session的磁盘即可,实现较为简单。但NFS 对高并发读写的性能并不高,在硬盘I/O性能和网络带宽上存在较大瓶颈,尤其是对于Session这样的小文件的频繁读写操作。

        基于磁盘阵列/SAN/NAS等共享存储的方案道理也类似。

6、基于Terracotta、Ehcache、JBossCache等Java Caching方案实现Session共享

    如果系统架构是Java体系,可以考虑采用Terracotta、Ehcache、JbossCache、Oscache等Java Caching方案来实现Session 共享。

    缺点:架构用于非java体系很不方便;对于是诸如静态页面之类的缓存,采用Memcached的方案比Java更为高效

7、基于Memcached/Tokyo Tyrant 等Key-Value DB的Session共享

    整体说来此种方案扩展性最好,推荐使用。

    原理:Tomcat 服务器提供了org.apache.catalina.session.StandardManager 和org.apache.catalina.session.PersistentManager用于Session对象的管理,可以自定义 PersistentManager的

Store 类来实现自己Memcached、Tokyo Tyrant、Redis等Key-Value DB的客户端。

2. servlet的一些相关问题

https://blog.csdn.net/u013361361/article/details/20956411

3. webservice相关问题

https://blog.csdn.net/qq_33326449/article/details/52973297

https://blog.csdn.net/u012320542/article/details/53425272

4. jdbc连接,forname方式的步骤,怎么声明使用一个事务。举例并具体代码

在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),   

这通过java.lang.Class类的静态方法forName(String  className)实现。   

例如:   

try{   

//加载MySql的驱动类   

Class.forName("com.mysql.jdbc.Driver") ;   

}catch(ClassNotFoundException e){   

System.out.println("找不到驱动程序类 ,加载驱动失败!");   

e.printStackTrace() ;   

}   

成功加载后,会将Driver类的实例注册到DriverManager类中。

JDBC事务机制:

private Connection conn = null;  

private PreparedStatement ps = null;  

try {  

    conn.setAutoCommit(false);  //将自动提交设置为false  

    ps.executeUpdate("修改SQL"); //执行修改操作  

    ps.executeQuery("查询SQL");  //执行查询操作                 

    conn.commit();      //当两个操作成功后手动提交  

} catch (Exception e) {  

    conn.rollback();    //一旦其中一个操作出错都将回滚,使两个操作都不成功  

    e.printStackTrace();  

}

5. 无框架下配置web.xml的主要配置内容

1、指定欢迎页面。

2、命名与定制URL。我们可以为Servlet和JSP文件命名并定制URL,其中定制URL是依赖一命名的,命名必须在定制URL前。

3、定制初始化参数:可以定制servlet、JSP、Context的初始化参数,然后可以再servlet、JSP、Context中获取这些参数值。

4、指定错误处理页面,可以通过“异常类型”或“错误码”来指定错误处理页面。

5、设置过滤器:比如设置一个编码过滤器,过滤所有资源。

6、设置监听器。

7、设置会话(Session)过期时间,其中时间以分钟为单位。

其他:Web应用图标、Web 应用名称、Web 应用描述、上下文参数等。

6. jsp和servlet的区别

1.jsp经编译后就变成了Servlet。

(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)

2.jsp更擅长表现于页面显示,servlet更擅长于逻辑控制。

3.Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到。

Jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。

而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。

联系:

JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。

Servlet和JSP最主要的不同点在于:

Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。

而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。

JSP侧重于视图,Servlet主要用于控制逻辑

Servlet更多的是类似于一个Controller,用来做控制。

阅读更多
个人分类: java 面试
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭