00:00
好,接下来呢,我们来编写登录功能,登录功能呢,我们就不连接数据库了,只要提交任意用户名,密码呢是123456就行,当我们登录成功以后,我们来到我们的这个实验,登录成功以后呢,会来到我们这个主页。我们后台的这个主页,主页左边呢有一些菜单栏,比如我们这个菜单是来查出所有的员工,那么当我们点击它以后,就会来到员工的列表页面,列表页面呢,也在这儿来展示所有的员工记录。好,我们就来先改,先来修改一下我们这个登录页面的内容,来到我们的登录页面,登录页面呢,这个表单放表单是来进行登录操作的,来先来指定它要提交的地址,Action,那用服来指定路径,假设呢在user下有一个请求叫logo,并且呢是post方式的请求,它进行登录,那我就来写一个。
01:02
Controller来处理登录请求,就叫login controller。好,它成为一个controlr了呢,我们来加上ctrler注解。把这个去掉好,我们来加上controller注解,然后呢来写第一个方法处理登录public string就叫log。而首先当他登录成功以后,我们要去的页面是哪啊?我们要去的页面是我们这个times下的单是bird。我们这个页面呢,啊,有我们模板引擎的解析,前边的times以及后边的HTMMR,我们不用写,只用写单SH本就行了,好们来处理请求,首先呢,我们来写request map,我们要处理的请求呢,是。我来写一个value是我们当前项目下的user下的log,它是什么方式呢?我们可以用method进行限定,用request method,我们现在呢是以post方式来进行提交,而如果我们要以post方式来限定一个请求,哎,我们写这么一大串有点麻烦。在spring m VC新的这个。
02:12
特训里边有我们这个rest API方式的注解,我们直接可以用post mapping的方式来表示,我们要映射一个post请求,点进来能看到其实它就是request和mapping method等于post版的,所以说呢,我们后来可以在风格里边来用类似的mapping,比如有post mapping,还有get mapping来处理get请求的,还有put map来处理put请求的,还有delete满来处理delete请求的,好,那以后呢,就来用它。好,我们来用这个post。他呢,处理的请求地址my value写上,但是user下log处理登录请求,而我们这个登录呢,需要提交用户名和密码,我们就直接来写上username,从请求参数上获取username和password,包括呢,我们还可以在这限定一下,用request明确的告诉他从请求参数里边获取谁呢username,如果用user用request来标注的这个属性,一旦没提交它就会呢给我们报错,好,我接下来呢再来用request来标注password。
03:29
好。那么从参数上就要提交两个数据,一个是用户名,一个是密码,怎么算登录成功呢?我们先来做一个简单的判断,如果说砖U没用这个工具类第its empty。来判断一下,我们这个用户名都在内,只要它不为空,并且呢,我们提交的这个密码,并且啊,我们这个密码等于123456,我们123456,第2EQUALS,我们这个password,如果是这种情况下,那就算是登录成功。
04:06
诶,我们来说一下,这个呢,就算是登录成功,那么登录成功呢,我们就应该来到咱们这个主页,我们return的,但是board,否则哎,这就是登录失败,登录失败,那登录失败呢,我们自然就还是来到登录页面显示错误消息,好我写来我们来写一个return。瑞特来到登录页面呢,我们这儿直接就来写login htm登录页面,好,我们要添加错误消息的,我们就来写一个map,把这个错误消息呢封装在里边。和object。我们来放一个错误消息,这个错误消息呢,就是map,我们来put一个message,第2PUT一个,哎,我们就叫message message呢就是用户名密码错误,哎,用户名密码错误。
05:04
好,这个呢,我们这个登录请求,我们的这个写法,我们来测试一下启动。先看能不能来到我们这个成功或者失败页面。好,我们来到我们这个登录页面来提交上我的密,密码呢,我们先来随便写一个,不是123456的,我点个登录,哦,现在呢,我们看到它是来到了一个错误页面,而错误呢,这有一个状态码叫400,所有以四开头的错误都是我们客户端的错误,这400呢,就是客户端提交的数据不对,他说是一个半request,哎,一个错误的请求,下面呢,有解释原因,说required string parameter,我们需要一个字符串类型的参数叫什么呢?叫username,但是它干嘛,Not present不存在。不存在,是什么原因呢?我们来到登录页面,我们来看啊,Form表单里边input的框,哎,这个来提交用户名,好,这个框呢没有来写name属性,Name呢就是我们要提交的K,一定要写上user name同林密码也一样,Name等于pass word,当我们把页面修改了以后。
06:18
哎,我来倒回来,我来刷新右键查看源代码,大家会发现其实这一块呢,并没有补上那些内容,哎,这是由于我们这个模板引擎有缓存,这是一方面,我们先来把模板引擎的缓存静调string.sim我们在开发的时候呢,Catch,哎,我们要force禁用掉模板引擎的缓存禁用。缓存。禁用。禁用掉缓存以后呢,我们以后开发起来,哎,页面一修改,我们就理应就能用到了,我们再来看一下我缓存一禁用以后。我们先来重启一下啊,配置文件只要修改了,我们就来重启一下。
07:00
缓存禁用以后呢,我们现在来刷新啊,由于重启了,肯定有这个username,我们再来把这个username去掉啊,去掉一下。去掉去掉以后呢,我们这个ID自动保存这个HTM页面,我再来刷新一下这个页面,来看它的源代码里边U在代,诶我们发现呢,我们要想实时生效,首先第一步禁调缓存,第二步当我们页面修改以后,按住CTRL加F9,把我们这个呢重新编译一下,然后呢,我们再来刷新那右键查看源代码能看到诶这个user name就没有了,我们再把它user name加上。Name等于user name。如果我不按CTRLF9,我们来刷新这个代码呢,还是没改,而如果我按CTRLF9,让它重新编译一下。
08:04
我们再来刷新来,我们看username就出来了,所以呢,这就是一个开发技巧,我们来记录在这儿,开发技巧这个模板引擎。模板引擎页面修改以后,修改以后要实时生效啊,实时生效啊,我们在开发期间,我们要做两件事,一件事呢,就是来禁用,禁用缓存,禁用模板。模板引擎的缓存,这是第一步,第二步呢,我们来页面修改完以后,页面修改完成以后,然后呢,CTRL加F9,把我们这个呢,哎,让它重新编译一下,重新编译,要不然阿迪尔在运行期间不会来编译我们这些。修改的代码的好,这就是呢,我们这个开发的一个技巧,我们把这个禁用。
09:04
缓存好,把它拿过来。复制在这儿。好这块呢,我们来说完以后呢,我们现在再来测试登录。A me123456,好,我先来提交一个对的,我点登录,哎,我们发现来到了我们这个啊后台的主页面,只不过这个主页呢,这样式我们一会儿来改一下,那我们来来一个错的11111登录,诶现在呢,就来到我们登录页了,这是一个错的,错的以后呢,我们接下来给这来提示一个错误消息,怎么提示呢,来到登录页,登录页呢,首先我们来看这有一个please sign,我们就在下边,下边呢我们来写一个P标签。这个P标签呢,我们来给他一个样式,Color呢,就等于read。啊,一个红色的。显示好read,而它的值是什么呢?值就是th task,文本内容呢就是Dollar大括号,我们来取出message,哎,取出message,一旦一登录错误以后呢,我们。
10:09
我们这个请求域中就会有这个消息,大家注意,我们这个P框可不是一直要显示的,我们可以用这个判断叫th if,什么叫if呢?就是我们有一个判断条件,当这个判断条件生效以后,后边才来进行生效,我们就来做一个判断。判断我们可以看一下我们这个life帮助文档,这有一个我们这个判断计算,特别是呢,我们这个if标签,诶如果我们要做一些事情,我们可以用TF们先来判断,当条件成立以后,其他的东西才生效,特别是这个A标签,当这个判断条件是成立以后,才能生成整个A标签,A标签里边的其他PH属性才有效,而判断条件不成立,你看上边的这个TD就没有A标签。
11:04
这个呢,其实就是按照我们以前说的属性的优先级来进行处理的。在我们第十章属性优先级里边,我们THF是啊高于优先级的,而th test是低优先级的,比如说THF判断条件成立以后,Th task或者呢if后边的其他判断属性才能生效,好我们呢也就按照这个判断来做THF来判断是什么呢?只有在啊有的情况下,我们才来生成这段P标签,来生成这个message消息。我就来写Dollar符大括号,这个判断怎么做呢?我们这个Dollar符大括号,我们在取值的时候,哎,取值的时候除过呢能获取一些上下文的一些数据信息,包括呢,它能用一些基本对象,还能用一些工具对象,工具对象里边呢,其中就有一个死状对象,String对象呢,它可以帮我们来检查一个字符串是否为空,我们可以来到附录里边看一下这个string怎么用,包括我们来到附录B,好,19章附录B,我们这个工具对象里边呢有string对象。
12:13
点进来,我们来看它怎么用,其中呢,就有一个string is empty,我们可以判它是否为空,我们也这么来用,我来写一个对象的引用,我写一个号,好引用它内置的工具对象,有一个方法叫it empty。判断哪个是否为空呢?就是判断我们这个message,取出的这个message,一旦它不为空,我们才生成,所以我们要判断它不为空,那么就来写note,诶,当我们这个message不为空的时候,我们来生成这个消息内容,好,我们来重启一下。然后呢,我们来登录一下我们这个,看一下错误消息有没有提示。好,我们来给一个登录啊命那下来登录一个错的,随便输密码,我点个登录,诶错误消息呢,用户名密码错误有在这提示,而且呢,这个P标签也是整个P标签都生成了,而一旦说我们这个message都是空的,那P标签可能都没有,比如我就不取message,我取一个ABC,那呢没人放这个ABC的值,那整个标签就不会有th test message也不会取出来。
13:23
来看一下。我再来登录我的命,我来写一个错的点一个登录来,由于那个值没取出来,所以说我们错误消息不会显示,好,那在这呢写上。这一块呢,大家就来注意一下,这是我们这个错误消息的显示登录,来在这儿记录一下登录错误消息的显示。主要呢,就是这个判断表达式,好,接下来就是我们刚才登录成功后的页面。这个登录呢错误,现在呢,有了提示,我点一个登录,那么我们这个成功以后呢,先来到我们的成功页面,123456啊这个成功页面呢,刚才这个样式有点问题。
14:07
在改样式之前呢,注意一个现象,什么现象呢?如果我来到了这个成功页面,我F5我刷新一下,诶会提示一个确认,重新提交表单,这就是我们说的表单重复提交,由于我们刚才登录发的是user logo post的请求转发到成功页面,所以呢,我们来刷新此页面。发的还是上一次的登录请求表单呢,就重复提交了,而我们药房重复提交最好的办法就是什么呢?重定向。那我可以让它重定向来到我们这个成功页面,而这个成功页面呢,需要经过模板引擎解析,所以说呢,我来加一个视图映射。好,我们在这呢,我再来加一个视图映射,我叫registergry,点我们来添加一个view you controller.and view you controller,这次的路径呢,比如我们就叫慢点HTM,这就是来到我们后台的主页,点一个set view name,设置一个视图名,视图名呢就是我们去掉前后缀。
15:12
好,那就要,但是报这样的话呢,我们希望登录成功以后,好在这儿登录成功以后,我们为了防止表单提交,防止表单重复提交。可以重定向。我们可以重定向到咱们这个主页,好,那我们呢就来重定向,重定向怎么用呢?那就是我们spring m VC以前加一个redirect前缀杠,就代表重定项的当前项目项什么呢?点HTM。这样腾成功以后,我们就来到慢页面,而慢呢,添加了视图映射是最终要到但是bird的,所以说呢,我们成功以后就会来到主页,好来重新启动一下。
16:00
我们再来看一下我们这个登录。这是我们这个登录页,我来让他登录成功,123456登录来,我发现呢,来到慢页面了,而且这个慢页面呢,我们现在是重定向过来的,这一块的样式也好了,但是呢,我们这儿有一个非常大的问题。来看一下,我们是直接重定向来访问慢点HTML,他呢做了视图映射,你要来访问慢点HTM,直接来到单sh word这个后台的主页,那要照这样我直接在火狐浏览器里边,那我也来直接访问慢页面。回车,那就直接来到了后台的操作面板,我们的登录啊,我们刚才做的这个登录功能,那也就失去它的意义了,那怎么做呢?我们可以用拦截器机制来做一个登录检查,这就是我们接下来要做的拦截器进行登录检查。
17:02
那拦截器机制呢?我们就来写上一个拦截器,就是我们VC里边以前用的handler intercept,好,我们专门来实现上一个拦截器,我们放在component里边。来创建一个我们就叫log handler intercept,我们用来做登录状态检查的拦截器,要成为拦截器必须来实现handler intercept接口,我们来添加未实现的方法,Al提示啊,添加未实现的方法。好,这个拦截器它的作用呢,就是来进行登录检查,没有登录的用户就不能访问后台的主页和对员工进行生产改查。好怎么样检查登录状态呢?我们需要结合啊登录的这个请求,当我们登录成功以后,我们把登录好的用户我们可以放在session中,好,我在这呢就来写一个传一个http session原生API来操作一下session.set at tribute,那假设呢,放一个K就叫log user。
18:12
已经登录的用户值呢,就是我们这个用户的用户名,那么只要登录了,用户就会在session中存在,而我们在这儿呢,就可以来检查,我们来到pre handle这个方法,Handle呢就是目标方法执行之前。执行之前我们可以来执行handle,先来做一个预检查,我们来request.get session,拿到session,再从session中呢来获取我们log user这个属性。Login user,我们就来看一下赛中有没有这个值,如果有那就是登录了,所以说直接来判断user等等空是不是空,是未。未登录,哎,是空的,那就是没登录,如果不是说明已登录。
19:06
那如果未登录,我们就应该拦截,并且呢,未登录的情况下,那就应该让它返回,返回登录页面,而我们这个已登录呢,那我们就放行请求,那这个放行我们就直接写return true。而未登录呢,我们return for不放行这个请求,并且呢,还需要让它回到我们登录页,回到登录页怎么写呢?M,这个回到登录页我就直接用request.get request我们获取到转发器,转发到哪呢?我们试图映射,当我们访问当前项目或者当前项目下index都会来到登录页,所以呢,我们让他转发到index。哎,转发到这个请求,第2FORWARD啊,我们将请求和响应。响应好转出去,而转发的时候呢,我们在页面也要显示错误消息,所以呢,我们给request中来也放上错误消息,Set attribute就叫message,这个错误呢,我们就叫没有权限,请先登录。
20:16
好,这时呢,我们放的这个错误消息,而拦截器我们写完以后一定要配置出来,只有这种情况下MVC才能用得到,我们来到我们之前的这个配置,买MVC里边,在这呢,我们定制和扩展MVC,诶我们可以呢,在这个里边我再扩这器。在这呢,有一个方法叫and intercepts,我们按住CTRL加O,打开可以重写的方法列表,好,我们这个and intercepts就是来注册拦截器的。在这注释一下注册拦截器,拦器怎么注册呢?用这个点一个点一个有个叫and intercept,添加一个拦截器,那这个拦截器呢,就new一个叫log。
21:10
看到了intercept来处理登录的拦截器,拦截器要拦哪些请求?我们可以在这来and pass part在这来添加拦些哪些请求?大家可以呢,一个请求一个请求往里边填,太麻烦了,我直接写一个杠双星,这就是来拦截任意多层路径下的任意请求,当然不是说所有请求都来拦,我们还可以exclude来排除,比如我排除哪些请求呢?首先就应该排除的是访问登录页面的请求,否则连登录页面都访问不到了,那要访问登录页面,我们之前做的视图映射是应贝HTML。所以呢,我来先来排除第一个请求来访问它,或者呢,访问它都是去登录页面的,哎,把这个过滤掉,包括呢,第二个请求,我们来到登录页面以后呢,我们填完数据点一个登录,我们要发送登录请求,这个登录请求不能。
22:09
只有来到登录请求,你才能登录成功,哎,这几个呢,不用拦,那剩下的都拦,除了这几个外,你要来到慢页面,或者要操作其他的东西,那都必须要登录,而有些同学说那静态资源呢。静态资源。静态资源,这静态资源比如像什么CSS样式啦,或者什么GS样式啦,如果是我们以前用LVC,我们在这注册拦截器,还要排除掉这静态资源的访问,而现在呢,我们说spring BOO已经做好了静态资源映射了,所以说我们不需要管静态资源。已经做好了静态资源映射,所以说呢,我们拦截器在写的时候呢,哎。我们可以不用来处理静态资源,静态资源呢也能正常访问,好,这个拦截器我们就做好了,我来重启一下,直接来访问慢页面看还行不行。
23:08
好,我们来看一下,我们来访问慢页面慢点h.M回车,哎,我们发现他说没有权限,请先登录,但是呢,如果我们要直接访问这个页面,或者来访问in贝点HTM,我们放行的这俩请求,那是可以的,这样的话呢,我们就来登录进来123456。好,我们呢,将左上角显示成登录的用户,我们来到我们这个登录的。单board主页,那么左上角的这个位置呢,就是我们在这一块来找company name,你要显示成登录的用户,我们就用行内的写法,要从session中取值呢,我直接Dollar大括号,我们直接来写session点叫什么呢?Log跟就。好,写完以后CTRL加F9。把这页面重新编一下,我们来刷新这个页面,诶我发现这一块呢就有值了,那接下来呢,大家就把我们这个主面板页面的这些CSS样式引入,包括后边的这些GS都改为像login页面一样,我们用表达式at大括号的方式来引入资源,公共资源呢,用web,用自己的资源呢,我们就从assert里边来引入就行了。
我来说两句