`

jsp转发重定向-乱码问题-路径问题-session和cookie

 
阅读更多

一.转发和重定向区别

1RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect 方法不仅可以重定向到当前应用程序中的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。如果传递给HttpServletResponse.sendRedirect 方法的相对URL以“/”开头,它是相对于整个WEB站点的根目录;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录。总之,转发是服务器内部的转发,只能在同一个web项目中使用。重定向可以跳转到本网站的其他页面,也可跳转到任何其他网站。

2)调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;而调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。

3RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。对于同一个WEB应用程序的内部资源之间的跳转,特别是跳转之前要对请求进行一些前期预处理,并要使用HttpServletRequest.setAttribute方法传递预处理结果,那就应该使用RequestDispatcher.forward方法。不同WEB应用程序之间的重定向,特别是要重定向到另外一个WEB站点上的资源的情况,都应该使用HttpServletResponse.sendRedirect方法。也就是转发属于同一个请求响应,而重定向相当于两次请求响应.

例子:HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求,这个过程好比有个绰号叫“浏览器”的人写信找张三借钱,张三回信说没有钱,让“浏览器”去找李四借,并将李四现在的通信地址告诉给了“浏览器”。于是,“浏览器”又按张三提供通信地址给李四写信借钱,李四收到信后就把钱汇给了“浏览器”。可见,“浏览器”一共发出了两封信和收到了两次回复,“浏览器”也知道他借到的钱出自李四之手。RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。这个过程好比绰号叫“浏览器”的人写信找张三借钱,张三没有钱,于是张三找李四借了一些钱,甚至还可以加上自己的一些钱,然后再将这些钱汇给了“浏览器”。可见,“浏览器”只发出了一封信和收到了一次回复,他只知道从张三那里借到了钱,并不知道有一部分钱出自李四之手。

4)无论是RequestDispatcher.forward方法,还是HttpServletResponse.sendRedirect方法,在调用它们之前,都不能有内容已经被实际输出到了客户端。如果缓冲区中已经有了一些内容,这些内容将被从缓冲区中清除。

 

二.sessioncookie的区别

().session采用两种方式实现。包括cookiesurl重写。

1.session的生命周期:只要启动第一个请求,session就会产生。当浏览器关闭时并没有立即失效。(因为Http是无状态的协议,不会告诉服务器我关闭了。)。可以通过两种方式,一、通过设置过期时间。二、通过强制退出。session.invalidate()

 

2.默认采用cookies方式。 cookies被禁用以后。每次刷新页面产生的都是新的sessionid.

 

3.url重写方式,需要我们手动在地址后边加上jsessionid=随机产生的sessionid

由于session在第一个请求时就产生了。第一次就会产生sessionid。这是的session.isNew()才会返回为true.那么在次session范围内的其他请求时,session.isNew()都为false.

(二).JSP cookie应用小结

Cookie主要有两种:会话cookie和持久cookie

正常的cookie只能在一个应用中共享,即一个cookie只能由创建它的应用获得。

1.可在同一应用服务器内共享方法:设置cookie.setPath("/");

    本机tomcat/webapp下面有两个应用:caswebapp_b

    1)原来在cas下面设置的cookie,在webapp_b下面获取不到,path默认是产生cookie的应用的路径。

    2)若在cas下面设置cookie的时候,增加一条cookie.setPath("/");或者cookie.setPath("/webapp_b/");就可以在webapp_b下面获取到cas设置的cookie了。

    3)此处的参数,是相对于应用服务器存放应用的文件夹的根目录而言的(比如tomcat下面的webapp),因此cookie.setPath("/");之后,可以在webapp文件夹下的所有应用共享cookie,而cookie.setPath("/webapp_b/");是指cas应用设置的cookie只能在webapp_b应用下的获得,即便是产生这个cookiecas应用也不可以。

    4)设置cookie.setPath("/webapp_b/jsp")或者cookie.setPath("/webapp_b/jsp/")的时候,只有在webapp_b/jsp下面可以获得cookie,在webapp_b下面但是在jsp文件夹外的都不能获得cookie

    5)设置cookie.setPath("/webapp_b");,是指在webapp_b下面才可以使用cookie,这样就不可以在产生cookie的应用cas下面获取cookie

    6)有多条cookie.setPath("XXX");语句的时候,起作用的以最后一条为准。

    6)设置多个path的方法???

 

2.跨域共享cookie的方法:设置cookie.setDomain(".jszx.com");

    A机所在的域:home.langchao.com,A有应用cas

    B机所在的域:jszx.comB有应用webapp_b

    1)在cas下面设置cookie的时候,增加cookie.setDomain(".jszx.com");,这样在webapp_b下面就可以取到cookie

    2)这个参数必须以“.”开始。

    3)输入url访问webapp_b的时候,必须输入域名才能解析。比如说在A机器输入:http://lc-bsp.jszx.com:8080/webapp_b,可以获取cas在客户端设置的cookie,而B机器访问本机的应用,输入:http://localhost:8080/webapp_b则不可以获得cookie

    4)设置了cookie.setDomain(".jszx.com");,还可以在默认的home.langchao.com下面共享。

    5)设置多个域的方法???

 

二、读取

从客户端读取Cookie时调用的是HttpServletRequestgetCookies方法。该方法返回一个与HTTP请求头中的内容对应的Cookie对象数组。得到这个数组之后,一般是用循环访问其中的各个元素,调用getName检查各个Cookie的名字,直至找到目标Cookie。然后对这个目标Cookie调用getValue,根据获得的结果进行其他处理。

注意:若JSPServlet所在目录(Servlet为其映射目录)的父目录中有同名cookie,则request.getCookie()方法得到的Cookie数组中保存的是其父目录中的cookie的信息;

 

 

三、显示“网页已过期”是可能因为在回退的时候部分session信息已经丢失

如何在WEB应用程序中实现“网页已经过期”的功能

区别:(1)、session保存在服务器,客户端不知道其中的信息;cookie保存在客户端,服务器能够知道其中的信息。  

   

  2)、session中保存的是对象,cookie中保存的是字符串。  

   

  3)、session不能区分路径,同一个用户在访问一个网站期间,所有的session在任何一个地方都可以访问到。

cookie中如果设置了路径参数,那么同一个网站中不同路径下的cookie互相是访问不到的。

 

 

三.路径问题:

jsp中经常会遇到路径的问题,出现404的错误或者是图片无法显示.

这个问题可以从以下几个方面来解决:

    1 链接或表单提交的路径

    2 重定向和转发的路径

    3 MyEclipsejsp的两种模板advanced  base Templates的路径问题

以下为解决之道

表单提交和链接都是从客户端请求而来
  /
指的Tomcat的根目录,写绝对路径应该写成"/当前Web程序根名称/资源名"/WebModule1/jsp1.jsp","/bbs/servlet/MyServlet"

重定向和转发的路径问题
  
写相对路径重定向和转发没有区别
  
  
重定向response.sendRedirect("")是服务器向客户端发送一个请求头信息,由客户端再请求一次服务器.因此情况同上述1的一样,

  转发是在服务器内部进行的,写绝对路径/开头指的是当前的Web应用程序.绝对路径写法就是"/jsp1.jsp""/servlet/MyServlet"


  
总结:以上两点要注意是区分是从服务器外的请求,还在是内部转发,从服务器外的请求,Tomcat根写起(就是要包括当前Web的根),是服务器内部的转发,很简单了,因为在当前服务器内,/写起指的就是当前Web的根.

MyEclispe中的JSP的两种模板,一种是Advanced,一种是Basic
  
两者的区别也会涉及到路径问题,如图片的路径,链接的路径

  
  Advanced Template
中页面的代码多了以下代码:
  <%
      String path = request.getContextPath();
      String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  %>

   <base href="<%=basePath%>">

其中<base href="<%=basePath%>">必须放在<head></head>

这段代码的作用是设置基础路径的,basepath为变量.<base href="">标签的用处是解决编程时候的相对路径问题.

设置了<base href="<%=basePath%>">
页面上图片,链接的路径指的都是当前应用程序的根路径下.

当然,这个base还有一个用法,如在head部分加上这么一行: <base href="_blank"> ,就是默认所有链接在新窗口打开。


按以上方法可解决所有的路径问题.

四.中文乱码问题:

在提交页面时,中文可能出现乱码

 

可能解决办法:

在提交时设置request.setCharacterEncoding("gbk");// Post请求时使用

                  

         手动转码://get请求时使用,post请求也可

                     String username=request.getparameter("id");

                            username=new String(username.getBytes("iso-8859-1"));

         响应给用户时,也就是显示信息时:

                   response.setCharacterEncoding("gbk");

                   在转化为gbk

                            username=new String(username.getByte("gbk"));

 

原因:tomcat默认使用的是iso-8859-1的编码格式。post请求是以表单提交的方式,可以被request.setCharacterEncoding("gbk");捕获到,进行转码。

request.setCharacterEncoding("gbk")对于get请求没有作用,get请求是以报头的内容发送的。使用的还是iso-8859-1的编码格式。所以必须手动转码,

或者在tomcat下的server.xml中进行设置 <Connector port="8080"

maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

enableLookups="false" redirectPort="8443" acceptCount="100"

debug="0" connectionTimeout="20000" useBodyEncodingForURI="true"

disableUploadTimeout="true" URIEncoding=UTF-8/>:此方法不一定有用

分享到:
评论

相关推荐

    2.JSP实现数据传递和保存.pptx

    * 转发和重定向的区别在于,转发是将请求转发到另一个资源,而重定向是将请求重定向到另一个资源。 中文乱码 * 中文乱码是指在网页上显示中文时出现乱码的情况。 * 中文乱码的解决方法是设置请求和响应的编码方式...

    java/jsp面试红宝书

    以上内容涵盖了Java/JSP面试中的核心知识点,包括Web应用结构、Servlet生命周期、乱码处理、会话管理、资源包含以及请求转发与重定向等,有助于准备面试者深入理解Java Web开发的基本概念和技术要点。

    初级jsp+Servlet1-8章知识复习

    【初级jsp+Servlet1-8章知识复习】涵盖了Java Web开发中的基础概念和技术,主要针对初学者进行复习。以下是对这些知识点的详细说明: 1. **动态网页的基础**: - **网页文件格式**:包括.html (HTML 文件),.jsp ...

    达内servlet/jsp/jquery资料

    - 相对路径和绝对路径的使用需要注意,避免出现找不到资源的问题。 ### 23. 过滤器 - **过滤器** 是一种可以拦截请求和响应的组件,用于实现诸如认证、日志记录等功能。 - 通过实现`javax.servlet.Filter`接口来...

    jsp文档 jsp资料 jsp重要知识点

    **JSP重要知识点详解** 1. **Web-App目录结构** ...以上就是JSP的重要知识点,包括目录结构、Servlet生命周期、乱码处理、会话管理以及页面间的跳转和包含等,这些都是进行JSP开发时需要掌握的基础知识。

    2019-7-29_KH68月考试卷1

    在试卷中,笔试部分包括了几个关键概念的考察,如HTTP操作(转发和重定向)、会话管理(session与cookie)、表达式语言(EL)的作用域、过滤器(Filter)及其配置,以及处理字符编码问题。机试部分则要求使用MVC模式...

    JSP从入门到精通.pdf

    - 设置编码以解决中文乱码问题。 - **3.1.3 常用方法举例** - `request.getMethod()` 获取请求方法(GET/POST)。 - **3.1.4 用户注册** - 处理用户注册时提交的数据,并验证用户输入的有效性。 - **3.1.5 ...

    简单介绍的jsp内置对象

    - 每当一个用户访问一个网站的 JSP 页面时,JSP 服务器都会为其创建一个新的 Session 对象,并为其分配一个唯一的 Session ID。 - 如果用户浏览器支持 Cookie,则 Session ID 会通过 Cookie 发送给客户端。若不...

    JSP教程

    - **3.1.2 处理汉字信息**:解决中文乱码问题,通常涉及到设置正确的字符编码。 - **3.1.3 常用方法举例**:如getParameter()方法用于获取参数值。 - **3.1.4 用户注册**:利用request对象处理用户提交的注册信息...

    jsp 教程

    - **3.1.2 处理汉字信息**:由于编码问题,需要正确设置编码以避免乱码。 - **3.1.3 常用方法举例**:例如使用`getParameter()`方法获取表单字段值。 - **3.1.4 用户注册**:利用request对象处理用户提交的注册...

    java基础知识 jspPPT 让你了解jsp基础

    JSP的代码混杂问题导致其不易维护和扩展,大量业务逻辑和显示逻辑交织在一起,不利于分工合作。 5. **JSP的内置对象** - 输入输出对象:request(请求对象)、response(响应对象)、out(输出流对象)。 - 作用...

    JSP教程——必看.pdf

    - **3.1.2 处理汉字信息**:解决中文乱码问题,通常需要设置正确的编码。 - **3.1.3 常用方法举例**:例如使用`getHeader()`获取HTTP头部信息。 - **3.1.4 用户注册**:通过`request`对象收集用户的注册信息。 -...

    JSP中常用的技巧.ppt

    在JSP(Java Server Pages)开发中,有多种常见的技巧用于提升应用的性能和用户体验。以下是一些核心知识点的详细说明: 1. **在不同页面或用户之间共享数据**: - **Session共享**:同一用户在不同页面间共享数据...

Global site tag (gtag.js) - Google Analytics