`

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/>:此方法不一定有用

分享到:
评论

相关推荐

    吴天雄--JavaWeb完整笔记.doc

    模块二:使用eclipse和idea快速开发jsp(idea和tomcat的相关配置、eclipse创建web项目、jsp页面元素、jsp九大内置对象、四大作用域对象、解决get/post请求乱码问题、cookie和session详解、请求重定向);模块三:...

    jsp九大内置对象

    JSP引擎产生一个Session对象,同时分配一个String类型的ID号,JSP引擎同时将这换个ID号发送到客户端,存放在Cookie中,这样Session对象,直到客户关闭浏览器后,服务器端该客户的Session对象才取消,并且和客户的...

    JavaWeb实战开发

    请求方式的编码问题、response、请求转发和重定向、cookie、session执行机制、session共享问题? ? ?4.session与cookie问题及application、cookie补充说明及四种范围对象作用域? ? ?5.JDBC原理及使用Statement访问...

    深入体验Java Web开发内幕

    8.6 JSP标签  8.7 JSP的中文乱码问题  8.8 思考与实践 第9章 JavaBean在JSP中的应用  9.1 JavaBean简介  9.2 JavaBean的属性  9.3 JavaBean在JSP中的应用  9.4 JSP开发模式  9.5 ...

    Java学习笔记-个人整理的

    \contentsline {chapter}{Contents}{2}{section*.1} {1}Java基础}{17}{chapter.1} {1.1}基本语法}{17}{section.1.1} {1.2}数字表达方式}{17}{section.1.2} {1.3}补码}{19}{section.1.3} {1.3.1}总结}{23}{...

    java web 视频、电子书、源码(李兴华老师出版)

    6.6.1、取得虚拟目录对应的绝对路径 6.6.2、范例讲解:网站计数器 6.6.3、查看application范围的属性 6.7、WEB安全性及config对象 6.7.1、WEB安全性 6.7.2、config对象 6.8、out对象 6.9、pageContext对象 ...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 上

    6.6.1、取得虚拟目录对应的绝对路径 6.6.2、范例讲解:网站计数器 6.6.3、查看application范围的属性 6.7、WEB安全性及config对象 6.7.1、WEB安全性 6.7.2、config对象 6.8、out对象 6.9、pageContext对象 ...

    MLDN+李兴华+Java+Web开发实战经典.part3.rar )

    6.6.1、取得虚拟目录对应的绝对路径 6.6.2、范例讲解:网站计数器 6.6.3、查看application范围的属性 6.7、WEB安全性及config对象 6.7.1、WEB安全性 6.7.2、config对象 6.8、out对象 6.9、pageContext对象 ...

    李兴华 java_web开发实战经典 源码 完整版收集共享

    6.6.1、取得虚拟目录对应的绝对路径 6.6.2、范例讲解:网站计数器 6.6.3、查看application范围的属性 6.7、WEB安全性及config对象 6.7.1、WEB安全性 6.7.2、config对象 6.8、out对象 6.9、pageContext对象 ...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 下

    6.6.1、取得虚拟目录对应的绝对路径 6.6.2、范例讲解:网站计数器 6.6.3、查看application范围的属性 6.7、WEB安全性及config对象 6.7.1、WEB安全性 6.7.2、config对象 6.8、out对象 6.9、pageContext对象 ...

    李兴华Java Web开发实战经典.pdf (高清版) Part1

    6.6.1、取得虚拟目录对应的绝对路径 6.6.2、范例讲解:网站计数器 6.6.3、查看application范围的属性 6.7、WEB安全性及config对象 6.7.1、WEB安全性 6.7.2、config对象 6.8、out对象 6.9、pageContext对象 ...

    李兴华 Java Web 开发实战经典 高清扫描版Part3

    6.6.1、取得虚拟目录对应的绝对路径 6.6.2、范例讲解:网站计数器 6.6.3、查看application范围的属性 6.7、WEB安全性及config对象 6.7.1、WEB安全性 6.7.2、config对象 6.8、out对象 6.9、pageContext对象 ...

    李兴华Java Web开发实战经典(高清版) Part2

    6.6.1、取得虚拟目录对应的绝对路径 6.6.2、范例讲解:网站计数器 6.6.3、查看application范围的属性 6.7、WEB安全性及config对象 6.7.1、WEB安全性 6.7.2、config对象 6.8、out对象 6.9、pageContext对象 ...

Global site tag (gtag.js) - Google Analytics