Ubuntu下解决JSP跨域问题的常见方法
过滤器是Java Web应用中处理跨域的经典方式,通过拦截所有请求,在响应头中添加CORS相关字段,允许指定来源的跨域访问。
javax.servlet.Filter接口,在doFilter方法中设置响应头(支持所有来源、常用HTTP方法及头部):import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CORSFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*"); // 允许所有来源(生产环境建议替换为具体域名)
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT"); // 允许的HTTP方法
response.setHeader("Access-Control-Max-Age", "3600"); // 预检请求缓存时间(秒)
response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With"); // 允许的请求头
chain.doFilter(req, res); // 继续处理请求
}
@Override
public void init(FilterConfig filterConfig) {} // 初始化方法(无需实现)
@Override
public void destroy() {} // 销毁方法(无需实现)
}
<filter>
<filter-name>CORSFilter</filter-name>
<filter-class>com.yourpackage.CORSFilter</filter-class> <!-- 替换为过滤器类的全限定名 -->
</filter>
<filter-mapping>
<filter-name>CORSFilter</filter-name>
<url-pattern>/*</url-pattern> <!-- 拦截所有URL -->
</filter-mapping>
@WebFilter注解:import javax.servlet.annotation.WebFilter;
@WebFilter(urlPatterns = "/*") // 拦截所有URL
public class CORSFilter implements Filter {
// 过滤器实现代码(同上)
}
若项目基于Spring(如Spring Boot、Spring MVC),可通过WebMvcConfigurer接口快速配置CORS,无需编写过滤器。
@Configuration注解,实现WebMvcConfigurer接口,重写addCorsMappings方法:import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // 拦截所有路径
.allowedOrigins("*") // 允许所有来源(生产环境建议替换为具体域名)
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 允许的HTTP方法
.allowedHeaders("*") // 允许所有请求头
.maxAge(3600); // 预检请求缓存时间(秒)
}
}
@CrossOrigin注解:import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@CrossOrigin(origins = "*") // 允许所有来源(可替换为具体域名)
public class MyController {
@GetMapping("/hello")
public String hello() {
return "Hello from JSP!";
}
}
通过Nginx作为反向代理,将跨域请求转发到JSP应用服务器(如Tomcat),并在Nginx配置中添加CORS头,避免直接修改Java代码。
/etc/nginx/sites-available/your-site),在location块中添加CORS头:server {
listen 80;
server_name your-domain.com; // 替换为你的域名或IP
location / {
proxy_pass http://localhost:8080; // 转发到JSP应用服务器(如Tomcat默认端口8080)
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 添加CORS头
add_header 'Access-Control-Allow-Origin' '*' always; // 允许所有来源(生产环境建议替换为具体域名)
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PUT' always; // 允许的HTTP方法
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With' always; // 允许的请求头
add_header 'Access-Control-Max-Age' 1728000 always; // 预检请求缓存时间(秒)
}
}
sudo systemctl restart nginx
Access-Control-Allow-Origin设置为*(允许所有来源)仅适用于测试环境。生产环境中,应将*替换为具体的域名(如http://example.com),避免非法域名访问。通过以上方法,可在Ubuntu环境下有效解决JSP应用的跨域问题,根据项目架构选择最适合的方式即可。