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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。