一、jsp 和 servlet 有什么区别?
Servlet:
- 一种服务器端的Java应用程序
- 由 Web 容器加载和管理
- 用于生成动态 Web 内容
- 负责处理客户端请求
Jsp:
- 是 Servlet 的扩展,本质上还是 Servlet
- 每个 Jsp 页面就是一个 Servlet 实例
- Jsp 页面会被 Web 容器编译成 Servlet,Servlet 再负责响应用户请求
区别: Servlet 适合动态输出 Web 数据和业务逻辑处理,对于 html 页面内容的修改非常不方便;Jsp 是在 Html 代码中嵌入 Java 代码,适合页面的显示内置对象不同,获取内置对象的方式不同
二、jsp 有哪些内置对象?作用分别是什么?
- request:客户端请求,此请求会包含GET/POST请求的参数(request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie,header和session数据的有用的方法。)
- response:网页传回客户端的回应(response表示HttpServletResponse对象,并提供了几个用于设置送回浏览器的响应的方法(如cookies,头信息等)。)
- pageContext:网页的属性是在这里管理(pageContext表示一个javax.servlet.jsp.PageContext对象,它是用于方便存取各种范围的名字空间,servlet相关的对象API,并且包装了通用的servlet相关功能的方法。)
- session:请求有关的会话期(session表示一个请求的javax.servlet.http.HttpSession对象,Session可以存储用户的状态信息。)
- application servlet正在执行的内容(application表示一个javax.servlet.ServletContext对象,这有助于查询有关servlet引擎和servlet环境的信息。)
- out:用来传送回应的输出(out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。)
- config servlet的架构部分(config表示一个javax.servlet.ServletConfig对象,该对象用于存取servlet实例的初始化参数。)
- page jsp 页面网页本身(page表示从该页面产生的一个servlet实例。)
- exception:针对错误网页,未捕捉的例外
拓展JSP共有以下6种基本动作:
- jsp:include:在页面被请求的时候引入一个文件。
- jsp:useBean:寻找或者实例化一个JavaBean。
- jsp:setProperty:设置JavaBean的属性。
- jsp:getProperty:输出某个JavaBean的属性。
- jsp:forward:把请求转到一个新的页面。
- jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记
三、说一下 jsp 的 4 种作用域?
- appl ication 作用域: 如果把变量放到application里,就说明它的作用域是application,它的有效范围是整个应用。整个应用是指从应用启动,到应用结束。application作用域里的变量,它们的存活时间是最长的,如果不进行手工删除,它们就一直可以使用。
- Object getAttribute(String name) //从application中获取信息;
- void setAttribute(String name,Object value) //向application作用域中设置信息。
- session作用域 :如果把变量放到session里,就说明它的作用域是session,它的有效范围是当前会话。所谓当前会话,就是指从用户打开浏览器开始,到用户关闭浏览器这中间的过程。
- Object HttpSession.getAttribute(String name) //从session中获取信息。
- void HttpSession.setAttribute(String name,Object value)//向session中保存信息。
- HttpSessionHttpServletRequest.getSessio() //获取当前请求所在的session的对象。
- void setMaxInactiveInterval(int interval)//默认值
- 如果想主动让会话结束,例如用户单击“注销”按钮的时候,可以使用 HttpSession 的 invalidate()方法,用于强制结束当前session:void invalidate()
- Session删除的时间是:
- Session超时:超时指的是连续一定时间服务器没有收到该Session所对应客户端的请求,并且这个时间超过了服务器设置的Session超时的最大时间。
- 程序调用HttpSession.invalidate()
- 服务器关闭或服务停止
- 注意:
- 访问*.html的静态资源因为不会被编译为Servlet,也就不涉及session的问题。
- 当JSP页面没有显式禁止session的时候,在打开浏览器第一次请求该jsp的时候,服务器会自动为其创建一个session,并赋予其一个sessionID,发送给客户端的浏览器。
- 由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。
- session不会应该浏览器的关闭而删除,只能通过以上三种方式删除。
- session存放在哪里?-----------服务器端的内存中。
- Request作用域 :request里的变量可以跨越forward前后的两页。但是只要刷新页面,它们就重新计算了。
- 请求转发:servlet. getRequestDispatcher("new.jsp").forward(req,resp);
- 注意:
- 转发是服务器行为,而重定向是客户端行为。
- 无论在服务器上如何转发,浏览器地址栏中显示的仍然是最初那个Servlet的地址
- page作用域 :page对象的作用范围仅限于用户请求的当前页面
- request和page的生命周期都是短暂的,它们之间的区别:一个request可以包含多个page页(include,forward及filter)。
四、session 和 cookie 有什么区别?
- 存储位置不同
- cookie的数据信息存放在客户端浏览器上。
- 2session的数据信息存放在服务器上。
- 存储容量不同
- 单个cookie保存的数据<=4KB,一个站点最多保存20个Cookie。
- 对于session来说并没有上限,但出于对服务器端的性能考虑,session内不要存放过多的东西,并且设置session删除机制。
- 存储方式不同
- cookie中只能保管ASCII字符串,并需要通过编码方式存储为Unicode字符或者二进制数据。
- session中能够存储任何类型的数据,包括且不限于string,integer,list,map等。
- 隐私策略不同
- cookie对客户端是可见的,别有用心的人可以分析存放在本地的cookie并进行cookie欺骗,所以它是不安全的。
- session存储在服务器上,对客户端是透明对,不存在敏感信息泄漏的风险。
- 有效期上不同
- 开发可以通过设置cookie的属性,达到使cookie长期有效的效果。
- session依赖于名为JSESSIONID的cookie,而cookie JSESSIONID的过期时间默认为-1,只需关闭窗口该session就会失效,因而session不能达到长期有效的效果。
- 服务器压力不同
- cookie保管在客户端,不占用服务器资源。对于并发用户十分多的网站,cookie是很好的选择。
- session是保管在服务器端的,每个用户都会产生一个session。假如并发访问的用户十分多,会产生十分多的session,耗费大量的内存。
- 浏览器支持不同
- 假如客户端浏览器不支持cookie:
- 运用session需要使用URL地址重写的方式。一切用到session程序的URL都要进行URL地址重写,否则session会话跟踪还会失效。
- cookie是需要客户端浏览器支持的,假如客户端禁用了cookie,或者不支持cookie,则会话跟踪会失效。关于WAP上的应用,常规的cookie就派不上用场了。
- 假如客户端支持cookie:
- session只能在本窗口以及子窗口内有效。
- cookie既能够设为本浏览器窗口以及子窗口内有效,也能够设为一切窗口内有效。
- 假如客户端浏览器不支持cookie:
- 跨域支持上不同
- cookie支持跨域名访问。
- session不支持跨域名访问。
五、说一下 session 的工作原理?
session 的工作原理是客户端登录完成之后,服务器会创建对应的 session,session 创建完之后,会把 session 的 id 发送给客户端,客户端再存储到浏览器中。这样客户端每次访问服务器时,都会带着 sessionid,服务器拿到 sessionid 之后,在内存找到与之对应的 session 这样就可以正常工作了。
六、如果客户端禁止 cookie 能实现 session 还能用吗?
一般默认情况下,在会话中,服务器存储 session 的 sessionid 是通过 cookie 存到浏览器里;如果浏览器禁用了 cookie,浏览器请求服务器无法携带 sessionid,服务器无法识别请求中的用户身份,session失效。但是可以通过其他方法在禁用 cookie 的情况下,可以继续使用session。如:
- 通过url重写,把 sessionid 作为参数追加的原 url 中,后续的浏览器与服务器交互中携带 sessionid 参数;
- 服务器的返回数据中包含 sessionid,浏览器发送请求时,携带 sessionid 参数。
- 通过 Http 协议其他 header 字段,服务器每次返回时设置该 header 字段信息,浏览器中 js 读取该 header 字段,请求服务器时,js设置携带该 header 字段。
七、spring mvc 和 struts 的区别是什么?
- Struts是类级别的拦截,SpringMVC是方法级别的拦截
- SpringMVC更适合更容易实现REST风格
- SpringMVC的方法之间基本上独立的,独享request和response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架,方法之间不共享变量。而Struts2虽然方法之间也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码读程序时带来麻烦。
八、如何避免 sql 注入?
- 遵循编程规范,首先执行预编译,随后再填写参数,这样参数会替换掉编译好的语句中的?占位符,最后执行完整的sql语句。
- 使用存储过程:存储过程(Stored Procedure)是一组完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过调用存储过程并给定参数(如果该存储过程带有参数)就可以执行它,也可以避免SQL注入攻击
- mybatis半自动持久化框架,其底层原理也是预编译,参数替换占位符?
注意:
在编写MyBatis的映射语句时,尽量采用“#{xxx}”这样的格式。若不得不使用“${xxx}”这样的参数,要手工地做好过滤工作,来防止SQL注入攻击。
- #{}:相当于JDBC中的PreparedStatement
- ${}:是输出变量的值
简单说,#{}是经过预编译的,是安全的;${}是未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入。
九、什么是 XSS 攻击,如何避免?
**XSS 攻击,即跨站脚本攻击(Cross Site Scripting),它是 web 程序中常见的漏洞。 **
原理:攻击者往 web 页面里插入恶意的 HTML 代码(Javascript、css、html 标签等),当用户浏览该页面时,嵌入其中的 HTML 代码会被执行,从而达到恶意攻击用户的目的。如盗取用户 cookie 执行一系列操作,破坏页面结构、重定向到其他网站等。
种类:
- DOM Based XSS:基于网页 DOM 结构的攻击
- input 标签 value 属性赋值
- 利用 a 标签的 href 属性的赋值
- image 标签 src 属性,onload、onerror、onclick 事件中注入恶意代码
- Stored XSS:存储式XSS漏洞
预防思路:
- web 页面中可由用户输入的地方,对输入的数据转义、过滤处理;
- 后台输出页面的时候,也需要对输出内容进行转义、过滤处理(因为攻击者可能通过其他方式把恶意脚本写入数据库)
- 前端对 html 标签属性、css 属性赋值的地方进行校验
十、什么是 CSRF 攻击,如何避免?
跨站请求伪造 (英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding ,通常缩写为 **CSRF ** 或者 XSRF , 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟 XSS 相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。
攻击细节:
跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的 。
防御措施:
- 检查Referer字段
- HTTP头中有一个Referer字段,这个字段用以标明请求来源于哪个地址。在处理敏感数据请求时,通常来说,Referer字段应和请求的地址位于同一域名下
- 这种办法简单易行,工作量低,仅需要在关键访问处增加一步校验。但这种办法也有其局限性,因其完全依赖浏览器发送正确的Referer字段。虽然http协议对此字段的内容有明确的规定,但并无法保证来访的浏览器的具体实现,亦无法保证浏览器没有安全漏洞影响到此字段。并且也存在攻击者攻击某些浏览器,篡改其Referer字段的可能。
- 添加校验token
- 由于CSRF的本质在于攻击者欺骗用户去访问自己设置的地址,所以如果要求在访问敏感数据请求时,要求用户浏览器提供不保存在cookie中,并且攻击者无法伪造的数据作为校验,那么攻击者就无法再运行CSRF攻击。这种数据通常是窗体中的一个数据项。服务器将其生成并附加在窗体中,其内容是一个伪随机数。当客户端通过窗体提交请求时,这个伪随机数也一并提交上去以供校验。正常的访问时,客户端浏览器能够正确得到并传回这个伪随机数,而通过CSRF传来的欺骗性攻击中,攻击者无从事先得知这个伪随机数的值,服务端就会因为校验token的值为空或者错误,拒绝这个可疑请求。
注:以上内容仅提供参考和交流,请勿用于商业用途,如有侵权联系本人删除!
注:此博客只是为了记忆相关知识点,大部分为网络上的文章,在此向各个文章的作者表示感谢!
标题:Java 常见的面试题(Java Web)
作者:wangjing
地址:https://www.codedblogs.cn/articles/2024/04/12/1712887477405.html