ERR_EMPTY_RESPONSE这个问题折磨了我好久,还是不知道为什么,有网友知道了希望能指点下。
问题已解决,但具体原因还不清楚。
在项目中我们后台使用的是spring+Hibernate,最开始做查询的时候是前端直接把查询的条件写好作为数据传到后台,例如前端传递数据:
var data = {currentPage: page - 1, pageSize: size, q: "issource=0"};
上面的q就是查询语句,这样写的时候并没有出现什么问题,一切都挺好的,但是当用户的要求变的复杂,要求进行统计和排序的时候,问题就出现了,当查询语句变为:
SELECT count(*), AUDITOR FROM YBU_EQ_GIVESOURCENEWS WHERE AUDITOR IS NOT NULL GROUP BY AUDITOR
我们传递给后台的data.q变为:
AUDITOR IS NOT NULL GROUP BY AUDITOR
问题就出现了,多了group by 语句后就报错了,错误为ERR_EMPTY_RESPONSE,或者语句多了order by之后,还是同样的错误。百思不得其解,在本机和测试服务器上没有问题,在用户服务器上就出现问题了,因为我对spring和Hibernate不是很熟,不太了解它们的运行机制。最后一个同事说让前端只传递字段,后台对group by及order by进行拼接。,问题解决了。。。
前端传递:
{
likeString:"华北",
q:"issource=0",
sortString:[
"PUBLISHDATE",
"ASC"
]}
后端处理部分代码为:
//获取q
String where = requestPage.getQ()==null||requestPage.getQ().equals("")?"1=1":requestPage.getQ();
//获取sortString
String sortString[]=requestPage.getSortString();
//获取likString
String likString=requestPage.getLikeString();
//语句有两条,具体查询语句和记录总数
StringBuffer[]stBuffers=new StringBuffer[2];
//sql,具体查询语句
stBuffers[0]=new StringBuffer("from Eq_AllInternet u where ");
//sqlCount,记录总数
stBuffers[1]=new StringBuffer("select count(*) from Eq_AllInternet u where ");
for(int i=0;i<stBuffers.length;i++){
stBuffers[i].append(where);
//如果likString不为空,添加到查询字符串中,模糊查询
if(likString!=null && !likString.isEmpty()){
stBuffers[i].append(" AND title LIKE '%");
stBuffers[i].append(likString);
stBuffers[i].append("%'");
}
//如果sortString不为空,添加到查询字符串中,排序
if(sortString!=null && sortString.length>0){
stBuffers[i].append(" order by ");
stBuffers[i].append(sortString[0]);
stBuffers[i].append(" ");
stBuffers[i].append(sortString[1]);
}
}
//具体查询语句
String sql=stBuffers[0].toString();
//统计总数查询语句
String sqlCount = stBuffers[1].toString();
出现这种问题,个人感觉应该是服务器的设置问题,对可能的sql注入进行了拦击,因此无法直接传递group by , order by等语句进行查询,因此只能传递相关语句然后在后台进行语句拼接。
不知道是不是这样,虽然感觉在后台进行语句拼接也不对,并且在直接传递group by等语句的时候,服务器对访问进行了拦截,tomcat没有显示hibernate查询语句,controller似乎也没有进去。问题很大,慢慢学习吧,java web不熟真是被弄的团团转,一个问题搞了几天了,以后知道了具体原因再来修改吧。以上。