struts1之ActionServlet详解_动力节点Java学院整理

在web.xml中我们除了配置ActionServlet还配置了一些初始化参数信息,首先我们看第一个config参数,这里配置的是/WEB-INF/struts-config.xml,因为要下面传递一个这样一个配置信息,这个xml文件名是struts1标准的名字,所以这里这个初始化信息完全可以删除,如果不用这个标准名称这里就必须要在这里配置。现在我们配置的是标准名字,所以我们可以删除,这是为什么呢?这里要看ActionServlet源代码才可以。

从图片上我们能看到ActionServlet中已经写好了默认的config信息了,就是标准名字。所以这里删除也是可以的。
在看下面的debug和detail参数,这两个参数信息是有关日志信息级别的设置,主要关于解析配置文件/WEB-INF/struts-config.xml级别的初始化参数。这里这两个参数可以完全去掉也不影响。

最后还有一个load-on-startup配置,这个是初始化servlet级别的初始化信息,这个参数如果大于等于0就是说明在服务器一启动就把servlet初始化,也就是调用ActionServlet的init方法,这个也可以到ActionServlet的源代码中去查找。

当ActionServlet初始化的时候就会读取/WEB-INF/struts-config.xml信息到内存中,读到内存是以什么样的形式展现的呢?我们现在可以看一下以前博客的那个mvc实例,那里面读取配置文件中的信息是以Actionmapping的形式展现的。另外servlet-mapping的配置就不讲解了,这个都知道就是匹配url路径的,当遇到url-pattern的路径时候就会实例化Actionservlet。

通过这篇文章我们知道了当我们请求的时候ActionServlet是怎样实例化的,也知道为什么我们要配置web.xml信息了。那么我们为什么要配置/WEB-INF/struts-config.xml文件,ActionServlet是如何传递请求的,如何和ActionForm、ActionMapping、Action等交互的最终完成用户请求的呢?

我们先从ActionServlet源代码的init方法开始。因为ActionServlet就是一个Servlet,它也是具有典型的那几个方法init、doget、dopost等方法。既然是初始化,那么我们就要看init方法。Init方法的源代码如下:

/**
   * <p>Initialize this servlet. Most of the processing has been factored into
   * support methods so that you can overrideparticular functionality at a
   * fairly granular level.</p>
   *
   * @exception ServletException if we cannotconfigure ourselves correctly
   */
  publicvoidinit() throwsServletException { 

    // Wraps the entire initialization in a try/catch tobetter handle
    // unexpected exceptions and errors to provide better feedback
    // to the developer
    try {
      initInternal();
      initOther();
      initServlet(); 

      getServletContext().setAttribute(Globals.ACTION_SERVLET_KEY, this);
      initModuleConfigFactory();
      // Initialize modules as needed
      ModuleConfig moduleConfig =initModuleConfig("", config);
      initModuleMessageResources(moduleConfig);
      initModuleDataSources(moduleConfig);
      initModulePlugIns(moduleConfig);
      moduleConfig.freeze(); 

      Enumeration names =getServletConfig().getInitParameterNames();
      while (names.hasMoreElements()) {
        String name = (String)namesnextElement();
        if (!name.startsWith("config/")) {
          continue;
        }
        String prefix =name.substring(6);
        moduleConfig = initModuleConfig
          (prefix,getServletConfig().getInitParameter(name));
        initModuleMessageResources(moduleConfig);
        initModuleDataSources(moduleConfig);
        initModulePlugIns(moduleConfig);
        moduleConfig.freeze();
      } 

      this.initModulePrefixes(this.getServletContext()); 

      thisdestroyConfigDigester();
    } catch (UnavailableException ex) {
      throw ex;
    } catch (Throwable t) { 

      // The follow error message is not retrieved from internal message
      // resources as they may not have been able to have been
      // initialized
      logerror("Unable to initialize Struts ActionServlet due to an "
        + "unexpected exception or error thrown, so marking the "
        + "servlet as unavailable. Mostlikely, this is due to an "
        + "incorrect or missing library dependency.", t);
      throw new UnavailableException(t.getMessage());
    }
}

在解释这段代码的流程和意思之前,有必要说一句,就是当我们在eclipse里面看代码的时候,尤其是看一段生疏的很长的代码的时候,希望能够经常使用Ctrl键(多余的不解释)。

下面开始讲解这段代码的流程和具体每一步的含义,如果有不正确的地方,希望指正。

首先映入眼帘的是initInternal()方法。这个方法的实现代码是:

代码段一:

/**
   * <p>Initialize our internal MessageResourcesbundle</p>
   *
   * @exception ServletException if we cannotinitialize these resources
   */
  protectedvoidinitInternal() throwsServletException { 

    // :FIXME: Document UnavailableException 

    try {
      internal = MessageResourcesgetMessageResources(internalName);
    } catch (MissingResourceException e) {
      log.error("Cannot load internal resources from '"+ internalName+ "'",
        e);
      throw new UnavailableException
        ("Cannot load internal resources from '"+ internalName+ "'");
    } 

}

代码段二:

/**
   * Create and return an instance of <code>MessageResources</code> for the
   * created by the default <code>MessageResourcesFactory</code>.
   *
   * @param config Configuration parameterfor this message bundle.
   */
  publicsynchronizedstaticMessageResources getMessageResources(String config) { 

    if (defaultFactory == null) {
      defaultFactory =MessageResourcesFactory.createFactory();
    } 

    return defaultFactory.createResources(config);
}

代码段三:

/**
   * Create and return a <code>MessageResourcesFactory</code> instance ofthe
   * appropriate class, which can be used tocreate customized
   * <code>MessageResources</code>instances If no such factory can be
   * created, return <code>null</code> instead
   */
  publicstaticMessageResourcesFactory createFactory(){ 

    // Construct a new instance of the specified factory class
    try {
      if (clazz == null)
        clazz = RequestUtils.applicationClass(factoryClass);
      MessageResourcesFactory factory =
        (MessageResourcesFactory) clazz.newInstance();
      return (factory);
    } catch (Throwable t) {
      LOG.error("MessageResourcesFactory.createFactory",t);
      return (null);
    } 

}

这个方法的具体作用就是初始化MessageResources,具体实现是工厂模式,首先判断defaultFactory是否存在,不存在则创建工厂,defaultFactory = MessageResourcesFactory.createFactory(),在通过工厂创建资源类defaultFactory.createResources(config);存在则直接创建资源类。

initOther()的方法,主要是初始化其它的配置,获取我们自己的struts-config配置文件的路径,而它的默认路径就是web-inf/struts-config.xml,另外这个方法还会注册一些转换类的。具体源代码是:

/**
   * <p>Initialize other global characteristics ofthe controller servlet</p>
   *
   * @exception ServletException if we cannotinitialize these resources
   */
  protectedvoidinitOther() throwsServletException { 

    String value = null;
    value =getServletConfig().getInitParameter("config");
    if (value != null) {
      config = value;
    } 

    // Backwards compatibility for form beans of Java wrapper classes
    // Set to true for strict Struts 0 compatibility
    value =getServletConfig().getInitParameter("convertNull");
    if ("true".equalsIgnoreCase(value)
      || "yes".equalsIgnoreCase(value)
      || "on".equalsIgnoreCase(value)
      || "y".equalsIgnoreCase(value)
      || "1".equalsIgnoreCase(value)) { 

      convertNull = true;
    } 

    if (convertNull) {
      ConvertUtils.deregister();
      ConvertUtils.register(new BigDecimalConverter(null), BigDecimal.class);
      ConvertUtils.register(new BigIntegerConverter(null), BigInteger.class);
      ConvertUtils.register(new BooleanConverter(null), Boolean.class);
      ConvertUtils.register(new ByteConverter(null), Byte.class);
      ConvertUtils.register(new CharacterConverter(null), Character.class);
      ConvertUtils.register(new DoubleConverter(null), Double.class);
      ConvertUtils.register(new FloatConverter(null), Float.class);
      ConvertUtils.register(new IntegerConverter(null), Integer.class);
      ConvertUtils.register(new LongConverter(null), Long.class);
      ConvertUtils.register(new ShortConverter(null), Short.class);
    } 

}

initServlet()方法是利用digester读取web.xml文件并且放到servletContext中。具体实现源代码:

/**
 * <p>Initialize the servlet mapping under which our controller servlet
 * is being accessed. This will be used in the <code>&html:form></code>
 * tag to generate correct destination URLs for form submissions.</p>
 *
 * @throws ServletException if error happens while scanning web.xml
 */
protected void initServlet() throws ServletException { 

  // Remember our servlet name
  this.servletName = getServletConfig().getServletName(); 

  // Prepare a Digester to scan the web application deployment descriptor
  Digester digester = new Digester();
  digester.push(this);
  digester.setNamespaceAware(true);
  digester.setValidating(false); 

  // Register our local copy of the DTDs that we can find
  for (int i = 0; i < registrations.length; i += 2) {
    URL url = this.getClass().getResource(registrations[i+1]);
    if (url != null) {
      digester.register(registrations[i], url.toString());
    }
  } 

  // Configure the processing rules that we need
  digester.addCallMethod("web-app/servlet-mapping",
              "addServletMapping", 2);
  digester.addCallParam("web-app/servlet-mapping/servlet-name", 0);
  digester.addCallParam("web-app/servlet-mapping/url-pattern", 1); 

  // Process the web application deployment descriptor
  if (log.isDebugEnabled()) {
    log.debug("Scanning web.xml for controller servlet mapping");
  } 

  InputStream input =
    getServletContext().getResourceAsStream("/WEB-INF/web.xml"); 

  if (input == null) {
    log.error(internal.getMessage("configWebXml"));
    throw new ServletException(internal.getMessage("configWebXml"));
  } 

  try {
    digester.parse(input); 

  } catch (IOException e) {
    log.error(internal.getMessage("configWebXml"), e);
    throw new ServletException(e); 

  } catch (SAXException e) {
    log.error(internal.getMessage("configWebXml"), e);
    throw new ServletException(e); 

  } finally {
    try {
      input.close();
    } catch (IOException e) {
      log.error(internal.getMessage("configWebXml"), e);
      throw new ServletException(e);
    }
  } 

  // Record a servlet context attribute (if appropriate)
  if (log.isDebugEnabled()) {
    logdebug("Mapping for servlet '" + servletName + "' = '" +
      servletMapping + "'");
  } 

  if (servletMapping != null) {
    getServletContext().setAttribute(Globals.SERVLET_KEY, servletMapping);
  } 

}

首先说在说之前还是先讲init方法的具体实现代码写出来以便大家方便阅读和理解。

Init源代码:

public void init() throws ServletException { 

 try {
    //初始化资源类
   initInternal();
   //注册转换类
   initOther();
   //利用digester读取webxml文件并且将其放到servletContext中
   initServlet();
   getServletContext().setAttribute(Globals.ACTION_SERVLET_KEY, this); 

   initModuleConfigFactory();
   ModuleConfig moduleConfig = initModuleConfig("", config);
   initModuleMessageResources(moduleConfig);
   initModuleDataSources(moduleConfig);
   initModulePlugIns(moduleConfig);
   moduleConfig.freeze(); 

   Enumeration names = getServletConfig().getInitParameterNames();
   while (names.hasMoreElements()) {
     String name = (String) names.nextElement();
     if (!name.startsWith("config/")) {
       continue;
     }
     String prefix = name.substring(6);
     moduleConfig = initModuleConfig
       (prefix, getServletConfig()getInitParameter(name));
     initModuleMessageResources(moduleConfig);
     initModuleDataSources(moduleConfig);
     initModulePlugIns(moduleConfig);
     moduleConfig.freeze();
   } 

   this.initModulePrefixes(this.getServletContext()); 

   this.destroyConfigDigester();
 } catch (UnavailableException ex) {
   throw ex;
 } catch (Throwable t) {
   log.error("Unable to initialize Struts ActionServlet due to an "
     + "unexpected exception or error thrown, so marking the "
     + "servlet as unavailable Most likely, this is due to an "
     + "incorrect or missing library dependency", t);
   throw new UnavailableException(t.getMessage());
 }
}

getServletContext().setAttribute(Globals.ACTION_SERVLET_KEY,this);这句话是将ActionServlet实例将以Globals.ACTION_SERVLET_KEY作为key存入servletcontext中。

这里的Globals.ACTION_SERVLET_KEY在ActionServlet已经给出了声明:

public static final String ACTION_SERVLET_KEY= "org.apache.struts.action.ACTION_SERVLET"; 

接下来initModuleConfigFactory()方法,这个方法主要的作用是解析在web.xml中configFactory的text值。如果configFactory有配置,则将设置ModuleConfigFactory中得factoryClass值,否则默认得为efaultModuleConfigFactory。该方法其实宗旨是让开发人员自己开发出ModuleConfigFactory,从而得到自己所需要的ModuleConfig类。因为我们的实例中没有配置这个参数信息,所以我们这里的实例是要defalutModelConfigFactory了。

代码段一:

protected voidinitModuleConfigFactory(){
    String configFactory =getServletConfig().getInitParameter("configFactory");
    if (configFactory != null) {
      ModuleConfigFactory.setFactoryClass(configFactory);
    }
}

代码段二:

public static void setFactoryClass(String factoryClass) {
    ModuleConfigFactory.factoryClass = factoryClass;
    ModuleConfigFactory.clazz = null;
  } 

代码段三:

protected static String factoryClass =
    "org.apache.struts.config.impl.DefaultModuleConfigFactory";
} 

ModuleConfig moduleConfig =initModuleConfig("", config)方法是非常重要的,initModuleConfig方法给strits-config里面的属性初始化后放入moduleConfig对象里面去,放到moduleConfig对象里面去便于以后操作更快,因为它是文件流。

具体实现代码:

protected ModuleConfig initModuleConfig(Stringprefix, String paths)
    throws ServletException { 

    // :FIXME: Document UnavailableException? (Doesn't actually throw anything) 

    if (log.isDebugEnabled()) {
      log.debug(
        "Initializing module path '"
          + prefix
          + "' configuration from '"
          + paths
          + "'");
    } 

    // Parse the configuration for this module
    ModuleConfigFactory factoryObject= ModuleConfigFactory.createFactory();
    ModuleConfig config =factoryObject.createModuleConfig(prefix); 

    // Configure the Digester instance we will use
    Digester digester =initConfigDigester(); 

    // Process each specified resource path
    while (paths.length() > 0) {
      digester.push(config);
      String path = null;
      int comma = paths.indexOf(',');
      if (comma >= 0) {
        path =paths.substring(0, comma).trim();
        paths =paths.substring(comma + 1);
      } else {
        path = pathstrim();
        paths = "";
      } 

      if (pathlength() < 1){
        break;
      } 

      this.parseModuleConfigFile(digester,path);
    } 

    getServletContext().setAttribute(
      Globals.MODULE_KEY +config.getPrefix(),
      config); 

    // Force creation and registration of DynaActionFormClass instances
    // for all dynamic form beans we wil be using
    FormBeanConfig fbs[] =config.findFormBeanConfigs();
    for (int i = 0; i < fbs.length; i++) {
      if (fbs[i].getDynamic()) {
        fbs[i].getDynaActionFormClass();
      }
    } 

    return config;
}

这里有必要解析一下这段代码。首先得到继承ModuleConfigFactory的实现类,如果在initModuleConfigFactory()中能设置factoryClass属性,则能生成客户化得factory,否则得到得是默认得DefaultModuleConfigFactory类,该工厂得到ModuleConfigImpl类。然后调用initConfigDigester()该方法为解析配置文件做准备,初始化Digest类(具体digest的初始化实现就不讲解)。最后返回ModuleConfig,而这时的ModuleConfig里面封装了所有的struts-config.xml中的信息。

最后的几个方法就简单说一下就行,不是非常难理解:

initModuleMessageResources(moduleConfig)方法是通过moduleConfig中的配置文件信息,创建MessageResource对象.

initModuleDataSources(moduleConfig)方法是通过moduleConfig中的配置文件信息,创建DataSource对象.   initModulePlugIns(moduleConfig)加载并初始化默认应用模块的所有插件的。

moduleConfig.freeze()是将配置文件中的各个对象,设置成已配置状态.

最后我们看到了,下面还有一段同上面代码的循环代码,这段代码的主要意思就是当默认子应用模块被成功初始化后,如果应用还包括其他子应用模块,将重复流程,分别对其他子应用模块进行初始化。这个也是很好理解的。

到此为止ActionServlet就init完成。

(0)

相关推荐

  • Struts1教程之ActionMapping_动力节点Java学院整理

    首先断点走出了processpath方法, 这个方法是用来截取字符串的,今天我们来看怎样获得ActionMapping的方法---processMapping. 在此之前简单说一下ActionMapping,它的源代码中可以看出,其中最重要的属性和我们的mvc小实例中的ActionMapping类似,都是有path.type还有forwardMap,主要是对应的struts-config配置文件而来,这个就是保存这个配置文件的信息到内存中. 具体的mvc小实例的ActionMapping代码如下

  • Java中struts2和spring MVC的区别_动力节点Java学院整理

    1.Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上SpringMVC就容易实现restful url,而struts2的架构实现起来要费劲,因为Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了. 2.SpringMVC的方法之间基本上独立的,独享request respons

  • struts1之简单mvc示例_动力节点Java学院整理

    先看MVC模式流程图(其实MVC设计模式就是java中的model2.): 就像图上所标识的C层主要是Servlet层控制页面跳转,M层就是具体的业务处理逻辑,而JSP就是所谓的V层.MVC是有别于我们所说的三层,我们平常所说的三层是UI层.BLL层.DAL层,具体的区别如图: 从图上能看出来,JSP和Servlet构成了UI层,而Model层分成了BLL层和DAL层(也就是业务逻辑和数据持久层). 从理论上认清了MVC设计模式之后,下面开始动手敲一个MVC设计模式示例代码: JSP索引页面in

  • Struts1之url截取_动力节点Java学院整理

    Struts1之url截取 先我们来对ActionServlet深层次进行分析.我们用断点的调试的方式来看底层源码.因为这个实例是post方式提交,所以将断点设置到doPost方法上. 我们debug运行程序,进入doPost里面的方法: 这个方法非常重要是ActionServlet运行的核心方法. 我们进入这个方法: 再继续进入: 我们赫然发现了这样一个方法就是processPath方法,这个方法就是截取字符串的方法.这个方法的源代码如下: /** * <p>Identify and ret

  • struts1登录示例代码_动力节点Java学院整理

    Struts1框架实例-登录实例: 1.实例开始工作-导入jar包,在官网上下载struts1框架包,解压之后导入工程的: 2.之后配置web.xml(这里的具体配置方法可以参见struts1框架包中的实例文件夹webapps中的实例代码中web.xml文件的配置方法): 具体如下: <span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8"?> &

  • Struts1简介和入门_动力节点Java学院整理

    本文为大家分享了Struts1简介和入门的学习资料,供大家参考,具体内容如下 1. 框架 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法.也就是说框架是一个半成品的应用程序. 我们所面对的应用程序一般都是分为两部分,一部分是业务相关的组件部分,另一部分是和业务无关的组件部分.而我们知道和业务相关的组件部分的重用性是非常低的,这也是显而易见的事情:而和业务无关的组件部分,如验证.异常.程序流程控制等等服务组件的复用性是非常高的.所以当人们在不同的应

  • Struts1和struts2的区别_动力节点Java学院整理

    Struts2其实并不是一个陌生的Web框架,Struts2是以Webwork的设计思想为核心,吸收了Struts1的优点,因此,可以认为Struts2是Struts1和Webwork结合的产物. 简单来说二者的区别是: 一个是Stuts1 ,一个是Stuts2,这是最大的区别,技术方面,Stuts1有个核心控制器,但是只提供了一个接口,也就是execute,还要配置actionform之类的,很麻烦,所以依赖性比较强:而Stuts2是针对拦截器开发的,也就是所谓的AOP思想,可以配置多个act

  • struts1之ActionServlet详解_动力节点Java学院整理

    在web.xml中我们除了配置ActionServlet还配置了一些初始化参数信息,首先我们看第一个config参数,这里配置的是/WEB-INF/struts-config.xml,因为要下面传递一个这样一个配置信息,这个xml文件名是struts1标准的名字,所以这里这个初始化信息完全可以删除,如果不用这个标准名称这里就必须要在这里配置.现在我们配置的是标准名字,所以我们可以删除,这是为什么呢?这里要看ActionServlet源代码才可以. 从图片上我们能看到ActionServlet中已

  • Java BigDecimal详解_动力节点Java学院整理

    1.引言 借用<Effactive Java>这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的.然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合.但是,商业计算往往要求结果精确,例如银行存款数额,这时候BigDecimal就派上大用场啦. 2.BigDecimal简介 BigDecimal 由任意精度的整数非标度值 和32 位的整数标度 (scale) 组

  • Java System类详解_动力节点Java学院整理

    System类是jdk提供的一个工具类,有final修饰,不可继承,由名字可以看出来,其中的操作多数和系统相关.其功能主要如下: • 标准输入输出,如out.in.err • 外部定义的属性和环境变量的访问,如getenv()/setenv()和getProperties()/setProperties() • 加载文件和类库的方法,如load()和loadLibrary(). • 一个快速拷贝数组的方法:arraycopy() • 一些jvm操作,如gc().runFinalization()

  • Java Runtime类详解_动力节点Java学院整理

    一.概述 Runtime类封装了运行时的环境.每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接.一般不能实例化一个Runtime对象,应用程序也不能创建自己的 Runtime 类实例,但可以通过 getRuntime 方法获取当前Runtime运行时对象的引用.一旦得到了一个当前的Runtime对象的引用,就可以调用Runtime对象的方法去控制Java虚拟机的状态和行为. 当不被信任的代码调用任何Runtime方法时,常常会引起SecurityExc

  • Java Scaner类详解_动力节点Java学院整理

    Java.util.Scanner是Java5.0的新特征,主要功能是简化文本扫描.这个类最实用的地方表现在获取控制台输入,其他的功能都很鸡肋,尽管Java API文档中列举了大量的API方法,但是都不怎么地. 一.扫描控制台输入  这个例子是常常会用到,但是如果没有Scanner,你写写就知道多难受了. 当通过new Scanner(System.in)创建一个Scanner,控制台会一直等待输入,直到敲回车键结束,把所输入的内容传给Scanner,作为扫描对象.如果要获取输入的内容,则只需要

  • web.xml详解_动力节点Java学院整理

    一.            Web.xml详解: (一)  web.xml加载过程(步骤) 首先简单说一下,web.xml的加载过程. 当我们去启动一个WEB项目时,容器包括(JBoss.Tomcat等)首先会读取项目web.xml配置文件里的配置,当这一步骤没有出错并且完成之后,项目才能正常地被启动起来.   启动WEB项目的时候,容器首先会去它的配置文件web.xml读取两个节点: <listener></listener>和<context-param><

  • HTTP协议详解_动力节点Java学院整理

    一.概念 协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器. HTTP协议,即超文本传输协议(Hypertext transfer protocol).是一种详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议. HTTP协议是用于从WWW服务器传输超文本到本地浏览器的传送协议.

  • Apache和Nginx的优缺点详解_动力节点Java学院整理

    Apache和Nginx比较 功能对比 Nginx和Apache一样,都是HTTP服务器软件,在功能实现上都采用模块化结构设计,都支持通用的语言接口,如PHP.Perl.Python等,同时还支持正向和反向代理.虚拟主机.URL重写.压缩传输.SSL加密传输等. 在功能实现上,Apache的所有模块都支持动.静态编译,而Nginx模块都是静态编译的, 对FastCGI的支持,Apache对Fcgi的支持不好,而Nginx对Fcgi的支持非常好: 在处理连接方式上,Nginx支持epoll,而Ap

  • sql注入过程详解_动力节点Java学院整理

    SQL注入攻击的总体思路是: 1.发现SQL注入位置: 2.判断后台数据库类型: 3.确定XP_CMDSHELL可执行情况 4.发现WEB虚拟目录 5. 上传JSP木马: 6.得到管理员权限: 一.SQL注入漏洞的判断 一般来说,SQL注入一般存在于形如:HTTP://xxx.xxx.xxx/abc.jsp?id=XX等带有参数的jsp或者动态网页中,有时一个动态网页中可能只有一个参数,有时可能有N个参数,有时是整型参数,有时是字符串型参数,不能一概而论.总之只要是带有参数的动态网页且此网页访问

  • UrlDecoder和UrlEncoder使用详解_动力节点Java学院整理

    一 URLEncoder  HTML 格式编码的实用工具类.该类包含了将 String 转换为 application/x-www-form-urlencoded MIME 格式的静态方法.有关 HTML 格式编码的更多信息,请参阅 HTML 规范. 对 String 编码时,使用以下规则: 字母数字字符 "a" 到 "z"."A" 到 "Z" 和 "0" 到 "9" 保持不变.  特殊

随机推荐