博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring常见开发问题解决(乱码,异常)
阅读量:6484 次
发布时间:2019-06-23

本文共 3718 字,大约阅读时间需要 12 分钟。

1、如何解决中文接收乱码问题

对用于Post请求:

(1)方法参数列表中含有request对象,则直接在调用request.getParameter("")方法获取参数值时,先调用request.setCharacterEncoding("utf-8").

(2)若方法参数列表中不含request对象,则需要设置一个过滤器,在过滤器中调用request.setCharacterEncoding("utf-8"),在请求前处理一下request。

例如:

@Override    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)            throws IOException, ServletException {        request.setCharacterEncoding("utf-8");        chain.doFilter(request, response);    }

配置:

encodingFilter
com.zlc.controller.EncodingFilter
encodingFilter
*.do

(3)使用Spring中自带的编码过滤器:org.springframework.web.filter.CharacterEncodingFilter

配置:

encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
encodingFilter
*.do

 对于Get请求:

对于GET方式,我们知道它的提交是将请求数据附加到URL后面作为参数,这样依赖乱码就会很容易出现,因为数据name和value很有可能就是传递的为非ASCII码。

当URL拼接后,浏览器对其进行encode,然后发送到服务器。具体规则见URL编码规则。

tomcat服务器在进行解码过程中URIEncoding就起到作用了。tomcat服务器会根据设置的URIEncoding来进行解码,如果没有设置则会使用默认的ISO-8859-1来解码。假如我们在页面将编码设置为UTF-8,而URIEncoding设置的不是或者没有设置,那么服务器进行解码时就会产生乱码。这个时候我们一般可以通过new String(request.getParameter("name").getBytes("iso-8859-1"),"utf-8") 的形式来获取正确数据。

(服务器的编码方式: tomcat 设置中

<Connector port="8080"protocol="HTTP/1.1"  maxThreads="150" connectionTimeout="20000"

redirectPort="8443"URIEncoding="客户端编码"/> 默认是iso-8859-1

),服务器获取的数据都是ASCII范围内的请求头字符,其中请求URL里面带有参数数据,如果是中文或特殊字符,那么encode后的%XY(编码规则中的十六进制数)通过request.setCharacterEncoding()是不管用的。这时候我们就能发现出现乱码的根本原因就是客户端一般是通过用UTF-8或GBK等对数据进行encode的,到了服务器却用iso-8859-1方式decoder显然不行。

 

第一种:在服务器xml代码中改配置信息:

<Connector port="8080"protocol="HTTP/1.1"  maxThreads="150" connectionTimeout="20000"

redirectPort="8443"URIEncoding="客户端编码"/>    ps: 将服务器与客户端的编码方式统一  客户端不同的浏览器 编码方式不一样

第二种:

设置 URLEncoder.encode("中文","UTF-8") 将要传递的参数utf-8 编码 将其变为字节码  ,这样不管各浏览器怎样对中文参数进行处理,此时经过我们编码后的中文对浏览器来说就是字节码,与a、b、c等字母没有什么区别。 只要在服务器的用"UTF-8"解码 就能得到正确的中文;

2、如何处理异常

 (1)常规处理,controller出现异常时转向错误提示界面,例如:

@RequestMapping("exception.do")    public String execute() {        try {            String s = null;            s.length();            return "hello";        } catch (Exception e) {            return "error";        }    }

(2)(全局处理)使用Spring自带的异常处理器,可以统一处理整个应用发生的异常。例如:

在applicationContext.xml文件中配置:

error

处理过程图:

 (3)局部处理除了第二种这样的全局异常处理外,我们还可以专门为某个Controller定制化一个异常处理方法,例如在某个Controller中定义

//局部异常处理方法,若当前Controller出现异常,则会调用此方法,方法名可以随意,但参数列表必须包含一个Exception类型的参数,    //其余参数根据需要设置    @ExceptionHandler    public String handlerException(ServletRequest request,Exception e) {                        return "error";//返回的视图名    }

注意:

1、局部异常处理调用优先级高于全局异常处理

2、若当前局部异常处理可以处理当前抛出的异常类型,则不会去调用全局的异常处理,但是若当前局部异常处理无法处理抛出的异常类型,那么这个异常还是会传递到全局异常处理去处理

(4)自定义ExceptionResolver

public class MyExceptionResolver implements HandlerExceptionResolver{    @Override    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object method,            Exception e) {        //将异常信息写入文件,代码省略        //返回视图名        ModelAndView mac = new ModelAndView();        System.out.println(e.getClass());        mac.setViewName("error");        return mac;    }    }

在applicationContext.xml中配置使用自定义的ExceptionResolver

这样就可以使用自定义的异常处理了

 

转载于:https://www.cnblogs.com/zlingchao/p/9418149.html

你可能感兴趣的文章
悲观的思考,乐观的生活.我们既需要思考的深度,也需要生活的温度!
查看>>
Vitamio中文API文档(4)—— VitamioInstaller
查看>>
yii框架常用url地址
查看>>
python3.4学习笔记(十六) windows下面安装easy_install和pip教程
查看>>
MyGUI 解析
查看>>
Linux中的ls命令详细使用
查看>>
graph-tool文档(一)- 快速开始使用Graph-tool - 2.属性映射、图的IO和Price网络
查看>>
GraphicsLab Project之辉光(Glare,Glow)效果 【转】
查看>>
Linux Curl命令
查看>>
-27979 LoadRunner 错误27979 找不到请求表单 Action.c(73): Error -27979: Requested form not found...
查看>>
[LeetCode] Minimum Depth of Binary Tree
查看>>
,net运行框架
查看>>
Java 中 Emoji 的正则表达式
查看>>
Mixin Network第一届开发者大赛作品介绍- dodice, diceos和Fox.one luckycoin
查看>>
安卓Glide(4.7.1)使用笔记 01 - 引入项目
查看>>
中金易云:为出版社找到下一本《解忧杂货店》
查看>>
Flex布局
查看>>
Material Design之 AppbarLayout 开发实践总结
查看>>
Flutter之MaterialApp使用详解
查看>>
DataBinding最全使用说明
查看>>