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

前 言
🍉 作者简介:半旧518,长跑型选手,立志坚持写10年博客,专注于java后端
☕专栏简介:纯手打总结面试题,自用备用
🌰 文章简介:java web最基础、重要的8道面试题

文章目录

      • 1.如何解决跨域问题
      • 2.Cookie和Session的区别
      • 3.Web容器的作用域
      • 4.拦截器、过滤器、监听器
      • 5.Post和Get的区别
      • 6.谈谈你对于servlet的认识
      • 7.mvc的理解

1.如何解决跨域问题

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

可以通过下面方法解决跨域问题:
跨域资源共享:服务端设置 Access-Control-Allow-Origin(spring使用使用@CrossOrigin注解即可实现)
微服务中使用gateway网关进行配置解决跨域问题
使用nginx代理:如果使用nginx实现反向代理,只需要修改其配置文件,使其支持所有浏览器,支持session

2.Cookie和Session的区别

相同:二者都是用来跟踪浏览器用户身份的会话方式
在这里插入图片描述

不同:
(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),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/3779.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SAP 系统中过账码or记账码

SAP中过账码和记账码是指同一个事物。 在实际业务中,记账码就是只有“借”和“贷”, 而SAP中Posting Code肩负着更多的任务: 1)界定科目类型, 2)借贷方向, 3)凭证输入时画面上的字…

运算放大器:电压比较器、电压跟随器、同相比例放大器

目录一、单限电压比较器二、滞回电压比较器三、窗口电压比较器四、正点原子直流电机驱动器电路分析实战1、电压采集电路2、电流采集电路3、过流检测电路Ⅰ、采用分压后的输入电压:Ⅱ、采用理想电压源的输入电压:Ⅲ、同相输入电压采用的是非理想电压源&am…

自考本科数据结构导论(02142)历年(应用题+算法题)真题汇总【20年4月-22年10月】

文章目录2020年4月应用题算法设计题2020年10月应用题算法设计题2021年4月应用题算法设计题2021年10月应用题算法设计题2022年4月应用题算法设计题2022年10月应用题算法设计题2020年4月 应用题 有二叉树如题29图所示,写出该二叉树的先序遍历、中序遍历和后序遍历序列。 如题…

AI真的快让我们失业了,从ChatGPT到Midjourney

参考文章: https://mp.weixin.qq.com/s/3RdHPPhYgDfB6KY6Y9Sk2A跟AI有关的新闻,一个接着一个。前一天你还和往常一样进入梦乡,第二天醒来就能被新的AI新闻“炸弹”震得心惊。 以ChatGPT为代表的AI语言模型,以Midjourney为代表的…

五、寄存器方式LED灯控制

寄存器方式LED灯控制 1、原理 电路图中相同网络标号表示它们是连接在一起,STM32F103ZET6的PC0-PC7 管脚连接D1-D8发光二极管阴极,如要使 D1 指示灯亮,只需控制 PC0 管脚输出低电平。 2、工程文件 Keil工程包含main.c、stm32f10x.h、start…

vue开发常用的工具有哪些

个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。座右铭:海不辞水,故能成其大;山不辞石,故能成其高。个人主页:小李会科技的…

开启新航路,拓尔思发力AIGC市场 | 爱分析调研

2022年,随着AI聊天机器人GhatGPT在世界范围内持续火爆,极具创意、表现力、个性化且能快速迭代的AIGC技术成功破圈,成为全民讨论热点。 AIGC是指在确定主题下,由算法模型自动生成内容,包括单模态内容如文本、图像、音频…

【Leetcode】队列的性质与应用

文章目录225. 用队列实现栈示例:提示:分析:题解:622. 设计循环队列示例:提示:分析:题解:225. 用队列实现栈 请你仅使用两个队列实现一个后入先出(LIFO)的栈&…

个人时间管理网站—Git项目管理

🌟所属专栏:献给榕榕🐔作者简介:rchjr——五带信管菜只因一枚😮前言:该专栏系为女友准备的,里面会不定时发一些讨好她的技术作品,感兴趣的小伙伴可以关注一下~👉文章简介…

面试官:如何保证接口幂等性?一口气说了9种方法!

本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~ Github地址 大家好,我是大彬~ 今…

idea 关于git使用总结分享

文章目录前言idea 关于git使用总结分享1. git 目录指定自己的git2. git 回滚到指定提交3. git 回滚某个文件4. 从远程仓库分支拉取最新代码5. 切换分支6. 上传到远程仓库7. git 关联上游服务8. 从上游分支拉取最新的代码9. 从上游仓库上取一个新的branch到远程仓库前言 如果您觉…

【LeetCode】二叉树的后序遍历(递归,迭代)

目录 题目要求:给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 方法一:递归 方法二:迭代 思路分析: 代码展示: 复杂度分析 方法三:迭代进阶 思路分析: 代码展示&a…

python玄阶斗技--tkinter库

目录 一.tkinter库介绍 二.功能实现 1.窗口创建 2.Button 按钮 3.Entry 文本输入域 4.text 文本框 5.Listbox 多选下拉框 6.Radiobutton 多选项按钮 7.Checkbutton 多选按钮 8.Scale 滑块(拉动条) 9.Scroolbar 滚动条 10.Menu 菜单栏 11. messagebox 消息框 12…

比肩ChatGPT的国产AI:文心一言——有话说

🔗 运行环境:chatGPT,文心一言 🚩 撰写作者:左手の明天 🥇 精选专栏:《python》 🔥 推荐专栏:《算法研究》 #### 防伪水印——左手の明天 #### 💗 大家好&am…

剑指offer-二维数组中的查找

文章目录题目描述题解一 无脑暴力循环题解二 初始二分法🌕博客x主页:己不由心王道长🌕! 🌎文章说明:剑指offer-二维数组中的查找🌎 ✅系列专栏:剑指offer 🌴本篇内容:对剑…

怎么设计一个秒杀系统

1、系统部署 秒杀系统部署要单独区别开其他系统单独部署,这个系统的流量肯定很大,单独部署。数据库也要单独用一个部署的数据库或者集群,防止高并发导致整个网站不可用。 2、防止超卖 100个库存,1000个人买,要保证不…

脉诊(切脉、诊脉、按脉、持脉)之法——入门篇

认识脉诊何谓脉诊?脉诊的渊源脉诊重要吗?脉诊确有其事,还是故弄玄虚?中医科学吗?如何脉诊?寸口脉诊法何谓脉诊? 所谓脉诊,就是通过把脉来诊断身体健康状况的一种必要手段。 …

ShowMeAI周刊 | AI独立开发者:帆船旅行但月入万刀;创业吧!新黄金时代来了;资本看好哪些创业方向;被AI震麻的一周again

这是ShowMeAI周刊的第8期。聚焦AI领域本周热点,及其在各圈层泛起的涟漪;拆解AI独立开发者的盈利案例,关注中美AIGC的创业者们,并提供我们的商业洞察。欢迎关注与订阅! | 👀日报&周刊合辑 ⌛ 『Danielle…

vue3 解决各场景 loading过度 ,避免白屏尴尬!

Ⅰ、前言 当我们每次打卡页面,切换路由,甚至于异步组件,都会有一个等待的时间 ;为了不白屏,提高用户体验,添加一个 loading 过度动画是 非常 常见的 ;那么这几种场景我们应该把 loading 加在哪…

JavaEE多线程-线程池

目录线程池Java标准库提供的线程池线程池的实现线程池 线程池和和字符串常量池, 数据库连接池一样, 都是为了提高程序的运行效率, 减少开销。 随着并发程度的提高, 当我们去频繁的创建和销毁线程, 此时程序的开销还是挺大的, 为了进一步提高效率, 就引入了线程池, 程序中所创建…