java SSM 解決跨域問題
阿新 • • 發佈:2018-01-13
gpo XML span err mapping 項目 rri destroy jsonp
什麽是跨域
跨域是指從一個域名的網頁去請求另一個域名的資源。比如從www.baidu.com 頁面去請求 www.google.com 的資源。跨域的嚴格一點的定義是:只要 協議,域名,端口有任何一個的不同,就被當作是跨域
前段時間接觸一個新的項目,原本想著做成前後端分離的,但是這樣就會涉及到 ajax 跨域的問題,那時候沒解決,所以就沒搞前後端分離,但是今天的項目又接觸到跨域(前後端分離的問題),研究了一晚上,查了很多資料,也跟一些前輩溝通過,用的方法都不同,
有人說用谷歌的插件,有人說用Nginx 做個反向代理,更有人說,用 JSONP 的方式,這這些個方法都可行,可是操作難度有點大啊,第一個先不說,要FQ出去才能下載安裝,第二個,對於很多新手來說,更是難以理解,
第三個, JSONP 只能是使用 get 方式請求數據,可是我們用 get 方式去請求數據的,這都是少數情況吧?所以,我綜合了一下,希望能幫到更多的小夥伴!
這個配置允許跨域完全是在我們 後臺的事,跟前端無關,我所用的後端框架是 SSM (其實也就是 Spring 的問題),其他框架的,請繞道!!!!(有接觸 Nutz 框架的,這個框架的跨域更加簡單,加一個註解就行了:@Filters(@By(type=CrossOriginFilter.class)))
好了,廢話多了,言歸正傳,其實就 三部曲 就可以了,
1. 新建一個過濾器,並實現 Filter 接口
請註意導包!!!!
publicclass SimpleCORSFilter 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); } }
2. 在web.xml中設配置
<!-- 跨域請求 --> <filter> <filter-name>SimpleCORSFilter</filter-name> <filter-class>com.ssm.util.SimpleCORSFilter</filter-class> <init-param> <param-name>IsCross</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>SimpleCORSFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
3. 在 StringMVC 的配置文件中配置跨域請求
<!-- 接口跨域配置 --> <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>
Spring MVC 的跨域配置,到此結束,前端不用改任何東西,正常的使用 ajax 即可
java SSM 解決跨域問題