如何设置javax.servlet.http.HttpServlet 的跨域问题
时间: 2024-10-16 09:21:11 浏览: 30
天学成javax
在`javax.servlet.http.HttpServlet`中处理跨域问题通常涉及到响应头管理,允许来自特定源的HTTP请求访问服务器资源。以下是如何通过`HttpServletResponse`对象来设置CORS(Cross-Origin Resource Sharing)策略:
1. **设置允许的来源**:
```java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException {
// 获取请求的Origin头部信息
String origin = request.getHeader("Origin");
// 如果请求的源不在允许的列表中,添加Access-Control-Allow-Origin响应头
if (origin != null && !allowedOrigins.contains(origin)) {
allowedOrigins.add(origin);
}
// 设置Access-Control-Allow-Origin
response.setHeader("Access-Control-Allow-Origin", origin);
// 其他CORS属性如Access-Control-Allow-Methods、Access-Control-Allow-Headers等也可以在这里设置
// 响应正文...
...
}
private List<String> allowedOrigins = new ArrayList<>();
```
2. **处理预flight请求(OPTIONS)**:
跨域请求可能先发送一个OPTIONS请求以确认是否可以执行实际请求。如果允许跨域,应该返回一个简单的响应(204 No Content),并且允许特定的请求方法。
```java
@Override
protected void doOptions(HttpServletRequest request, HttpServletResponse response) throws ServletException {
response.setStatus(HttpServletResponse.SC_OK);
response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
response.setHeader("Access-Control-Allow-Headers", "Content-Type");
response.setHeader("Access-Control-Max-Age", "3600"); // 1小时缓存
response.setHeader("Access-Control-Allow-Credentials", "true"); // 如果需要传递身份凭证
response.setHeader("Access-Control-Allow-Origin", "*"); // 返回到任意源,但最好限制为实际允许的源
response.getWriter().flush();
}
```
记住,这只是一个基本示例,生产环境中可能需要更复杂的策略,比如基于黑名单/白名单的控制。此外,`*`通配符通常是开发阶段临时使用的,生产环境应替换为实际允许的域名。
阅读全文