Struts2框架从请求到Action——反射机制研究
字数 1090 2025-08-25 22:58:56
Struts2框架请求处理与反射机制详解
一、Struts2框架概述
Struts2是一个基于MVC设计模式的Web应用框架,它通过配置文件(struts.xml)定义请求与处理Action之间的映射关系。框架内部大量使用Java反射机制来实现动态调用,这是理解Struts2工作机制的关键。
二、Java反射机制基础
1. 反射机制定义
Java反射机制允许程序在运行时:
- 获取任意类的所有属性和方法信息
- 动态创建对象
- 调用对象的方法
- 操作字段值
2. 反射核心API
(1) 获取Class对象的三种方式
// 方式1:Class.forName()
Class c = Class.forName("com.example.Person");
// 方式2:类.class语法
Class c = Person.class;
// 方式3:对象.getClass()
Person p = new Person();
Class c = p.getClass();
(2) 创建实例
Object obj = c.newInstance(); // 调用无参构造方法
(3) 获取方法
Method method = c.getMethod("methodName", parameterTypes);
(4) 调用方法
Object result = method.invoke(obj, args);
3. 反射示例
// ReflectDemo.java
public class ReflectDemo {
public static void main(String[] args) throws Exception {
Class c = Class.forName("com.grq.reflect.Person");
Object o = c.newInstance();
Method m = c.getMethod("fun", String.class, int.class);
m.invoke(o, "张三", 20);
}
}
// Person.java
public class Person {
public void fun(String name, int age) {
System.out.println("我叫"+name+",今年"+age+"岁");
}
}
三、Struts2请求处理流程
1. 整体流程
- 用户发送请求(如/login.action)
- Struts2根据struts.xml配置找到对应的Action类
- 通过反射机制实例化Action并调用相应方法
- 返回处理结果
2. 核心组件:ActionInvocation
ActionInvocation是Struts2框架的核心组件,负责:
- 调用拦截器链
- 执行开发者编写的Action
- 处理结果
四、Struts2反射机制实现
1. Action类对象的生成
(1) 流程追踪
- 请求到达
DefaultActionInvocation.invokeAction() - 调用
getAction()获取Action实例 getAction()调用buildAction()buildAction()调用buildBean()buildBean()根据struts.xml配置创建Action实例
(2) 关键代码
// 从struts.xml获取Action类名
String className = config.getClassName(); // 如"com.demo.action.LoginAction"
// 通过反射创建实例
Object action = buildBean(className, extraContext);
2. 方法的获取与调用
(1) 方法获取
// 获取Action类的Class对象
Class actionClass = action.getClass();
// 获取默认的execute方法
Method method = actionClass.getMethod("execute");
(2) 方法调用
// 在DefaultActionInvocation.invokeAction()中
resultCode = method.invoke(action, EMPTY_ARGS);
五、配置映射机制
1. struts.xml配置示例
<struts>
<package name="default" extends="struts-default">
<action name="login" class="com.demo.action.LoginAction">
<result name="success">/welcome.jsp</result>
</action>
</package>
</struts>
2. 映射关系建立
- 框架启动时解析struts.xml
- 建立请求URL与Action类的映射关系表
- 请求到达时根据URL查找对应的Action配置
- 通过反射机制实例化并调用相应方法
六、安全注意事项
虽然本文不讨论具体漏洞,但理解反射机制有助于分析Struts2漏洞:
- 动态方法调用可能带来安全隐患
- OGNL表达式注入与反射机制结合可能导致RCE
- 参数处理不当可能导致反射调用非预期方法
七、总结
Struts2框架通过以下方式实现请求到Action的映射:
- 配置文件定义映射关系(struts.xml)
- 反射机制动态创建Action实例
- 反射调用Action方法
- 拦截器链处理请求和响应
理解这一机制对于深入分析Struts2框架行为和安全问题至关重要。