Java SSM框架中解决跨域请求、内网其它ip访问的四种办法
程序员文章站
2022-03-18 17:08:44
...
Java SSM框架中解决跨域请求、内网其它ip访问的四种办法
SSM框架推荐使用方法一、方法二,这样简单,一行代码一步骤搞定。
传统Servlet开发只能使用方法三、方法四。
个人博客网站:http://www.hezepeng.com (开发中,预计2019年8月上线)
GitHub:https://github.com/Hezepeng
方法一:最简单的解决方法——注解
SpringMVC 4.2以后支持@CrossOrigin注解。
SpringBoot完全支持。
直接在Controller类或者Request函数前加上@CrossOrigin
注解即可允许所有ip跨域访问
加在Controller类上表示该Controller的所有方法都支持跨域
加在Controller中的Request函数上表示仅该函数支持跨域
@CrossOrigin //允许所有ip跨域
@CrossOrigin(origins = "192.169.1.105") //只允许指定ip跨域
只需要这一个配置就能支持跨域访问。allowed-origins="*"
就是配置运行哪些地址访问,“*”
表示允许所有地址访问,这里也可以换成内网ip之类的。
方法二:在SpringMVC配置文件spring-config.xml中配置跨域
方法二也非常简单,只需一步。
<!-- 接口跨域配置 -->
<mvc:cors>
<mvc:mapping path="/**"
allowed-origins="*"
allowed-methods="POST, GET, OPTIONS, DELETE, PUT"
allowed-headers="Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"
allow-credentials="true" />
</mvc:cors>
只需要这一个配置就能支持跨域访问。allowed-origins="*"
就是配置运行哪些地址访问,“*”
表示允许所有地址访问,这里也可以换成内网ip之类的。
方法三:使用cors-filter包配置跨域
其实就是引用这个包里面的写的filter,个人觉得没必要,又要引入包,相比方法四,其实仅仅只省略了一个crosFilter.class文件,还是需要在web.xml里面配置Filter。
##第一步:先引入pom.xml依赖
<dependency>
<groupId>com.thetransactioncompany</groupId>
<artifactId>cors-filter</artifactId>
<version>2.5</version>
</dependency>
第二步 在web.xml中注册Filter
<!-- 跨域过滤器 -->
<filter>
<filter-name>CORS</filter-name>
<filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
<init-param>
<param-name>cors.allowOrigin</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.supportedMethods</param-name>
<param-value>GET, POST, HEAD, PUT, DELETE</param-value>
</init-param>
<init-param>
<param-name>cors.supportedHeaders</param-name>
<param-value>Accept, Origin, X-Requested-With, Content-Type, Last-Modified</param-value>
</init-param>
<init-param>
<param-name>cors.exposedHeaders</param-name>
<param-value>Set-Cookie</param-value>
</init-param>
<init-param>
<param-name>cors.supportsCredentials</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CORS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
搞好以上两步就能支持跨域请求
方法四:自己写CorsFilter
在传统的Servlet开发中,应该都是这样来配置跨域的。
第一步:写CorsFilter类
public class CorsFilter implements Filter {
private boolean isCross = false;
@Override
public void destroy() {
isCross = false;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
if (isCross) {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
System.out.println("拦截请求: " + httpServletRequest.getServletPath());
httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
httpServletResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
httpServletResponse.setHeader("Access-Control-Max-Age", "0");
httpServletResponse.setHeader("Access-Control-Allow-Headers",
"Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token");
httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true");
httpServletResponse.setHeader("XDomainRequestAllowed", "1");
}
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
String isCrossStr = filterConfig.getInitParameter("IsCross");
isCross = isCrossStr.equals("true") ? true : false;
System.out.println("跨域开启状态:"isCrossStr);
}
}
第二步:在web.xml中注册CorsFilter
<!-- 跨域请求 -->
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>com.hezepeng.filter.CorsFilter</filter-class>
<init-param>
<param-name>IsCross</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
搞好以上两步就能支持跨域请求。
上一篇: Zabbix 5.0 LTS部署