温馨提示×

ActionContext如何处理跨域请求

小樊
81
2024-10-10 06:16:47
栏目: 编程语言

ActionContext 是 Struts2 框架中的一个核心组件,它封装了与当前请求相关的所有信息。在处理跨域请求时,可以使用 ActionContext 来设置和获取请求的头部信息、参数等。

以下是一个简单的示例,说明如何使用 ActionContext 处理跨域请求:

  1. 首先,确保你的项目中已经引入了 Struts2 相关的依赖。

  2. 在你的 Struts2 动作类中,获取 ActionContext 实例:

import com.opensymphony.xwork2.ActionContext;

public class MyAction {
    public String execute() {
        // 获取 ActionContext 实例
        ActionContext actionContext = ActionContext.getContext();

        // ...
    }
}
  1. 设置跨域请求的头部信息。例如,设置 Access-Control-Allow-Origin
import javax.servlet.http.HttpServletResponse;

public class MyAction {
    public String execute() {
        // 获取 ActionContext 实例
        ActionContext actionContext = ActionContext.getContext();

        // 获取 HttpServletResponse 对象
        HttpServletResponse response = (HttpServletResponse) actionContext.get("request").getResponse();

        // 设置跨域请求的头部信息
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");

        // ...
    }
}
  1. 如果需要处理预检请求(OPTIONS 请求),可以在动作类中添加一个处理预检请求的方法:
public class MyAction {
    public String execute() {
        // ...
    }

    public String options() {
        // 获取 ActionContext 实例
        ActionContext actionContext = ActionContext.getContext();

        // 获取 HttpServletResponse 对象
        HttpServletResponse response = (HttpServletResponse) actionContext.get("request").getResponse();

        // 设置跨域请求的头部信息
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");

        // 返回成功响应
        return "success";
    }
}
  1. 配置 Struts2 动作映射,将预检请求映射到 options 方法:
<struts>
    <package name="default" extends="struts-default">
        <action name="myAction" class="com.example.MyAction">
            <interceptor-ref name="defaultStack"></interceptor-ref>
            <result name="success">/success.jsp</result>
            <result name="input">/input.jsp</result>
            <param name="method">options</param>
        </action>
    </package>
</struts>

现在,当客户端发起跨域请求时,服务器会正确处理并返回相应的响应。

0