Java 面试题-WEB、网络编程、设计模式

1.JSP 和 servlet 有什么区别?

    JSP 是 servlet 技术的扩展,本质上就是 servlet 的简易方式。servlet 和 JSP 最主要的不同点在于,servlet 的应用逻辑是在 Java 文件中,并且完全从表示层中的 html 里分离开来,而 JSP 的情况是 Java 和 html 可以组合成一个扩展名为 JSP 的文件。JSP 侧重于视图,servlet 主要用于控制逻辑。

2.JSP 有哪些内置对象?作用分别是什么?

JSP 有 9 大内置对象:

  • request:封装客户端的请求,其中包含来自 get 或 post 请求的参数;
  • response:封装服务器对客户端的响应;
  • pageContext:通过该对象可以获取其他对象;
  • session:封装用户会话的对象;
  • application:封装服务器运行环境的对象;
  • out:输出服务器响应的输出流对象;
  • config:Web 应用的配置对象;
  • page:JSP 页面本身(相当于 Java 程序中的 this);
  • exception:封装页面抛出异常的对象。
3.说一下 JSP 的 4 种作用域?
  • page:代表与一个页面相关的对象和属性。
  • request:代表与客户端发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件;需要在页面显示的临时数据可以置于此作用域。
  • session:代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的 session 中。
  • application:代表与整个 Web 应用程序相关的对象和属性,它实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域。
4.session 和 cookie 有什么区别?
  • 存储位置不同:session 存储在服务器端;cookie 存储在浏览器端。
  • 安全性不同:cookie 安全性一般,在浏览器存储,可以被伪造和修改。
  • 容量和个数限制:cookie 有容量限制,每个站点下的 cookie 也有个数限制。
  • 存储的多样性:session 可以存储在 Redis 中、数据库中、应用程序中;而 cookie 只能存储在浏览器中。
5.说一下 session 的工作原理?

    session 的工作原理是客户端登录完成之后,服务器会创建对应的 session,session 创建完之后,会把 session 的 id 发送给客户端,客户端再存储到浏览器中。这样客户端每次访问服务器时,都会带着 sessionid,服务器拿到 sessionid 之后,在内存找到与之对应的 session 这样就可以正常工作了。

6.如果客户端禁止 cookie 能实现 session 还能用吗?

    可以用,session 只是依赖 cookie 存储 sessionid,如果 cookie 被禁用了,可以使用 url 中添加 sessionid 的方式保证 session 能正常使用。

7.spring mvc 和 struts 的区别是什么?
  • 拦截级别:struts2 是类级别的拦截;spring mvc 是方法级别的拦截。
  • 数据独立性:spring mvc 的方法之间基本上独立的,独享 request 和 response 数据,请求数据通过参数获取,处理结果通过 ModelMap 交回给框架,方法之间不共享变量;而 struts2 虽然方法之间也是独立的,但其所有 action 变量是共享的,这不会影响程序运行,却给我们编码和读程序时带来了一定的麻烦。
  • 拦截机制:struts2 有以自己的 interceptor 机制,spring mvc 用的是独立的 aop 方式,这样导致struts2 的配置文件量比 spring mvc 大。
  • 对 ajax 的支持:spring mvc 集成了ajax,所有 ajax 使用很方便,只需要一个注解 @ResponseBody 就可以实现了;而 struts2 一般需要安装插件或者自己写代码才行。
8.如何避免 SQL 注入?
  • 使用预处理 PreparedStatement。
  • 使用正则表达式过滤掉字符中的特殊字符。
9.什么是 XSS 攻击,如何避免?

    XSS 攻击:即跨站脚本攻击,它是 Web 程序中常见的漏洞。原理是攻击者往 Web 页面里插入恶意的脚本代码(css 代码、Javascript 代码等),当用户浏览该页面时,嵌入其中的脚本代码会被执行,从而达到恶意攻击用户的目的,如盗取用户 cookie、破坏页面结构、重定向到其他网站等。

    预防 XSS 的核心是必须对输入的数据做过滤处理。

10.什么是 CSRF 攻击,如何避免?

    CSRF:Cross-Site Request Forgery(中文:跨站请求伪造),可以理解为攻击者盗用了你的身份,以你的名义发送恶意请求,比如:以你名义发送邮件、发消息、购买商品,虚拟货币转账等。

    防御手段:

  • 验证请求来源地址;
  • 关键操作添加验证码;
  • 在请求地址添加 token 并验证。
11.http 和 https 的区别?
  • http 的连接很简单,是无状态的;HTTPS 协议是由 SSL + HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 http 协议要安全。
  • http 和 https 使用的端口也不一样,前者是 80,后者是 443。
12.get 和 post 的区别?
  • 首先,get是从服务器获取数据,而post是向服务器发送数据。
  • get会将参数加入到表单的action所指的url中,数据在页面的url中看得到;而post是将表单内容放在html header中,再传送给action所指的url,用户是看不到参数的。
  • get 请求参数长度有限制,而 post 没有。
  • 所以,get的方式相比于post方式的安全性较低。
  • 但是,get的执行效率比post高。如果是查询数据的话,建议使用get,而增删改建议使用post方式。
13.forward 和 redirect 的区别?

    forward 是转发,而 redirect 是重定向:

  • 地址栏 URL 显示:forward url 不会发生改变,而 redirect url 会发生改变;
  • 数据共享:forward 可以共享 request 里的数据,redirect 不能共享;
  • 效率:forward 比 redirect 效率高;
14.Servlet 是什么?

    Servlet(Server Applet),全程 Java Servlet,未有中文译文。是用于 Java 编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。

    狭义的 Servlet 是指 Java 语言实现的一个接口,广义的 servlet 是指任何实现了这个 Servlet 接口的类,一般情况下,人们将 Servlet 理解为后者。

15.Servlet 的生命周期是怎样的?
  • Servlet 初始化后调用 init () 方法。
  • Servlet 调用 service() 方法来处理客户端的请求。
  • Servlet 销毁前调用 destroy() 方法。
  • 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
16.Servlet 是线程安全的么?

    不是线程安全的,尽量不要定义全局变量。

17.Servlet 支持异步处理吗?

    Servlet3支持异步处理。

18.Servlet 是单例还是多例?
  • 如果一个 Servlet 没有被部署在分布式环境中,一般 web.xml 中声明的一个 Servlet 只对应一个实例。
  • 而如果一个 Servlet 实现了 SingleThreadModel 接口,就会被初始化多个实例。
19.如何实现隐藏的表单域?
<input type="hidden" name="java" value="..."/>
20.AJAX 应用和传统 Web 应用有什么不同?

    AJAX 可以实现异步局部页面刷新,而传统 Web 应用只能同步刷新整个页面。

21.怎么优化 Web 前端的性能?
  • 1.HTML CSS JS 位置
    一般需要将 CSS 放页面最上面,即 HEAD 部分,而将 JS 代码放页面底部。
  • 2.引用文件位置
    尽量把远程引用的资源本地化。
  • 3.减少后台请求
    每个请求都是耗费资源影响系统性能的,所以能减少后台请求就减少
  • 4.压缩传输
    http 压缩可以对纯文本可以压缩至原内容的 40%,从而节省了 60% 的数据传输。
  • 5.减少 cookie 传输
    cookie 会包含在每次请求和响应中,如果cookie 过多会影响 http 相应速度。
  • 6.浏览器缓存
    高并发情况下,可以将一些不怎么变动的东西缓存到浏览器 cache 中。
  • 7.CDN
    CDN 是一个静态内容分发网络,本质就是静态资源的缓存,可以将静态资源放到 CDN上。
  • 8.反向代理
    常用的反向代理 nginx 除了负载均衡功能,它也可以通过配置缓存功能来加速请求响应速度。
22.拦截器和过滤器的区别?
  • 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
  • 拦截器不依赖bai与servlet容器,过滤器依赖与servlet容器。
  • 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
  • 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
  • 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
23.什么是跨域?有哪些解决方案?

    当一个请求 url 的协议、域名、端口三者之间任意一个与当前页面 url 不同即为跨域。
实现跨域有一下几种方案:

  • 服务器端运行跨域 设置 CORS 等于 *;
  • 在单个接口使用注解 @CrossOrigin 运行跨域;
  • 使用 jsonp 跨域;
24.http 响应码 301 和 302 代表的是什么?有什么区别?

    301:永久重定向。
    302:暂时重定向。

    它们的区别是,301 对搜索引擎优化(SEO)更加有利;302 有被提示为网络拦截的风险。

25.简述 tcp 和 udp的区别?

    tcp 和 udp 是 OSI 模型中的运输层中的协议。tcp 提供可靠的通信传输,而 udp 则常被用于让广播和细节控制交给应用的通信传输。

    两者的区别大致如下:

  • tcp 面向连接,udp 面向非连接即发送数据前不需要建立链接;
  • tcp 提供可靠的服务(数据传输),udp 无法保证;
  • tcp 面向字节流,udp 面向报文;
  • tcp 数据传输慢,udp 数据传输快;
26.tcp 为什么要三次握手,两次不行吗?为什么?

    如果采用两次握手,那么只要服务器发出确认数据包就会建立连接,但由于客户端此时并未响应服务器端的请求,那此时服务器端就会一直在等待客户端,这样服务器端就白白浪费了一定的资源。若采用三次握手,服务器端没有收到来自客户端的再此确认,则就会知道客户端并没有要求建立请求,就不会浪费服务器的资源。

27.说一下 tcp 粘包是怎么产生的?

    tcp 粘包可能发生在发送端或者接收端,分别来看两端各种产生粘包的原因:

  • 发送端粘包:发送端需要等缓冲区满才发送出去,造成粘包;
  • 接收方粘包:接收方不及时接收缓冲区的包,造成多个包接收。
28.OSI 的七层模型都有哪些?
  • 物理层:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。
  • 数据链路层:负责建立和管理节点间的链路。
  • 网络层:通过路由选择算法,为报文或分组通过通信子网选择最适当的路径。
  • 传输层:向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输。
  • 会话层:向两个实体的表示层提供建立和使用连接的方法。
  • 表示层:处理用户信息的表示问题,如编码、数据格式转换和加密解密等。
  • 应用层:直接向用户提供服务,完成用户希望在网络上完成的各种工作。
29.说一下你熟悉的设计模式?
  • 单例模式:保证被创建一次,节省系统开销。
  • 工厂模式(简单工厂、抽象工厂):解耦代码。
  • 观察者模式:定义了对象之间的一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。
  • 外观模式:提供一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层的接口,让子系统更容易使用。
  • 模版方法模式:定义了一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤。
  • 状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
  • 代理模式:提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。
  • 策略模式:策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得它们可以相互替换。
30.简单工厂和抽象工厂有什么区别?
  • 简单工厂:用来生产同一等级结构中的任意产品,对于增加新的产品,无能为力。
  • 工厂方法:用来生产同一等级结构中的固定产品,支持增加任意产品。
  • 抽象工厂:用来生产不同产品族的全部产品,对于增加新的产品,无能为力;支持增加产品族。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值