Vincent Jia 博客

to be a better man, to be a bad man.

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  29 随笔 :: 3 文章 :: 0 评论 :: 0 Trackbacks

#

具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择。

    cookie机制。正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。而cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器
    cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式
    session机制。session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
 
    当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。
    保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID。但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。
    经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。还有一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如:
     <form name="testform" action="/xxx">
     <input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
     <input type="text">
     </form>
实际上这种技术可以简单的用对action应用URL重写来代替。
posted @ 2010-06-02 15:03 iLinux 阅读(136) | 评论 (0)编辑 收藏

第一部分 DWR是什么,如何使用

    DWR是一个开源的类库,可以帮助开发人员开发包含AJAX技术的网站.它可以允许在浏览器里的代码(javascript)使用运行在WEB服务器上的 JAVA函数,就像它就在浏览器里一样. 它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet(小应用程序)中获取数据.另外一方面一个 JavaScript库可以帮助网站开发人员轻松地利用获取的数据来动态改变网页的内容.
    官方网站地址http://getahead.org/dwr

关于DWR的使用 引用别人的文章。   

开始使用 DWR
    原文出处: http://www.javatang.com/archives/2006/10/20/254879.html
    翻译: Jet Mah
    有两种方法来开始 DWR 的学习,最简单的做法是下载官方提供的 WAR 文件然后对此深入研究。不过这种方式不能使你感到将 DWR 整合到你现有的 web 程序有多么的简单,所以我们推荐你跟随下面三个步骤:

1. 安装 DWR JAR 包
下载 dwr.jar 文件,然后将它放在 web 程序的 WEB-INF/lib 目录下面,很可能在这个目录下已经有一些 jar 文件了。

2. 编辑 config 文件

将下面的代码添加到 WEB-INF/web.xml 文件中,<servlet>需要放在另外的<servlet>之后,<servlet-mapping>也是如此。

<servlet>
   <servlet-name>dwr-invoker</servlet-name>
   <display-name>DWR Servlet</display-name>
   <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
   <init-param>
      <param-name>debug</param-name>
      <param-value>true</param-value>
   </init-param>
</servlet>

<servlet-mapping>
   <servlet-name>dwr-invoker</servlet-name>
   <url-pattern>/dwr/*</url-pattern>
</servlet-mapping>

接下来创建 dwr.xml 文件并将此放在 web.xml 所在的 WEB-INF 目录下。文件中类似下面的内容:

<!DOCTYPE dwr PUBLIC
     ”-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN”
     ”http://www.getahead.ltd.uk/dwr/dwr10.dtd”>

<dwr>
   <allow>
     <create creator=”new” javascript=”JDate”>
       <param name=”class” value=”java.util.Date”/>
     </create>
     <create creator=”new” javascript=”Demo”>
       <param name=”class” value=”your.java.Bean”/>
     </create>
   </allow>
</dwr>

DWR 配置文件定义了由 DWR 创建和被 Javascript 远程使用的类。在上面的例子中我们在远程创建了2个类,并且给出了在 Javascript 中的类名。

上面使用的 new creator 使用了所有的 JavaBeans 必须含有的公有(public)无参(no-args)的构造函数。值得一提的是, DWR 还有一些限制:

  • 避免使用 JavaScript 保留字;以保留字命名的方法将自动被排除。大多数 JavaScript 的保留字同时也是 Java 的保留字,因此无论如何你也不能使用一个名为 “try()” 的方法。但是最常用的一个词 “delete()”,在 JavaScript 中有特殊的含义而在 Java 中没有。
  • 重载方法(Overloaded methods)将会在调用的时候陷入未知的状况,因此应该避免重载方法。

    3. 访问下面的地址
    http://localhost:8080/[YOUR-WEBAPP]/dwr/

    你应该会看到一个页面,上面显示了刚才你在第二步所创建的类。进入一个链接之后你会看到所有等待调用方法的列表。这些动态产生的例子你也能通过 DWR 来实现。

    亲自尝试和体会下吧。

    怎样应用到你的 Web 程序中?

    在侧边栏有很多例子演示了怎样改变网页中的文本、更新列表、操作表单和动态修改表格。每一个例子都有详细的说明。

    另外一个开始方法就是从页面中查看源代码,这些页面你刚刚浏览过:

  • 进入 http://localhost:8080/[YOUR-WEBAPP]/dwr/ 然后点击你创建的类;
  • 查看源代码然后定位到你所感兴趣的方法的代码行;
  • 将这些文本粘贴到你 Web 程序的一个 HTML 或 JSP页面中;
  • 包含下面的 javascrip 文件:

    <script src=’/[YOUR-WEBAPP]/dwr/interface/[YOUR-SCRIPT].js’></script>
    <script src=’/[YOUR-WEBAPP]/dwr/engine.js’></script>

    你可以根据实际情况修改 /[YOUR-WEBAPP]/ 部分。

    关于怎样书写 DWR 控制的 Javascript 代码请查看 脚本简介

  • posted @ 2010-06-02 14:40 iLinux 阅读(128) | 评论 (0)编辑 收藏

         摘要:   阅读全文
    posted @ 2010-03-29 16:13 iLinux 阅读(4828) | 评论 (0)编辑 收藏

    是不是应该进入有可能实施互联网、广电系统、电信领域的某一方呢?
    机遇的声音喊得很响亮,金三银四的日子,想动一动了

    posted @ 2010-03-15 14:13 iLinux 阅读(70) | 评论 (0)编辑 收藏

    简单讨论JVM的class加载机制,给出两个反射的例子代码并分析工作原理,并给出了sun的动态代理实现原理——代码生成

    JavaVM,反射与动态代理

     

    Java程序的工作机制:Java对象都以单独的class文件存在,java虚拟机将其载入并执行其虚拟机指令。

     

    Java虚拟机查找这些java对象:

    java虚拟机根据class path来查找java对象,而虚拟机的class path又分为三层:

    bootstrapsun.boot.class.path

    extension: java.ext.dirs

    application: java.class.path

    三个class path各有对应的classloader。由上而下形成父子关系

    当程序中调用new指令,或者ClassLoader.load方法时。其顺序如下:

    1.       首先查看applicationclassloader中是否已有对应的class缓存,如果有则返回,并根据class分配内存。如果没有,接下一步。

    2.       首先查看extensionclassloader中是否已有对应的class缓存,如果有则返回,并根据class分配内存。如果没有,接下一步。

    3.       首先查看bootstrapclassloader中是否已有对应的class缓存,如果有则返回,并根据class分配内存。如果没有,接下一步。

    4.       bootstrapclassloader在其class path中试图加载该class,如果有,则将该class放入cache中,并返回。如果没有,接下一步。

    5.       extensionclassloader在其class path中试图加载该class,如果有,则将该class放入cache中,并返回。如果没有,接下一步。

    6.       applicationclassloader在其class path中试图加载该class,如果有,则将该class放入cache中,并返回。如果没有,则抛出ClassNotFoundexception

     

    Java虚拟机加载这些java对象:

    每个java虚拟机都在其启动时产生一个唯一的class heap,并把所有的class instance都分配在其中。其中每个类实例的信息又分两部分,fields域和methods域。每个类实例各自拥有fields,但同一个类的不同实例共享methods

     

    反射

    JVM对反射的处理

    简单例子代码:

    import java.lang.reflect.InvocationHandler;

    import java.lang.reflect.Method;

    import java.lang.reflect.InvocationTargetException;

    import java.io.IOException;

     

    public class Main {

        public static void main(String[] args){

            TempImpl t1 = new TempImpl("temp1");

            try {

                Method t1Talk = t1.getClass().getMethod("Talk", new Class[0]) ;

                t1Talk.invoke(t1, null);

            } catch (NoSuchMethodException e) {

                e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.

            } catch (IllegalAccessException e) {

                e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.

            } catch (InvocationTargetException e) {

                e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.

            }

            try {

                System.in.read();

            } catch (IOException e) {

                e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.

            }

        }

    }

    复杂例子代码:

    import java.lang.reflect.InvocationHandler;

    import java.lang.reflect.Method;

    import java.lang.reflect.InvocationTargetException;

    import java.io.IOException;

     

    public class Main {

        public static void main(String[] args){

            TempImpl t1 = new TempImpl("temp1");

            TempImpl t2 = new TempImpl("temp2");

            Temp2 temp2 = new Temp2();

            try {

                Method t1Talk = t1.getClass().getMethod("Talk", new Class[0]) ;

                Method t2Talk = t2.getClass().getMethod("Talk", new Class[0]) ;

                t1Talk.invoke(t2, null);

                t2Talk.invoke(t1, null);

                if(t1Talk.equals(t2Talk)){

                    System.out.println("equals");

                }

               else{

                    System.out.println("not equals");

                }

                if(t1Talk==t2Talk){

                    System.out.println("ref equals");

                }

               else{

                    System.out.println("ref not equals");

                }

                t2Talk.invoke(temp2, null);

            } catch (NoSuchMethodException e) {

                e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.

            } catch (IllegalAccessException e) {

                e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.

            } catch (InvocationTargetException e) {

                e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.

            }

            try {

                System.in.read();

            } catch (IOException e) {

                e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.

            }

        }

    }

     

    分析:java虚拟机把每个methods当作一个执行单元。该执行单元带有两种签名:类签名和属性签名(publicstatic等)。 反射的第一步,验证签名的合法性。验证通过后,顺序执行该method中的指令,当需要访问类实例的fields和传入参数时,由虚拟机注入。

     

    动态代理

    Sun对动态代理的说明:

    一个简单例子代码:

    动态代理的内部实现——代码生成:

    研究JDK源代码,发现在Proxysun实现中调用了sun.misc.ProxyGenerator类的generateProxyClass( proxyName, interfaces)方法,其返回值为byte[]class文件的内存类型一致。于是做如下试验:

    public class ProxyClassFile{

           public static void main(String[] args){

                  String proxyName = "TempProxy";

            TempImpl t = new TempImpl("proxy");

                  Class[] interfaces =t.getClass().getInterfaces();

                 

                  byte[] proxyClassFile = ProxyGenerator.generateProxyClass(

                      proxyName, interfaces);

            File f = new File("classes/TempProxy.class");

            try {

                FileOutputStream fos = new FileOutputStream(f);

                fos.write(proxyClassFile);

                fos.flush();

                fos.close();

            } catch (FileNotFoundException e) {

                e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.

            } catch (IOException e) {

                e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.

            }

           }

    }

    运行该类,到class文件夹下,利用反编译技术,发现原来其采用了代码生产技术:

     

    public interface Temp{

           public void Talk();

           public void Run();

    }

    import java.lang.reflect.*;

     

    public final class TempProxy extends Proxy

        implements Temp{

     

        private static Method m4;

        private static Method m2;

        private static Method m0;

        private static Method m3;

        private static Method m1;

     

        public TempProxy(InvocationHandler invocationhandler)   {

            super(invocationhandler);

        }

     

        public final void Run()    {

            try {

                h.invoke(this, m4, null);

                return;

            }

            catch(Error _ex) { }

            catch(Throwable throwable) {

                throw new UndeclaredThrowableException(throwable);

            }

        }

     

        public final String toString(){

            try{

                return (String)h.invoke(this, m2, null);

            }

            catch(Error _ex) { }

            catch(Throwable throwable)  {

                throw new UndeclaredThrowableException(throwable);

            }

            return "";

        }

     

        public final int hashCode() {

            try {

                return ((Integer)h.invoke(this, m0, null)).intValue();

            }

            catch(Error _ex) { }

            catch(Throwable throwable){

                throw new UndeclaredThrowableException(throwable);

            }

            return 123;

        }

     

        public final void Talk(){

            try{

                h.invoke(this, m3, null);

                return;

            }

            catch(Error _ex) { }

            catch(Throwable throwable) {

                throw new UndeclaredThrowableException(throwable);

            }

        }

     

        public final boolean equals(Object obj) {

            try {

                return ((Boolean)h.invoke(this, m1, new Object[] {

                    obj

                })).booleanValue();

            }

            catch(Error _ex) { }

            catch(Throwable throwable) {

                throw new UndeclaredThrowableException(throwable);

            }

            return false;

        }

     

        static{

            try{

         m4 = Class.forName("Temp").getMethod("Run", new Class[0]);

         m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]);

         m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]);

         m3 = Class.forName("Temp").getMethod("Talk", new Class[0]);

         m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] {

                    Class.forName("java.lang.Object")

                });

            }

            catch(NoSuchMethodException nosuchmethodexception) {

               throw new NoSuchMethodError(nosuchmethodexception.getMessage());

            }

            catch(ClassNotFoundException classnotfoundexception) {

                throw new NoClassDefFoundError(classnotfoundexception.getMessage());

            }

        }

    }

     from: http://www.cnblogs.com/fengye/archive/2007/02/18/652389.html

    posted @ 2010-02-10 14:00 iLinux 阅读(152) | 评论 (0)编辑 收藏

    仅列出标题
    共3页: 上一页 1 2 3