00:00
好,那下面呢,咱们先来演示一下这个乱码的问题,首先呢,大家注意,那我们当前咱们传输请求参数的时候,因为咱们的请求,咱们发送的请求啊,有两种方式,一种是get,一种是post。一种是get,一种是post啊,我先说一下我们现在用的tomcat呀,大家可以看一下啊哦,这是tomcat7.0是吧,好,那我们就测试一下啊,大家注意,然后我们现在呢,然后我们这样啊,然后咱们把咱们的浏览器给打开,然后这个地方咱们来刷新用户名,咱们来写个张三,然后密码123,好点击登录大家看啊好,咱们往下。然后大家注意,你看这用户名是什么问号,我们现在咱们的请求方式是啥呀?是get是post,那如果我现在我把它给改成了get的话,大家注意,然后这个时候它会有乱码吗?大家看好,它这个时候也是会有乱码的,大家听好了啊,我再说一遍,我在这用的是Tom k7。
01:01
然后我们现在咱们来一个刷新,好,然后这个呢是张三,这是123点击登录,然后我们再来看咱们这里面的一个内容,大家看啊,你看这张三是乱码,不是不是乱码,这是因为我设置过。知道吧,好,比如说呀,然后我们现在咱们把咱们的这个tomcat给打开,然后我们来找到TOMCA7,然后我们找到框下面的这个serveber,然后点叉L,大家注意,咱们来点击编辑好,然后我们往下找啊,咱们找到哪个位置,找到这个位置啊,71行的这个位置,大家注意啊,就在这,为什么我们当前咱们的get请求tomcat7.0里面,其实它的get跟post都有乱码问题。OK吧,好,然后为什么我们当前咱们所使用的TOMCAT7没有乱码问题,大家注意,那是因为我已经配置过了,咱们在server点叉ML中,我们需要在71行的这个设置咱们的tomcat的端口号的位置,咱们要加上一个属性叫uri in coding等于UTF杠八。
02:07
大家注意,我主要是加上了这个属性,所以说get才没有乱码的。能听懂不好,那所以如果大家要把这个东西删掉的话,然后大家注意现在咱们的这个get的请求所获取的请求参数也是乱码。好啊行,那POS的话它都有乱码,不管是咱们的8.5也好,还是to k7也好,你的POS的请求它都是有乱码的啊行,那这个大家注意,那我现在呢,我把这个东西给它关掉,然后呢,我们现在呢,咱们再来测试我们的tomcad8.5。好,Tomcat其中呢,大家听好了啊,然后get和post都会有乱码,然后get的乱码怎么解决,你去找到咱们的tomcat的server,点叉L这个配置文件,然后在我们当前咱们的这个设置端口号的这个标签里面加上一个uri encoding等于UTF杠八就行。
03:02
好,这个大家去网上随便查就能查到的啊,OK吧,好,然后那如果我们,但是咱们的7.0里面这个post的这个乱码,我们该如何解决,大家必须要去设置request.set char recordcoding,哎,大家必须设置这样的一句话,好,那我们现在如果我们用的是tomcat8.5呢?大家注意,比如说我把它给选成是这个好,然后当我把它设置为tomca8.5的时候,8.5里面get它是没有乱码的,它只有posts的情况才会有乱码,比如说我现在我来重启一下啊,因为咱们的tomcat咱们都换了,所以说咱们重启一下。好,然后这个get大家注意它也是没有乱码的啊,但是你要记好,8.5是直接解决了get的乱码问题,但是七的话是没有解决乱码的问题的,大家必须要去配置一下啊啊。行,然后那我们现在咱们来进行一个测试,然后这咱们写张三,然后123记好这现在这是get知道吧,来然后大家看一下有乱码吗?没有,但是如果我现在我把咱们的这个页面中,咱们付用表单提交的这个提交方式改成POS的,大家看啊,现在它仍然是有乱码的,来咱们再来一个重新部署。
04:19
好,现在所以说我们现在主要来解决的就是咱们的post提交的时候,Post请求方式的时候,它的一个乱码问题,获取请求参数的一个乱码问题,啊好,我们现在再来刷新,然后呢,这是张三,这是123点击登录,大家看一下,看是不是还有乱码呀,怎么解决,刚才跟大家说了,你肯定不能说我在这里面怎么地,然后手动的给它添加一个什么,设置一个request类型的行参,然后通过request set char recordcoding来设置咱们的这个编码吗?行不行,不行,为啥?因为你要知道我们当前的这个请求对象是谁给我们的,是dispat solve给我们的,所以说在dispatch of里面,它已经获取了咱们的请求参数了,那你在这你再来设置请求的编码行不行,不行,你哪怕你在这设置完编码之后,你再手动去获取请求参数,它仍然也是没有效果的,为什么?记好一句话啊,设置编码之前一定。
05:20
不能来获取任何的请求参数,如果你设获取了任何的请求参数,那你所设置的编码是没有任何功能的。OK吧,行,那这个问题咱们该如何解决,大家看啊,咱们把web点叉苗给打开,然后我们当前的spring呢,为我们提供了一个过滤器,那其实这个过滤器咱们之前也写过,只不过咱们写的是一个类似的一个过滤器啊,什么处理编码的过滤器。对吧,大家是怎么做的,大家想想我们之前咱们是不是可以去扭一个filter,然后在我们的过滤器的do filter里面,然后来设置咱们的请求的编码,设置咱们响应的编码对不对,然后再去注册过滤器的时候,在web的XL中注册过滤器的时候,然后让我们当前的过滤器来过滤所有的请求,是不是就完事了呀?
06:09
对不对?好,那这个过滤器我们现在需要自己写吗?不需要,然后我们现在呢,这个spring为我们所提供的有这个过滤器,那所以我们直接在这个位置,大家注意啊,叫做filter,设置一个过滤器叫啥?一会儿再写啊filter class叫什么?叫做characterco filter。大家看啊,叫做characterco filter,叫做编码过滤器,然后呢,这个地方呢,咱们就跟它的类名保持一致呗,然后在这大家注意啊,咱们的filter mapping char including filter URL pattern杠性同样也是对咱们所有的请求来进行处理,对吧?处理编码,然后这个是来配置咱们spring rain的,什么叫做编码过滤器,哎,叫做编码过滤器,那当然咱们这样去配置行不行,大家注意不行,为什么?因为我们当前咱们的这个就是我们所使用的这个框架,它是有默认的编码的,所以说我们在这还需要来设置一个自定义的编码,怎么写?看好我们需要来设置一个in类per叫做初始化参数,然后参数名叫什么?Enco叫做encoding,然后在这来写一个utf杠八,大家注意,完事,这就是我们当前咱们自定义的一个编码。
07:30
UTF杠八。OK吧,好,当然呢,我们在这还需要来设置一个属性,大家注意叫做初始化参数,不叫属性啊,叫初始化参数,然后这个初始化参数叫什么?叫for,叫做force encoding。叫做force encoding,然后在这咱们需要来写个true,有团老师,这个东西又是干什么的?大家听好,如果你只设置这个初始化参数,那我们当前咱们只会来设置请求的编码,也就是说它只会来设置request set characterco utf杠八。如果我们把这个也设置上,大家注意,它不单会设置请求的编码,还会设置响应的编码,response.set record including utf杠八。
08:17
OK吧,所以说我建议大家把这两个初始化参数都加上。都加上啊,那没有什么难的,这东西你这一次是这样去写的,以后咱们只要来设置这个编码,大家都是这样去写的,知道不好啊行,那我们在这儿咱们简单的看一下咱们的这个过滤器的源码啊,大家注意挺简单的啊。首先呢,这个过滤器啊,大家看它确实是一个过滤器,但是它继承的是谁叫做once once per request filter,跟咱们之前看到的是不是不太一样,我们之前创建过滤器直接来实现的就是过滤器的接口filter。对吧?好,那我们来看,那它不是直接实现这个接口,它一定是间接实现的,好大家看一下,你看它又继承了gene filter b,然后它呢,是不是就实现了咱们的filter接口,对不对?那所以说咱们简单的来看一下就行,来那大家看好,那这是咱们当前的这个编码过滤器,然后我们来看啊,咱们把alt加七给它打开,就是当前咱们的这一个类中的结构,你打开之后啊,大家有没有发现咱们当前咱们的过滤器的生命周期三个方法init,错是初始化和销毁,还有一个叫做do filter是来执行过滤,但是你看咱们这里面有do filter方法吗?
09:36
因为初始化跟销毁咱们都不需要去看,我们主要来看的就是它怎么进行过滤的,但是大家会发现这里面看有个叫do filter,有do filter方法吗?没有,那说明什么?你只要看到这个问题啊,大家注意,那一定是我们在当前继承的过程中,然后我们对咱们的do filter方法来进行了重写啊,好,然后重写之后,然后他去调用了另外一个方法来实现的过滤,一定是这样的啊,来,咱们看一眼呗,来。
10:07
来大家注意啊,这是我们当前咱们的这个方法啊,然后咱们把这个也给它打开好,这里面do filter是来处理我们当前咱们的一个执行过滤的,对不对?好,那我们来找到它的一个实现类。大家看这里面有没有do filter啊来。大家看一下啊,这里面有没有do filter。啊。是不是没有啊。大家看。有杜filter方法吗?没有,没有的话,那说明它没有重写,那它继承了它,那咱们再往下找呗,大家看杜filter是不是就有了,对不对?你看在这最后它的箭头指向的是谁?指向的是filter,那所以说它在这来重写的是咱们的filter接口中的方法,对不对?好啊,行,然后咱们找到do further方法,大家看到都干了点什么啊,然后这个大家应该都认识对不对?然后他呢,将我们当前的request给转换成了https of letter request,将这个response转换成了http of letter response,然后再往下的话,你看这句话是什么意思,Future China do filter放行,然后满足这个条件放行,然后如果说这个不满足这个条件的话,对吧?然后大家注意你看在这else if里面也是放行对不对,满足这个条件也是放行,然后呢,如果说这两个条件都不满足,大家看你看它干嘛了,哎,是不是调用了一个do filter。
11:35
和方法,所以说呀,咱们在我们生命周期这个执行过滤的过程中,在这个类里面是不是就已经把我们的度filter方法进行了重写,最终由谁来执行过滤,叫do filter internal,执行过滤请求对象,响应对象,还有一个是过滤器量,对吧?所以说啊,这个方法里面就是我们刚才看到的do filter internal,然后来实现的过滤。再说了,其实这也好找,对不对,你看看哪一个方法里面有三个参数。
12:06
一个请求,一个响应,一个过滤器链就完事了,大家说是不是你执行过滤的方法中一定得有这三个参数,就是我们当前要过滤的请求和响应,还有过滤器垫,因为这是放行的,你没有这个对象,你压根你都放行不了,你放行不了,那我们当前咱们不都是拦截吗?大家说咱们当前的功能不都是拦截吗?你的请求还能继续往下执行吗?就不能了啊好,来大家看啊,咱们现在咱们来找到他。然后这里面咱们找到do filter internal,大家看他都干了点啥,首先呢,然后他在这来获取了一个叫做get encoding方法的返回值,Getcoding是谁在这儿?然后来返回的是我们当前这个类中的成员变量,叫做经coding,在这儿呢?OK吧,所以说为什么我们在去配置过滤器的时候,我们要设置一个初始化参数,就叫做引口顶,大家要看好啊,我们在这设置的银口顶,它其实就是为我们当前咱们的过滤器中的银口顶进行赋值的。
13:12
能看懂吧,好,OK,那有屯老师,你下面在这还有个force includingding,我咋没看见它呢?大家注意这个东西啊,它是在我们当前咱们的有参构造中的,看这个地方啊。看这,然后在这有一个有参构造,第一个参数叫做什么?In coding,第二个叫做force in coding,看到了没?看到了吧,好,OK,然后这两个参数,然后在这个有参构造中,它又调用了一个什么,又调用了一个有三个参数的有参构造,而这三个参数的有参构造,它的三个参数分别是编码,还有两个布尔类型的,因为我们是拿着这一个值给咱们后边这两个参数扶持的,那大家再往下看来,咱们到这大家注意,你看它都干了点什么,然后我们是不是拿着我们上边咱们的这个force in coding的值给我们的这个有参构造中的谁呀,给他进行了赋值,也给他进行了赋值,然后呢,我们又拿着当前咱们的参数,是不是给咱们相对应的两个成员变量进行了赋值,换句话来说,现在这两个成员变量的值取决于谁,取决于我们当前的force in coding,所以说我们在这里面又设置了一个force incoding来把它的值设置为true了。
14:30
OK吧,好,那我们再继续往下看,好大家注意,我们以我们现在配置的来说啊,我们这里面咱们的银coding它是utf杠八,我们当前咱们这里面的句集就是说这个成员变量是uf杠八,然后这两个成员变量的值都是true,因为我们通过encoding false encoding来为这两个成员来为这两个成员变量进行了赋值,这个大家要注意啊,好,那我们再来看咱们的。
15:01
这个叫做do filter internal啊好,我们先来获取了一个编码,如果说这个编码它不等于空,然后就会来执行这个内容,如果说它要横等于空,直接放行,这都能看懂吧。所以说那我们现在的编码等于空吗?不等于空,然后我们现在,所以说我跟大家说了,你必须得设置银扣Ding,你要不设置银coding,它用的还是默认的编码,知道不跟你没有设置是一样的效果啊好,大家再来看看这个叫做is force request encoding,这是谁?这就是我们上面咱们的这个方法,这个方法返回的是谁?False request encoding,大家说现在它的值是啥?这个成员变量的值是谁?现在是不是true呀?是不是经过我们当前所设置的这个初始化参数,是不是就可以为我们当前的这个成员变量来复制一个处对不对?好下面呢,我们再继续往下啊,又把它关了啊,好,咱们再继续往下看,大家注意啊,来咱们看到这儿,然后如果它大家说这中间用的是或,那所以咱们什么时候才会去执行这个,才会去执行这个if里面的内容呢?大家想想。
16:10
啊,大家想一下,是不是只有当它为处,并且它也为处的时候,然后我们才会去执行啊,不是啊,是只是我们当前这里面只要有一个为出的时候,咱们是不是就会执行,对不对,或只要有一个为出就为出,对吧,然后两个都为false,它才为false。对不对,好,那所以大家看你看这个东西,它是不是现在已经为出了。对不对啊。对吧,好,然后这个东西又是什么,叫做request get recordco什么意思。request.get recordcoding set recordcoding是设置编码,Get request,这个get recordcoding是设置,是获取编码,也就是说如果我们当前,要么我们当前的force request incoding为处,要么我们当前咱们这个request里面你没有设置过编码,那你怎么我们只要没有设置过,那你获取呢?就是难能听懂吧?
17:08
靠,要么你没有设置过编码,那我们当前就会去设置请求的编码,看到没有,其实我们只要保证它为主,它就会执行。OK吧,好啊行,这个大家一定要看好啊,而且这个其实也是为出的,因为我们之前确实没有设置过编码,知道吧,好啊行,那我们在这如果满足这个条件,那我们就会设置请求的编码,如果满足这个条件,咱们就会设置响应的编码,然后这个大家说现在是不是也为出呀,对不对,所以说大家看好,那我们现在呢,咱们就可以通过这个过滤器来设置咱们的请求和响应的编码啊。好,那如果大家只设置它的话,比如说我现在我在这不设置,我不设置咱们的force in coding,那这个时候大家来看,那我们当前咱们它又是什么样的一个结果呢?好,那这个时候我们的force requestcoding这个成员变量的职位false,因为默认就为false啊。
18:04
在这有看到没默认就为false,这也是默认为false,对吧?然后我们只会执行谁,咱们所设置的编码不为空对吧?然后我们也说了,这个条件它也一定是成立的,我们之前没有设置过编码,所以说如果大家只设置编码为什么的时候,我们只设置了咱们的银扣顶这一个初始化参数的时候,那他只会去设置咱们请求的编码,会不会设置响应的编码呢?不会,所以大家如果要想去设置请求和响应的编码,那大家就必须要把这个初始化参数也给它加上。OK吧,行,咱们就说到这儿啊,这个源码呢,这个源码还是比较简单的啊,大家应该都能看懂对吧,那行,那下面呢,我们就来测试一下呗,咱们在这来重新部署,其他代码都不需要去改啊,因为我们只需要去测试一下咱们的乱码问题就行啊好。好,咱们把它给清空掉,然后我们现在咱们再来一个刷新啊,然后这个是张三,这是123456,然后点击登录,大家看啊,看张三是不是就有了,而且我们现在用的是什么方式啊,是不是应该用的是post请求的方式呀,对吧?所以说这个乱码咱们现在就已经解决了,再说一遍get请求的乱码,8.5里面咱们没有,七里面有有get的乱码,咱们只需要在server点叉ML中,在配置端口号的标签里面加上一个uricoding。
19:31
Uicoding等于UTF杠八就行,但是在8.5的tomcat里面,咱们只需要来解决post请求的乱码就可以了。那我们是怎么来解决的?好,然后我们是在web的XM中设置了一个编码过滤器,然后这个编码过滤器呢。然后我们需要来设置两个初始化参数,一个是来设置我们当前的自定义编码的,还有一个就是来设置什么的,来设置force in coding,咱们把这个设置之后,大家注意,我们不单会设置请求的编码,还会设置响应的编码。
20:07
OK吧,行,然后呢,我们在这给大家写一下,然后咱们的第七个问题,然后就是来解决什么解决咱们获取请求参数的乱码问题,对吧,然后怎么解决大家看啊,然后咱们在咱们的web点点叉L中,然后来配置spring的编码过滤器。配置spring的编码过滤器,这个编码过滤器叫什么?叫做characterco filter,对吧?至于怎么配置,我就不给大家复制过来了啊,这个东西呢,我建议大家呢,刚学的时候,大家多去配置两回知道吧,然后呢,等到以后咱们习惯了之后,咱们这个熟练了之后,大家直接呢把这个东西复制过来就行,能听懂吧,好啊。
我来说两句