Hibernate在远程服务器上输出抓取的中文字符



我在springmvc中创建了一个应用程序接口,并使用@Pathvariable来接受用户的输入,下面是我的@Controller代码片段:

@RequestMapping(value = "/getFirst/{var}", method = RequestMethod.GET)
public @ResponseBody String getFirst(@PathVariable String var){
    String fr = "select * from Food f where f.resname like '%" + var + "%'";
    List<Site> siteList = siteService.findBySQL(fr);
    Site first = siteList.get(0);
    return first.getSrc();
}

我把我的应用程序部署在本地tomcat服务器上,输入url http://localhost:8080/springmvc/getFirst/鸡排,结果正常。

但是当我将应用程序部署到远程tomcat服务器并输入相同的参数http://xxx.xx.xx.xxx:8080/springmvc/getFirst/鸡排时,得到以下异常:

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
java.util.ArrayList.rangeCheck(ArrayList.java:635)
java.util.ArrayList.get(ArrayList.java:411)
cn.crabime.StudentController.getFirst(StudentController.java:99)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
cn.crabime.filter.FoodFilter.doFilter(FoodFilter.java:22)

首先,我认为可能是中文字符编码的问题,但我已经定义了一个FoodFilter来拦截输入url,发现中文字符已经被编码。

第二,我认为这是休眠处理汉字问题,但你可以看到本地服务器工作正常,所以它应该不是。但我注意到最令人印象深刻的地方,当使用本地服务器时,IntelliJ idea正常输出hibernate生成的sql语句,并且中文字符没有抓取,但在远程服务器中像这样:

    当前用户请求的url为http://139.129.229.46:8080/springmvc/getFirst/%E9%B8%A1%E6%8E%92
last slice is :鸡排
Hibernate: select * from Food f where f.resname like '%鸡æ%'

但我不知道为什么?

好了,这个问题我自己解决了,这里有一篇关于tomcat处理乱码问题的文章。因为tomcat默认的字符编码是iso-8859-1,这样的编码方式会造成中文字符乱码,所以到远程tomcat服务器conf文件夹修改如下代码段:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
            maxThreads="2000"
            minSpareThreads="100"
            maxSpareThreads="1000"
            acceptCount="1000"
            URIEncoding="UTF-8" />

注意:URIEncoding必须指定为'UTF-8'

最新更新