Java服务器端如何实现跨越
作者:互联网
我们开发H5项目,通过JS调用某个远程接口时经常会出现这跨域的问题,一般的解决办法就是在服务器增加对请求头的判断。
这里我们讲一下在java中通过filter过滤器如何实现;当然,你也可以在nginx中配置,或者使用jsonp实现。
1、假如我命名为:CorsFilter.java
public class CorsFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse res = (HttpServletResponse) response; res.setContentType("application/json;charset=UTF-8"); res.setHeader("Access-Control-Allow-Origin", "*"); res.setHeader("Access-Control-Allow-Methods", "POST, GET"); res.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type"); res.setHeader("Access-Control-Max-Age", "604800"); chain.doFilter(request, response); /* 跨域配置说明 * Access-Control-Allow-Origin 设置允许跨域的白名单,在白名单里的跨域请求是允许的。 * Access-Control-Allow-Methods 设置接受的方法,这里只接受POST方法。 * Access-Control-Allow-Headers 设置接受的请求头,用逗号分隔。 * Access-Control-Allow-Max-Age 设置预检的有效期,单位为秒。发送正式请求前,浏览器会预先发送一个预检请求,如果服务器返回了上述信息,表明是可以跨越请求的,然后才会正式发送请求。预检成功后,在有效期内就不用再发送了。 * Access-Control-Allow-Credentials 设置是否允许客户端携带验证信息 */ } @Override public void destroy() { // TODO Auto-generated method stub } }
这里我们提一下:Access-Control-Allow-Origin 这个配置,他是表示允许的白名单,“ * ” 表示不限。
这是一种比较粗暴的设置,容易引起DDOS攻击,所以,最好还是进行指定域名,如:Access-Control-Allow-Origin: "http://www.domain.com/"
但是,如果有多个域名怎么办?这里需要做一下判断,动态赋一下值。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse res = (HttpServletResponse) response; String[] allowDomain = {"http://www.domain1.com", "http://www.domain2.com"}; Set<String> allowedOrigins = new HashSet<String>(Arrays.asList(allowDomain)); String originHeader = ((HttpServletRequest) request).getHeader("Origin"); if (allowedOrigins.contains(originHeader)) { res.setHeader("Access-Control-Allow-Origin", originHeader); res.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); res.setHeader("Access-Control-Max-Age", "3600"); res.setHeader("Access-Control-Allow-Headers", "content-type, x-requested-with"); res.setHeader("Access-Control-Allow-Credentials", "true"); } chain.doFilter(request, response); }
2、在web.xml中配置如下
<!-- 跨域过滤器 --> <filter> <filter-name>cors</filter-name> <filter-class>com.domian.controller.filter.CorsFilter</filter-class> </filter> <filter-mapping> <filter-name>cors</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
标签:Control,Access,Java,服务器端,Origin,res,跨越,Allow,setHeader 来源: https://www.cnblogs.com/hunttown/p/15587231.html