【百面成神】java web基础7问,你能坚持到第几问

简介: 【百面成神】java web基础7问,你能坚持到第几问

1.如何解决跨域问题

跨域问题其实是因为浏览器的安全策略同源策略的限制,当url的协议、域名或者端口号不一致时,就会出现跨域问题。之所以要使用同源策略,是为了防止其它ducument或者脚本对当前document的属性读取或进行修改。


可以通过下面方法解决跨域问题:

跨域资源共享:服务端设置 Access-Control-Allow-Origin(spring使用使用@CrossOrigin注解即可实现)

微服务中使用gateway网关进行配置解决跨域问题

使用nginx代理:如果使用nginx实现反向代理,只需要修改其配置文件,使其支持所有浏览器,支持session


2.Cookie和Session的区别

相同:二者都是用来跟踪浏览器用户身份的会话方式

90a50b165bab424db2a6fca2ee099dde.png


不同:

(1),存储位置与工作原理不同

cookie存储在浏览器中,其工作原理是,浏览器第一次发送请求到服务端时,服务端会创建cookie,并将cookie返回给浏览器。当浏览器再次访问服务器时,会携带服务端创建的cookie,服务器根据浏览器传输的数据判断浏览器的数据区分不同的用户


Session存储在服务器中,session的工作原理:当浏览器第一次访问服务器时,服务器会创建一个session,并且创建一个特殊的cookie(name为”jsessionid”,value为session的ID),当之后浏览器再向服务器发送请求时,就会携带这个特殊的cookie,浏览器根据这个cookie里的sessionID查询到对应的session,从而区分不同的用户。如果不存在这个特殊cookie(说明浏览器被关闭或异常退出或者更换了浏览器),将会重新创建一个存储sessionID的特殊cookie返回给浏览器。如果sessionid对应的session对象无法被找到(说明session对象超过了存活时间(默认为30分钟)),也会重新创建特殊cookie。如果存在,就返回这个session对象。


(2),生命周期不同

session是一次会话,用来记录当前用户是否登陆或者具有某种特殊的权限,由于他存储在服务端,因此你无法伪造。

cookie是浏览器缓存的变量,只要不关闭浏览器,cookie一直有效,因此可以用cookie保证用户不掉线。如果在浏览器截取cookie包,就有可能骗过服务器。(当然你不能直接拷贝文件,服务器会记录文件的修改时间,所以你需要在时间上骗过服务器)


(3),应用场景不同

在使用时,我们可以将登陆信息等需要保证安全的信息存储在session里。然后其它信息存储在cookie里,保证安全同时尽量避免服务器冗余


3.Web容器的作用域

application:整个应用 对应servlet中ServletContext

整个应用是指从应用启动,到应用结束。我们没有说“从服务器启动,到服务器关闭”


session:会话    对应servlet中HttpSession

所谓当前会话,就是指从用户打开浏览器开始,到用户关闭浏览器这中间的过程。


request:一次请求  对应servlet中的HttpServletRequest


page:当前页面

如果把变量放到pageContext里,就说明它的作用域是page,它的有效范围只在当前jsp页面里。从把变量放到pageContext开始,到jsp页面结束,你都可以使用这个变量


4.拦截器、过滤器、监听器

拦截器:

是面向切面编程(AOP,Aspect Oriented Program)的。就是在你的Service或者一个方法前调用一个方法,或者在方法后调用一个方法。比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。

在springmvc中,定义一个拦截器可以通过两种方式:一种是通过实现 HandlerInterceptor 接口或继承 HandlerInterceptor 接口的实现类来定义;另一种是通过实现 WebRequestInterceptor 接口或继承 WebRequestInterceptor 接口的实现类来定义。如果是springboot直接使用注解就可以。

SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。

常见的拦截器的用途:

1、日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。

2、权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面;

3、性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录);


过滤器:

对于web应用来说,过滤器是一个驻留在服务器端的Web组件。web容器接收到一个对资源的请求时,它将判断是否有过滤器与这个资源关联,如果有,那么容器将这个请求交给过滤器处理。

在过滤器中,你可以改变请求的内容,或者重新设置请求的报头信息,然后再将请求发送给目标资源


常见的过滤器用途有:对用户请求进行统一的认证、对用户的访问请求进行审核和记录、对用户发送的数据进行过滤或替换、转换图像格式、对响应内容进行压缩以减少传输量、对请求或响应进行加密处理、触发资源访问事件等


过滤器和拦截器的区别:

通俗理解:

(1)过滤器(Filter):当你有一堆东西的时候,你只希望选择符合你要求的某一些东西。定义这些要求的工具,就是过滤器。(理解:就是一堆字母中取一个B)

(2)拦截器(Interceptor):在一个流程正在进行的时候,你希望干预它的进展,甚至终止它进行,这是拦截器做的事情。(理解:就是一堆字母中,干预它,通过验证的少点,顺便干点别的东西)


具体区别有:

拦截器是基于java的反射机制的,而过滤器是依赖于servlet容器,基于函数的回调。

拦截器只对action请求起作用,而过滤器则可以对几乎所有的请求起作用。

拦截器可以访问action上下文、值、栈里面的对象,而过滤器不可以。

在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。

拦截器可以获取IOC容器中的各个bean,而过滤器不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。


监听器:

监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。


5.Post和Get的区别

重点:GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出现在 URL 中,而 POST 的参数存储在实体主体中。


HTTP报文层面:GET将请求信息放在URL,POST放在报文体中。

数据库层面:GET符合幂等性和安全性,POST不符合。

其它层面:GET可以被缓存、被存储,POST不行


分别说明:

get用来获取数据,post用来提交数据

get参数有长度限制(受限于url长度,具体的数值取决于浏览器和服务器的限制,最长2048字节),而post无限制。

get请求的数据会附加在url之 ,以 " ? "分割url和传输数据,多个参数用 "&"连接,而post请求会把请求的数据放在http请求体中。

get是明文传输,post是放在请求体中,但是开发者可以通过抓包工具看到,也相当于是明文的。

get请求会保存在浏览器历史记录中,还可能保存在web服务器的日志中


幂等性

幂等通俗的来讲就是指同一个请求执行多次和仅执行一次的效果完全相等。这里来扯出幂等主要是为了处理同一个请求重复发送的情况,假如在请求响应之前失去连接,如果这个请求时幂等的,那么就可以放心的重发一次请求。所以可以得出get请求时幂等的,可以重复发送请求,post请求时不幂等的,重复请求可能会发生无法预知的后果。


5.转发forward和重定向redirect的区别

重点:转发是服务器行为,属于同一次请求,访问本站点的其它页面。重定向是客户端行为,至少两次请求,可以访问任意URL。


请求转发:

request.getRequestDispatcher(“/test.jsp”).forword(request,response);


重定向:response.sendRedirect(“/test.jsp”);


区别:


请求次数:重定向是浏览器向服务器发送一个请求并收到响应后再次向一个新地址发出请求,转发是服务器收到请求后为了完成响应跳转到一个新的地址;重定向至少请求两次,转发请求一次;

地址栏不同:重定向地址栏会发生变化,转发地址栏不会发生变化;

是否共享数据:重定向两次请求不共享数据,转发一次请求共享数据(在request级别使用信息共享,使用重定向必然出错);

跳转限制:重定向可以跳转到任意URL,转发只能跳转本站点资源;

发生行为不同:重定向是客户端行为,转发是服务器端行为;


使用:

重定向的速度比转发慢,因为浏览器还得发出一个新的请求,所以如果在使用转发和重定向都无所谓的时候建议使用转发;

因为转发只能访问当前WEB的应用程序,所以不同WEB应用程序之间的访问,特别是要访问到另外一个WEB站点上的资源的情况,这个时候就只能使用重定向了。


6.谈谈你对于servlet的认识

可以从两个方面去看Servlet:

a、API:有一个接口servlet,它是servlet规范中定义的用来处理客户端请求的程序需要实现的顶级接口。

b、组件:服务器端用来处理客户端请求的组件,需要在web.xml文件中进行配置。


servlet的生命周期是:加载servlet的class—》实例化Servlet-----》初始化servlet(调用init方法)------》调用服务service方法(处理doget和dopost方法)-----》servlet容器关闭时调用销毁方法(destory方法)


7.mvc的理解

MVC 是 Model-View-Controller 的简写。Model 代表的是应用的业务逻辑(通过JavaBean,EJB 组件实现), View 是应用的表示面(由 JSP 页面产生),Controller 是提供应用的处理过程控制(一般是一个 Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。


相关文章
|
1月前
|
SQL 监控 安全
Java Web应用的安全防护与攻防策略
Java Web应用的安全防护与攻防策略
|
4天前
|
开发框架 前端开发 Java
【前端学java】SpringBootWeb极速入门-实现一个简单的web页面01
【8月更文挑战第12天】SpringBootWeb极速入门-实现一个简单的web页面01
15 3
【前端学java】SpringBootWeb极速入门-实现一个简单的web页面01
|
6天前
|
Java
java.lang.ClassNotFoundException: org.springframework.web.filter.CharacterEncodingFilter 增样将jar包导入
文章记录了解决Java项目中遇到的`java.lang.ClassNotFoundException: org.springframework.web.filter.CharacterEncodingFilter`异常的方法,即通过在项目的`WEB-INF`文件夹下创建与`classes`平级的`lib`文件夹并添加所需的jar包来解决。
java.lang.ClassNotFoundException: org.springframework.web.filter.CharacterEncodingFilter 增样将jar包导入
|
6天前
|
安全 前端开发 Java
Web端系统开发解决跨域问题——以Java SpringBoot框架配置Cors为例
在Web安全上下文中,源(Origin)是指一个URL的协议、域名和端口号的组合。这三个部分共同定义了资源的来源,浏览器会根据这些信息来判断两个资源是否属于同一源。例如,https://www.example.com:443和http://www.example.com虽然域名相同,但由于协议和端口号不同,它们被视为不同的源。同源(Same-Origin)是指两个URL的协议、域名和端口号完全相同。只有当这些条件都满足时,浏览器才认为这两个资源来自同一源,从而允许它们之间的交互操作。
Web端系统开发解决跨域问题——以Java SpringBoot框架配置Cors为例
|
8天前
|
分布式计算 安全 Java
Java帝国的无限魅力:揭秘这门万能编程语言如何征服科技世界,从Web到太空探索,Java的触角无处不在!
【8月更文挑战第12天】随着信息技术的发展,编程语言成为科技核心。Java以其成熟与广泛应用,在众多语言中脱颖而出。它支持跨平台运行,实现“一次编写,处处运行”。Java的面向对象特性促进代码复用与维护,内置的安全机制保障系统安全。Java应用于Web开发、大数据处理、移动应用等多个领域,展现了其不可替代的价值。
20 1
|
11天前
|
jenkins 持续交付 开发工具
"引爆效率革命!Docker+Jenkins+GIT+Tomcat:解锁持续集成魔法,一键部署Java Web应用的梦幻之旅!"
【8月更文挑战第9天】随着软件开发复杂度的增加,自动化变得至关重要。本文通过实例展示如何结合Docker、Jenkins、Git与Tomcat建立高效的持续集成(CI)流程。Docker确保应用环境一致性;Jenkins自动化处理构建、测试和部署;Git管理源代码版本;Tomcat部署Web应用。在Jenkins中配置Git插件并设置项目,集成Docker构建Tomcat应用镜像并运行容器。此外,通过自动化测试、代码质量检查、环境隔离和日志监控确保CI流程顺畅,从而显著提高开发效率和软件质量。
34 3
|
8天前
|
Java Maven Windows
java -jar 启动 boot 程序 no main manifest attribute, in .\vipsoft-model-web-0.0.1-SNAPSHOT.jar
java -jar 启动 boot 程序 no main manifest attribute, in .\vipsoft-model-web-0.0.1-SNAPSHOT.jar
28 0
|
1月前
|
消息中间件 Java 微服务
构建可扩展的Java Web应用架构
构建可扩展的Java Web应用架构
|
21天前
|
Java UED
Java Web 中forward 和 redirect 的区别
在Java Web开发中,页面跳转是构建用户界面和实现业务逻辑的重要组成部分。Forward(转发)和Redirect(重定向)是两种常见的跳转方式,它们分别具有不同的特点和适用场景。正确地选择和使用这两种跳转方式,有助于提高Web应用的性能、用户体验和代码可维护性。
32 0
|
1月前
|
监控 负载均衡 Java
如何设计高可用性的Java Web应用程序
如何设计高可用性的Java Web应用程序

热门文章

最新文章