[实验]登录&拦截器 | 学习笔记

简介: 快速学习[实验]登录&拦截器

开发者学堂课程【SpringBoot快速掌握 - 核心技术:[实验]登录&;拦截器】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/612/detail/9248


[实验]登录&;拦截器


内容介绍:

一、 登录

二、 完善登录页面

三、 拦截器进行登录检查

 

一、登录

登录功能暂时不用链接数据库,任意用户名,密码 123456 就行,登录成功后会来到后台的主页

image.png

左边为菜单栏,点击就会切换到相应页面, orders 查询所有的员工,点击就会进入员工列表页面。

修改 login.html

其中 from 表单是进行登录操作的,添加指定地址:

指定路径,在 user 下有一个请求 login ,并且是 post 方式的请求,进行登录


二、完善登录页面

1. 新建一个 controller 完成登录请求

Logincontrollerimport org . springframework . stereotype . Controller ;import org. springframework . util . StringUtils;import org. springf ramework . web . bind. annotation.*;import java.util .Map;

//必须添加的注解

@Controller

//第一个处理方法进行登录

登录成功后将去到 dashboard.html 页面,因为有模板解析,所以不用写上级目录和后缀 .html

public class LoginController {

//在新版本中,可以直接写如下命令来指定请求方式

// @DeLeteMapping//@PutMapping//@GetMapping

//处理请求头,是当前项目下的value = "/user/login",限定方式为method = RequestMethod.POST,post请求。

//@RequestMapping(value = "/user/login", method = RequestMethod.POST)

// value 为请求地址

@PostMapping(value = "/user/1ogin" )

//登录需要提交用户名和密码,可以使用 @RequestParam 注解明确确定指定 username 和 password ,如果指定的这个属性没有提交就会报错,

public String login(@RequestParam( "username") String username ,@RequestParam( "password") String password,

//把错误消息封装在 map 中

Map map){

//简单判断是否登录成功,判断用户名不为空,并且密码为123456,就返回登录成功

if(!Str ingUtils. isEmpty(username) && "123456" .equals(password)){

//登陆成功,防止表单重复提交,可以重定向到主页

//return "dashboard";return "redirect:/main.html";

//否则登录失败

}e1se{

//登陆失败,显示错误消息,调用 map 指定错误消息

map .put("msg" , "用户名密码错误");return "1ogin";}}

启动 idea 查看效果,访问 localhost:8080/crud/user/login

随机输入一个密码,来到一个错误页面,发现报错400,需要一个字符串的参数,叫做 username ,但他不存在

image.png

客户端的错误,提交数据不对,是一个错误的请求

查看登录页面,form 表单中,input 框,提交用户名这个框,没有 nam 属性,就是提交的 key ,同理添加 password 属性添加 name 属性

name=”password”

name=”username”

修改完成后回到页面刷新并查看源代码,发现并没有补上刚添加的内容,因为模板引擎有缓存,所以要进行优化

开发小技巧:

开发期间模板引擎页面修改以后,要实时生效

1 )、禁用模板引擎的缓存

#禁用缓存

spring. thymeleaf . cache=false

修改完成后回到页面刷新并查看源代码,发现 username 还在,所以要进行第二个操作

2)、页面修改完成以后 ctrl+f9  :重新编译;就会马上生效

配置文件修改后要重启一下,修改完成后回到页面刷新并查看源代码,发现 username 没有了,再加上name=”password”,重新编译,发现修改成功。

这也算是一个开发技巧。

 image.png

提交一个正确的,进行检测:成功来到后台主页面,样式下一步修改

image.png

2. 添加错误登录提示消息:

//添加 p 标签,style 样式设置,值为 text ,调用 msg 消息

//当条件成立时才调用 a 标签,这是按照属性优先级进行处理的,//th:if 优先级大于th:textth:if="${not #strings. isEmpty(msg)}">

// 判断 strings. isEmpty(msg) 是否为空,不为空才生成 p 标签

现在重新启动 ider 输入错误的登录信息就会报错

image.png

右键查看源代码,发现 p 标签也完全生成了

如果故意修改 msg为abc ,就不会调用 msg ,错误信息也不会有。

修改样式之前,在登录成功的页面刷新,会提示重新提交表单,这就是表单重复提交,因为 user/login 是 post 请求,刷新会重新提交页面,发的还是上一次的登录请求,防止重复提交最好的办法就是重定项,在 controller 中添加重定项代码:

//登陆成功,防止表单重复提交,可以重定项到主页

//return "dashboard";return "redirect:/main.html";

//否则登录失败

}

Config 中添加:

registry. addViewController( urlPath: " /main . html") . setViewName(“dashboard”)

修改完成后运行测试:

登录成功来到 main 页面,并且是重定向过来的

image.png

会发现一个问题,在其他浏览器可以直接进入控制面板,这样登录功能就失去意义了,需要设置拦截器登录检查

3. Th 使用小技巧:

NAME PRICE IN STOCK COMMENTS
Onions 2.41 yes 2 comment/sview

加上 if 判断语句,判断之前 th 标签成立才执行这个标签的内容

4. String 怎么用:

//判断是否为空

${#strings . isEmpty(name)}${#strings. arrayIsEmpty(naneArr)}${#strings. listIsEmpty(nameList)}${#strings . setIsEmpty(nameSet)}

5. 在 MyMvcConfig 添加一个视图映射

//所有的 WebMvcConfigurerAdapter 组件都会一起起作用

@Bean //将组件注册在容器

public WebMvcConfigurerAdapter webMvcConfigurerAdapter(){WebMvcConfigurerAdapter adapter = new WebMvcConfigurerAdapter() {@0verridepublic void addViewControllers(ViewControllerRegistry registry) {registry . addViewController( urlPath: "/") . setViewName("login" );registry. addVi ewController( urlPath: "/index . html" ) . setViewName("login");registry. addViewController( urlPath: "/main. html"). setViewName( "dashboard");};return adapter;}

高亮为添加部分

6. //设置重定向

@Controllerpublic class LoginController {@PostMapping(value = "/user/1ogin" )public String login(@RequestParam( "username") String username ,@RequestParam( "password") String password,Map map){if(!Str ingUtils. isEmpty(username) && "123456" .equals(password)){

//登陆成功,防止表单重复提交,可以重定向到主页

return "redirect:/main.html";}e1se{

//登陆失败

map .put("msg" , "用户名密码错误");return "1ogin";}}

 

三、拦截器进行登录检查

1. 创建 LoginHandlerlnterceptor 类

登录状态检查的拦截器

package com. atguigu. springboot. component; import org . springframework . web. servlet .HandlerInterceptor;import org . springframework . web. servlet . ModelAndView;import javax . servlet . http . HttpServletRequest ;import javax . servlet . http.HttpServletResponse;/**

*登陆检查,没有登录的用户不能进行检查和对用户增删改查

首先添加未实现的方法

*/public class LoginHandlerInterceptor implements HandlerInterceptor {

//目标方法执行之前

@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, 0bject handler){Object user = request . getSession(). getAttribute( name: "loginUser");if(user == nu1l){

//未登陆,返回登陆页面

request . setAttribute( name: "msg", o: "没有权限请先登陆");request . getRequestDispatcher( path: "/index.htm1") . forward(request , response);return false;}e1se{

//已登陆,放行请求

return true;}}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, object handler{}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, 0bject handler{}

2. 在 MyMvcConfig 添加一个注册拦截器

//所有的 WebMvcConfigurerAdapter 组件都会一起起作用

@Bean //将组件注册在容器

public WebMvcConfigurerAdapter webMvcConfigurerAdapter(){WebMvcConfigurerAdapter adapter = new WebMvcConfigurerAdapter() {@0verridepublic void addViewControllers(ViewControllerRegistry registry) {registry . addViewController( urlPath: "/") . setViewName("login" );registry. addVi ewController( urlPath: "/index . html" ) . setViewName("login");registry. addViewController( urlPath: "/main. html"). setViewName( "dashboard");

3. //注册拦截器

@0verridepublic void addInterceptors(InterceptorRegistry registry) {registry. addInterceptor( new LoginHandlerInterceptor()) . addPathPatterns("/**").

//静态资源:*.Css,*.js

//SpringBoot已经做好了静态资源映射,所以我们拦截器不用做静态资源

//白名单

excludePathPatterns("/index . html", "/", "/user/login");}};return adapter;}

完成后重启登录发现只有白名单里的可以直接访问,其他都拦截了,需要账号密码进行登录

image.png

相关文章
|
4月前
|
Java 应用服务中间件 Spring
SpringMVC快速入门加登录流程分析
SpringMVC快速入门加登录流程分析
35 0
|
9月前
|
安全 Java 数据库连接
四.SpringSecurity基础-自定义登录流程
SpringSecurity基础-自定义登录流程
|
9月前
|
安全 前端开发 数据安全/隐私保护
登录的功能的实现和登录功能的拦截信息(课时十六)
登录的功能的实现和登录功能的拦截信息(课时十六)
46 0
|
11月前
|
数据库
【JavaWeb】用户名校验案例
【JavaWeb】用户名校验案例
|
PHP
laravel-admin 自定义登陆逻辑,补充原有账号密码登录
laravel-admin 自定义登陆逻辑,补充原有账号密码登录
260 0
|
开发工具 iOS开发 开发者
友盟分享和登录步骤
友盟分享和登录步骤
161 0
友盟分享和登录步骤
|
缓存 前端开发 JavaScript
[实验]登录&拦截器 | 学习笔记
快速学习[实验]登录&拦截器
148 0
[实验]登录&拦截器 | 学习笔记
|
SQL 监控 druid
JDBC&amp ;自动配置原理|学习笔记
快速学习JDBC&amp ;自动配置原理
144 0
|
Java 数据库
JSP慕课网阶段用户登录小例子(不用数据库)
JSP慕课网阶段用户登录小例子(不用数据库)
112 0
|
前端开发
MVC 自定义过滤器/特性来实现登录授权及验证
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来。    十年河东十年河西,莫欺少年穷    学无止境,精益求精    最近在做自学MVC,遇到的问题很多,索性一点点总结下。
1861 0