Java服务器端跨域问题解决方案
这篇文章主要介绍了java服务器端跨域问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
现在很多开发的API都支持ajax直接请求,这样就会导致跨域的问题,解决跨域的问题一方面可以从前端,另一方面就是服务器端。
一、Controller类名上方添加@CrossOrigin注解通过此方式注解则Controller中的所有通过@RequestMapping注解的方法都可以进行跨域请求。代码如下:
@CrossOrigin() @RequestMapping("/demoController") @Controller publicclassDemoController{ @Autowired IDemoServicedemoService; @RequestMapping(value="/test",method=RequestMethod.POST) @ResponseBody publicResultModeltest(HttpServletRequestrequest) throwsException{ return“right”; } }
二、让所有的controller类继承自定义的BaseController类,该类中将对返回的头部做些特殊处理。
publicabstractclassBaseController{ /** *description:sendtheajaxresponsebacktotheclientside *@paramresponseObj *@paramresponse */ protectedvoidwriteAjaxJSONResponse(ObjectresponseObj,HttpServletResponseresponse){ response.setCharacterEncoding("UTF-8"); response.setHeader("Cache-Control","no-cache,no-store,must-revalidate");//HTTP1.1 response.setHeader("Pragma","no-cache");//HTTP1.0 /** *forajax-cross-domainrequestTODOgettheipaddressfrom *configration(ajax-cross-domain.properties) */ response.setHeader("Access-Control-Allow-Origin","*"); response.setDateHeader("Expires",0);//Proxies. PrintWriterwriter=getWriter(response); writeAjaxJSONResponse(responseObj,writer); } /** * *@paramresponse *@return */ protectedPrintWritergetWriter(HttpServletResponseresponse){ if(null==response){ returnnull; } PrintWriterwriter=null; try{ writer=response.getWriter(); }catch(IOExceptione){ logger.error("unknowexception",e); } returnwriter; } /** *description:sendtheajaxresponsebacktotheclientside. * *@paramresponseObj *@paramwriter *@paramwriter */ protectedvoidwriteAjaxJSONResponse(ObjectresponseObj,PrintWriterwriter){ if(writer==null||responseObj==null){ return; } try{writer.write(JSON.toJSONString(responseObj,SerializerFeature.DisableCircularReferenceDetect)); }finally{ writer.flush(); writer.close(); } } } 接下来就是我们自己业务的controller了,其中主要是要调用writeAjaxJSONResponse(result,response);这个方法 @Controller @RequestMapping(value="/account") publicclassAccountControllerextendsBaseController{ @RequestMapping(value="/add",method=RequestMethod.POST) publicvoidaddAccount(HttpSessionsession,HttpServletRequestrequest,HttpServletResponseresponse){ ViewerResultresult=newViewerResult(); //实现自己业务逻辑代码 writeAjaxJSONResponse(result,response); } } 好了,这种简单的方式就实现了。
三、Filter,我们在写springMVC的时候,更喜欢的方式是通过@ResponseBody给返回对象进行封装直接返回给前端,这样简单而且容易。如果使用@ResponseBody就不能使用第一种方法了,所有就使用filter给所有的请求都封装一下跨域,接下来直接实现代码:
importjava.io.IOException; importjavax.servlet.Filter; importjavax.servlet.FilterChain; importjavax.servlet.FilterConfig; importjavax.servlet.ServletException; importjavax.servlet.ServletRequest; importjavax.servlet.ServletResponse; importjavax.servlet.http.HttpServletResponse; publicclassHeadersCORSFilterimplementsFilter{ @Override publicvoidinit(FilterConfigfilterConfig)throwsServletException{ //TODOAuto-generatedmethodstub } @Override publicvoiddoFilter(ServletRequestrequest,ServletResponseservletResponse, FilterChainchain)throwsIOException,ServletException{ HttpServletResponseresponse=(HttpServletResponse)servletResponse; response.setHeader("Access-Control-Allow-Origin","*"); response.setHeader("Access-Control-Allow-Methods","POST,GET,OPTIONS,DELETE"); response.setHeader("Access-Control-Max-Age","3600"); response.setHeader("Access-Control-Allow-Headers","x-requested-with,Authorization"); response.setHeader("Access-Control-Allow-Credentials","true"); chain.doFilter(request,servletResponse); } @Override publicvoiddestroy(){ //TODOAuto-generatedmethodstub } } 好了,filter实现了,然后就是要在web.xml里面把这个filter运用起来了。 打开项目的web.xml,填写下面的几行代码: cors xxx.xxxx.xxxxx.xxxx.HeadersCORSFilter cors /open/* 好了,通过上面的3种方式,可以解决百分之80的跨域问题,也许还有更好的解决方案,可以提出来大家一起学习学习。 最好的方案是最符合当前需求且易于扩展的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。