1.2web进阶
什么是 CSRF 攻击,如何避免?
CSRF:Cross-Site Request Forgery(中文:跨站请求伪造),可以理解为攻击者盗用了你的身份,以你的名义发送恶意请求,比如:以你名义发送邮件、发消息、购买商品,虚拟货币转账等。 防御手段: 验证请求来源地址; 关键操作添加验证码; 在请求地址添加 token 并验证。
JSP 和 servlet 有什么区别?
JSP 是 servlet 技术的扩展,本质上就是 servlet 的简易方式。servlet 和 JSP 最主要的不同点在于,servlet 的应用逻辑是在 Java 文件中,并且完全从表示层中的 html 里分离开来,而 JSP 的情况是 Java 和 html 可以组合成一个扩展名为 JSP 的文件。JSP 侧重于视图,servlet 主要用于控制逻辑。
JSP 有哪些内置对象?作用分别是什么?
JSP 有 9 大内置对象: request:封装客户端的请求,其中包含来自 get 或 post 请求的参数; response:封装服务器对客户端的响应; pageContext:通过该对象可以获取其他对象; session:封装用户会话的对象; application:封装服务器运行环境的对象; out:输出服务器响应的输出流对象; config:Web 应用的配置对象; page:JSP 页面本身(相当于 Java 程序中的 this); exception:封装页面抛出异常的对象。
说一下 JSP 的 4 种作用域?
page:代表与一个页面相关的对象和属性。 request:代表与客户端发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件;需要在页面显示的临时数据可以置于此作用域。 session:代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的 session 中。 application:代表与整个 Web 应用程序相关的对象和属性,它实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域。
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 一般需要安装插件或者自己写代码才行。
2.2进阶
1. Error 和 Exception 区别是什么?
Error 类型的错误通常为虚拟机相关错误,如系统崩溃,内存不足,堆栈溢出 等,编译器不会对这类错
误进行检测,JAVA 应用程序也不应对这类错误进行捕 获,一旦这类错误发生,通常应用程序会被终
止,仅靠应用程序本身无法恢复;
Exception 类的错误是可以在应用程序中进行捕获并处理的,通常遇到这种错 误,应对其进行处理,使应用程序可以继续正常运行。
原文链接:
【Java面试】异常常见面试题_parselong error, field : lastmodifieddate-CSDN博客
3.2进阶
说一下 tcp 粘包是怎么产生的?
tcp 粘包可能发生在发送端或者接收端,分别来看两端各种产生粘包的原因: 发送端粘包:发送端需要等缓冲区满才发送出去,造成粘包; 接收方粘包:接收方不及时接收缓冲区的包,造成多个包接收。
如何实现跨域?
实现跨域有以下几种方案: 服务器端运行跨域 设置 CORS 等于 *; 在单个接口使用注解 @CrossOrigin 运行跨域; 使用 jsonp 跨域;
说一下 JSONP 实现原理?
jsonp:JSON with Padding,它是利用script标签的 src 连接可以访问不同源的特性,加载远程返回的“JS 函数”来执行的。
4.2进阶
24种设计模式之单例模式(饿汉式、懒汉式)_单例模式懒汉和饿汉_inexaustible的博客-CSDN博客24种设计模式之单例模式(饿汉式、懒汉式)_单例模式懒汉和饿汉https://blog.csdn.net/inexaustible/article/details/128816512
1、创建型模式
这些模式用于创建对象或者对对象的创建进行优化。
1.1、工厂模式 (Factory Pattern)
定义了一个创建对象的接口,但让子类决定要实例化的类是哪一个。工厂方法使得一个类的实例化延迟到其子类。
1.2、抽象工厂模式 (Abstract Factory Pattern)
提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
1.3、单例模式 (Singleton Pattern)
保证一个类只有一个实例,并提供一个全局访问点。
1.4、建造者模式 (Builder Pattern)
允许逐步构建复杂对象。与工厂模式不同的是,建造者模式更注重于对象的组装方式。
1.5、原型模式 (Prototype Pattern)
通过复制现有的对象来创建新的对象。
2、结构型模式
结构型模式是一类用于组织类和对象之间的关系的设计模式,它们通常解决对象的组合和对象之间的依赖关系的问题。结构型模式被分为7个不同的类型。
2.1、 适配器模式(Adapter Pattern)
将一个类的接口转换成客户端所期望的另一种接口。适配器模式通常用于解决两个现有接口之间不兼容的问题,以使它们能够在一起工作。
2.2、桥接模式(Bridge Pattern)
将一个对象的抽象部分与它的实现部分分离开来,使它们可以独立地变化。桥接模式通常用于解决多种实现方式的问题。
2.3、组合模式(Composite Pattern)
将对象组合成树形结构,以表示“整体-部分”的层次结构。组合模式使得客户端可以将单个对象和组合对象一视同仁,从而简化了客户端代码。
2.4、装饰器模式(Decorator Pattern)
允许在运行时动态地给对象添加功能,而无需修改它们的代码。装饰器模式是一种灵活而高效的替代继承的方式。
2.5、外观模式(Facade Pattern)
为一个复杂的子系统提供了一个简单的接口。通过使用外观模式,客户端可以将子系统的复杂性从它们的代码中分离出来。
2.6、享元模式(Flyweight Pattern)
将一个对象的状态分成内部状态和外部状态。通过共享内部状态,享元模式使得可以共享大量细粒度的对象,从而减少了内存消耗。享元模式通常与工厂模式一起使用,以便在需要时动态地创建新的对象。
2.7、代理模式(Proxy Pattern)
允许通过引入一个代理对象来控制对另一个对象的访问。代理对象充当客户端和实际对象之间的中介,以便在不改变实际对象接口的情况下增加额外的功能。
3、行为型模式
它们关注对象之间的交互和职责分配。这些模式主要用于处理对象之间的通信,以及在不同对象之间分配职责和行为。以下是常见的行为型模式及其详解:
3.1、观察者模式(Observer Pattern)
定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象发生改变时,所有依赖它的观察者对象都会得到通知并更新。
3.2、迭代器模式(Iterator Pattern)
提供一种方法来访问一个聚合对象中的各个元素,而不暴露该对象的内部表示。通过迭代器模式,可以遍历一个聚合对象而不需要知道其内部结构。
3.3、模板方法模式(Template Method Pattern)
定义了一个算法的骨架,将一些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的情况下重新定义算法中某些步骤。
3.4、命令模式(Command Pattern)
将请求封装成一个对象,从而使你可用不同的请求来参数化其他对象。同时,支持撤销操作。
3.5、职责链模式(Chain of Responsibility Pattern)
将请求的发送者和接收者解耦,使得多个对象都有机会处理请求。将这些对象串成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
3.6、策略模式(Strategy Pattern)
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。策略模式使得算法可独立于使用它的客户而变化。
3.7、状态模式(State Pattern)
允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它所属的类。
3.8、备忘录模式(Memento Pattern)
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。以后可以将该对象恢复到原先保存的状态。
3.9、访问者模式(Visitor Pattern)
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
3.10、解释器模式(Interpreter Pattern)
定义一个语言的文法,并且建立一个解释器来解释该语言中的句子。
3.11、中介者模式(Mediator Pattern)
目的是降低多个对象之间的耦合度,使它们能够更好地协同工作。在这种模式中,一个中介者对象作为其他对象之间的媒介,协调它们之间的交互,以便它们可以相互合作完成任务,而不需要直接相互交互。在中介者模式中,所有参与对象都与中介者对象进行交互,而不是相互之间直接交互。这样一来,参与对象就不需要知道其他对象的存在或具体实现细节,而只需要与中介者对象进行通信,由中介者对象负责协调整个系统的交互。
4、设计模式六大原则
设计模式六大原则,也称为设计原则或者SOLID原则,是面向对象设计的基础原则。这些原则是从多个设计模式的实践经验总结出来的,并且可以帮助我们编写可维护、可扩展、可重用的代码。
4.1、单一职责原则(SRP)
单一职责原则要求一个类只负责一个功能领域中的一项职责。也就是说,一个类应该只有一个引起它变化的原因。这个原则的目的是让类更加容易理解、扩展和维护。
4.2、开放封闭原则(OCP)
开放封闭原则要求软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。也就是说,我们应该通过扩展现有代码来实现新的功能,而不是直接修改现有代码。这个原则的目的是让软件更加稳定和易于维护。
4.3、里氏替换原则(LSP)
里氏替换原则要求一个子类能够替换其父类并且不会影响程序的正确性。也就是说,子类应该能够完全替代父类的功能,并且可以在不破坏程序的正确性的前提下进行扩展。这个原则的目的是让代码更加灵活和可扩展。
4.4、依赖倒置原则(DIP)
依赖倒置原则要求高层模块不应该依赖于底层模块,而是应该依赖于抽象。也就是说,我们应该通过抽象来定义组件之间的依赖关系,而不是通过具体实现来定义。这个原则的目的是让代码更加灵活和易于维护。
4.5、接口隔离原则(ISP)
接口隔离原则要求一个类不应该强迫其它类依赖于它们不需要使用的方法。也就是说,我们应该尽可能地将接口拆分为更小的部分,从而使得接口更加精简。这个原则的目的是让代码更加灵活和易于维护。
4.6、迪米特法则(LoD)
迪米特法则要求一个对象应该对其他对象有尽可能少的了解,也就是说,对象应该尽可能地降低与其它对象之间的耦合度。这个原则的目的是让代码更加灵活、易于维护和可复用。