粗略了解JSP的相关基本知识及面试题

 

目录

一:JSP语法:

二:JSP九大内置对象)

三:jsp的四种作用域

四:请求转发与响应重定向

1):请求转发

2):重定向

​forward和redirect的区别?

五:cookie和session

1):cookie

2):session

3):cookie和session结合使用:

4):cookie与session的区别

六:相关面试题

1):jsp和servlet有什么区别?

2):客户端禁止cookie,session还能用吗?

3):http响应码301和302代表的是什么?有什么区别?

4):get和post请求有哪些区别?

5):如何实现跨域?


一:JSP语法:

<%
        局部变量,java语句 
       %>

      <%!
      全局变量,定义方法
      %>

      <%=输出表达式%>

二:JSP九大内置对象)

pageContext  JSP页面容器
       request   请求对象
       session   会话对象
       appliation 全局对象
       response  响应对象

config  配置对象(服务器配置信息)
       out    输出对象
       page   当前JSP页面对象(相当于java中的this)
       exception 异常对象

  1. request:对应 Java 类 javax.servlet.http.HttpServletRequest(HttpServletRequest的实例);客户端的请求信息:Http协议头信息、Cookie、请求参数等
  2. respons:对应 Java 类 javax.servlet.http.HttpServletRespons(HttpServletResponse的实例);用于服务端响应客户端请求,返回信息
  3. pageContext:对应 Java 类 javax.servlet.jsp.PageContext(PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问);页面的上下文
  4. session:对应 Java 类 javax.servlet.http.HttpSession(HttpSession类的实例);客户端与服务端之间的会话
  5. application:对应 Java 类 javax.servlet.ServletContext(ServletContext类的实例,与应用上下文有关);用于获取服务端应用生命周期的信息
  6. out:对应 Java 类 javax.servlet.jsp.JspWriter(PrintWriter类的实例,用于把结果输出至网页上);用于服务端传输内容到客户端的输出流
  7. config:对应 Java 类 javax.servlet.ServletConfig(ServletConfig类的实例);初始化时,Jsp 引擎向 Jsp 页面传递的信息
  8. pag(类似于Java类中的this关键字):对应 Java 类 java.lang.Object;指向 Jsp 页面本身
  9. exception:对应 Java 类 java.lang.Throwabl(Exception类的对象,代表发生错误的JSP页面中对应的异常对象);页面发生异常,产生的异常对象

三:jsp的四种作用域

  1. pageContext(当前页面作用域):相当于 Java 关键字中 this。在这个作用域中存放的属性值,只能在当前页面中取出。
  2. request(请求作用域):范围是从请求创建到请求消亡这段时间,一个请求可以涉及的多个页面。<jsp:forward>和<jsp:include>跳转到其他页面,也在作用域范围。
  3. session(会话作用域):范围是一段客户端和服务端持续连接的时间,用户在会话有效期内多次请求所涉及的页面。seesion会话器,服务端为第一次建立连接的客户端分配一段有效期内的属性内存空间。
  4. application(全局作用域):范围是服务端Web应用启动到停止,整个Web应用中所有请求所涉及的页面。当服务器开启时,会创建一个公共内存区域,任何客户端都可以在这个公共内存区域存取值。

      四种范围对象(由小到大)

           pageContext ,,,  request ... session ...  application

四:请求转发与响应重定向

1):请求转发

request.getRequestDispatcher(URL地址).forward(request, response)

处理流程:

  1. 客户端发送请求,Servlet做出业务逻辑处理。
  2. Servlet调用forword()方法,服务器Servlet把目标资源返回给客户端浏览器。

2):重定向

response.sendRedirect(URL地址)

处理流程:

  1. 客户端发送请求,Servlet做出业务逻辑处理。
  2. Servlet调用response.sendReadirect()方法,把要访问的目标资源作为response响应头信息发给客户端浏览器。
  3. 客户端浏览器重新访问服务器资源xxx.jsp,服务器再次对客户端浏览器做出响应。


forward和redirect的区别?

  • 浏览器 url 地址显示不同

服务端通过 forward 返回,浏览器 url 地址不会发生变化;服务器通过 redirect 返回,浏览器会重新请求, url 地址会发生变化

  • 前后台两者页面跳转的处理方式不同

 forward 跳转页面,是服务端进行页面跳转加载(include)新页面,直接返回到浏览器;redirect 跳转页面,是服务端返回新的 url 地址,浏览器二次发出 url 请求

  • 参数携带情况不一样

forward 跳转页面,会携带请求的参数到新的页面;redirect 跳转页面,属于一次全新的 http 请求,无法携带上一次请求的参数

  • http 请求次数不同

forward 1次;redirect 2次

以一个例子再理解一下请求转发与重定向:

转发:  
    张三(客户端)     ->    【 服务窗口 A (服务端 )    ->  服务窗口B  】


重定向:
    张三(客户端)       ->     服务窗口 A (服务端 ) ->去找B

    张三(客户端)    ->     服务窗口 B (服务端 ) ->结束

五:cookie和session

1):cookie

        位于用户的计算机上,用来维护用户计算机中的信息,直到用户删除。比如我们在网页上登录某个软件时输入用户名及密码时如果保存为cookie,则每次我们访问的时候就不需要登录网站了。我们可以在浏览器上保存任何文本,而且我们还可以随时随地的去阻止它或者删除。我们同样也可以禁用或者编辑cookie,但是有一点需要注意不要使用cookie来存储一些隐私数据,以防隐私泄露

在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。

cookie的出现就是为了解决这个问题,第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4KB。因此使用cookie只能存储一些小量的数据。

cookie的注意事项:

a.服务端增加cookie :response对象;客户端获取对象:request对象
        b.不能直接获取某一个单独对象,只能一次性将 全部的cookie拿到

通过F12可以发现  除了自己设置的Cookie对象外,还有一个name为 JSESSIONID的cookie

Cookie:
       a.不是内置对象,要使用必须new
        b.但是,服务端会自动生成一个(服务端自动new一个cookie) name=JSESIONID的cookie  并返回给客户端

2):session

       session称为会话信息,位于web服务器上,主要负责访问者与网站之间的交互,当访问浏览器请求http地址时,将传递到web服务器上并与访问信息进行匹配, 当关闭网站时就表示会话已经结束,网站无法访问该信息了,所以它无法保存永久数据,我们无法访问以及禁用网站

session和cookie的作用有点类似,都是为了存储用户相关的信息。

不同的是,cookie是存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,但现在服务器已经发展至今,一些session信息还是绰绰有余的。

session机制:

        客户端第一次请求服务端时,(jsessionid-sessionid)服务端会产生一个session对象(用于保存该客户的信息); 
并且每个session对象 都会有一个唯一的 sessionId( 用于区分其他session);
         服务端就会 产生一个cookie,并且 该cookie的name=JSESSIONID ,value=服务端sessionId的值;
然后 服务端会在 响应客户端的同时 将该cookie发送给客户端,至此 客户端就有了 一个cookie(JSESSIONID);
因此,客户端的cookie就可以和服务端的session一一对应(JSESSIONID - sessionID)

          客户端第二/n次请求服务端时:服务端会先用客户端cookie种的JSESSIONID  去服务端的session中匹配sessionid,如果匹配成功(cookie  jsessionid和sesion sessionid),说明此用户 不是第一次访问,无需登录;

      通过例子更好的理解一下session的工作机制:

     顾客(客户端)
     服务端: 存包处   -  商场(服务端)

       顾客第一次存包:商场 判断此人是 之前已经存过包(通过你手里是否有钥匙)。
  如果是新顾客(没钥匙) ,分配一个钥匙 给该顾客; 钥匙 会和 柜子 一一对应;

       第二/n次 存包:商场 判断此人是 之前已经存过包(通过你手里是否有钥匙)
 如果是老顾客(有钥匙),则不需要分配;该顾客手里的钥匙 会 和柜子 自动一一对应。


      session的注意事项:

a. session存储在服务端
b. session是在 同一个用户(客户)请求时 共享
c. 实现机制:第一次客户请求时 产生一个sessionid 并复制给 cookie的jsessionid 然后发给客户端。最终 通过session的sessionid-cookie的jsessionid

3):cookie和session结合使用:

web开发发展至今,cookie和session的使用已经出现了一些非常成熟的方案。在如今的市场或者企业里,一般有两种存储方式:

1、存储在服务端:通过cookie存储一个session_id,然后具体的数据则是保存在session中。如果用户已经登录,则服务器会在cookie中保存一个session_id,下次再次请求的时候,会把该session_id携带上来,服务器根据session_id在session库中获取用户的session数据。就能知道该用户到底是谁,以及之前保存的一些状态信息。这种专业术语叫做server side session。

2、将session数据加密,然后存储在cookie中。这种专业术语叫做client side session。flask采用的就是这种方式,但是也可以替换成其他形式。

4):cookie与session的区别

  • session 是在服务器端记录信息;cookie 是在浏览器端记录信息
  • session 保存的数据大小取决于服务器的程序设计,理论值可以做到不限;单个 cookie 保存的数据大小不超过4Kb,大多数浏览器限制一个站点最多20个cookie
  • session 可以被服务器的程序处理为 key - value 类型的任何对象;cookie 则是存在浏览器里的一段文本
  • session 由于存在服务器端,安全性高;浏览器的 cookie 可能被其他程序分析获取,所以安全性较低
  • 大量用户会话服务器端保存大量 session 对服务器资源消耗较大;信息保存在 cookie 中缓解了服务器存储用信息的压力
  • session保存的是Object,而cookie保存的是String

下面看几道面试题了解一下:

六:相关面试题

1):jsp和servlet有什么区别?

Servlet

  • 一种服务器端的Java应用程序
  • 由 Web 容器加载和管理
  • 用于生成动态 Web 内容
  • 负责处理客户端请求

     

Jsp

  • 是 Servlet 的扩展,本质上还是 Servlet
  • 每个 Jsp 页面就是一个 Servlet 实例
  • Jsp 页面会被 Web 容器编译成 Servlet,Servlet 再负责响应用户请求

     
区别

  • Servlet 适合动态输出 Web 数据和业务逻辑处理,对于 html 页面内容的修改非常不方便;Jsp 是在 Html 代码中嵌入 Java 代码,适合页面的显示
  • 内置对象不同,获取内置对象的方式不同

2):客户端禁止cookie,session还能用吗?

       一般默认情况下,在会话中,服务器存储 session 的 sessionid 是通过 cookie 存到浏览器里。

    如果浏览器禁用了 cookie,浏览器请求服务器无法携带 sessionid,服务器无法识别请求中的用户身份,session失效。

    但是可以通过其他方法在禁用 cookie 的情况下,可以继续使用session。

  • 通过url重写,把 sessionid 作为参数追加的原 url 中,后续的浏览器与服务器交互中携带 sessionid 参数。
  • 服务器的返回数据中包含 sessionid,浏览器发送请求时,携带 sessionid 参数。
  • 通过 Http 协议其他 header 字段,服务器每次返回时设置该 header 字段信息,浏览器中 js 读取该 header 字段,请求服务器时,js设置携带该 header 字段。

3):http响应码301和302代表的是什么?有什么区别?

301 Moved Permanently

被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。

302 Found

请求的资源现在临时从不同的 URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。

 

当网站迁移或url地址进行调整时,服务端需要重定向返回,保证原请求自动跳转新的地址。

http 协议的 301 和 302 状态码都代表重定向。浏览器请求某url收到这两个状态码时,都会显示和跳转到 Response Headers 中的Location。即在浏览器地址输入 url A,却自动跳转到url B。

 

区别:

  • 301 表示被请求 url 永久转移到新的 url;302 表示被请求 url 临时转移到新的 url。
  • 301 搜索引擎会索引新 url 和新 url 页面的内容;302 搜索引擎可能会索引旧 url 和 新 url 的页面内容。
  • 302 的返回码可能被别人利用,劫持你的网址。因为搜索引擎索引他的网址,他返回 302 跳转到你的页面。

4):get和post请求有哪些区别?

  • GET 安全;POST 不安全
  • GET 幂等;POST 不幂等
  • GET 可缓存;POST 不可缓存
  • GET 用于信息获取;POST 表示可能修改变服务器上的资源的请求

这里的安全是指,GET 只读服务器数据不会修改; 幂等简单理解就是每次请求结果和产生的影响都一样。

5):如何实现跨域?

跨域:当浏览器执行脚本时会检查是否同源,只有同源的脚本才会执行,如果不同源即为跨域。

  • 这里的同源指访问的协议、域名、端口都相同。
  • 同源策略是由 Netscape 提出的著名安全策略,是浏览器最核心、基本的安全功能,它限制了一个源中加载脚本与来自其他源中资源的交互方式。
  • Ajax 发起的跨域 HTTP 请求,结果被浏览器拦截,同时 Ajax 请求不能携带与本网站不同源的 Cookie。
  • script、img、iframe、link、video、audio 等带有 src 属性的标签可以从不同的域加载和执行资源。 

如当使用 ajax 提交非同源的请求时,浏览器就会阻止请求。提示
Access to XMLHttpRequest at '...' from origin '...' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

 

如何实现跨域请求呢?

1、jsonp
利用了 script 不受同源策略的限制
缺点:只能 get 方式,易受到 XSS攻击

2、CORS(Cross-Origin Resource Sharing),跨域资源共享
当使用XMLHttpRequest发送请求时,如果浏览器发现违反了同源策略就会自动加上一个请求头 origin;
后端在接受到请求后确定响应后会在后端在接受到请求后确定响应后会在 Response Headers 中加入一个属性 Access-Control-Allow-Origin;
浏览器判断响应中的 Access-Control-Allow-Origin 值是否和当前的地址相同,匹配成功后才继续响应处理,否则报错
缺点:忽略 cookie,浏览器版本有一定要求

3、代理跨域请求
前端向发送请求,经过代理,请求需要的服务器资源
缺点:需要额外的代理服务器

4、Html5 postMessage 方法
允许来自不同源的脚本采用异步方式进行有限的通信,可以实现跨文本、多窗口、跨域消息传递
缺点:浏览器版本要求,部分浏览器要配置放开跨域限制

5、修改 document.domain 跨子域
相同主域名下的不同子域名资源,设置 document.domain 为 相同的一级域名
缺点:同一一级域名;相同协议;相同端口

6、基于 Html5 websocket 协议
websocket 是 Html5 一种新的协议,基于该协议可以做到浏览器与服务器全双工通信,允许跨域请求
缺点:浏览器一定版本要求,服务器需要支持 websocket 协议

7、document.xxx + iframe
通过 iframe 是浏览器非同源标签,加载内容中转,传到当前页面的属性中
缺点:页面的属性值有大小限制

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值