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

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

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

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



内容介绍:

一、 登录

二、 完善登录页面

三、 拦截器进行登录检查

 

一、登录

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

image.png

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

修改 login.html

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

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

<form class=”form-signin” action:”dashboard.htm1" th:action= " @{ /user/ login}”method: "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<String ,object> 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 消息

<p sty1e="color: red" th:text="${msg}"

<!--判断,设置当前消息不为空才生成前面内容,有 msg 时才生成 p 标签-->

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

// 判断 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 使用小技巧:

<table> <tr><th>NAME</th> <th>PRICE</th><th>IN STOCK</th><th>COMMENTS</th></tr><tr th:each="prod : ${prods}" th:class=" ${prodStat . odd}? 'odd'"><td th: text="${prod .name}">Onions</td><td th: text="${prod .price}">2.41</td><td th: text="${prod.inStock}? #{true} : #{false}">yes</td><td><span th:text= ”${#lists. size( prod. comments)}" >2</span> comment/s<a href= "comments .htmlth:href=" @{/product/conments(prodId=${prod.id})}th:if="${not #lists. isEmpty( prod. comments)}">view</a></td></tr></table>

加上 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<String ,bject> 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

相关文章
|
5月前
|
Java 应用服务中间件 Spring
SpringMVC快速入门加登录流程分析
SpringMVC快速入门加登录流程分析
35 0
|
数据库
Discuz! X3.5 登录不了管理后台的处理方法集合
1. 取消IP认证。由于Discuz!论坛会认证IP,不允许不同IP地址同时登录后台,所以取消IP认证即可。修改方法:在网站根目录,Discuz!配置文件config目录下config_global.php 中找到如下代码:$_config[‘admincp’][‘checkip’] = 1把代码中“1”改成“0”。(修改后允许多IP同时登录后台,所以论坛的安全系数会降低)
575 0
Discuz! X3.5 登录不了管理后台的处理方法集合
|
10月前
|
安全 前端开发 数据安全/隐私保护
登录的功能的实现和登录功能的拦截信息(课时十六)
登录的功能的实现和登录功能的拦截信息(课时十六)
47 0
|
8月前
|
安全
BurpSuite进阶篇--自动识别Token值
BurpSuite进阶篇--自动识别Token值
265 0
BurpSuite进阶篇--自动识别Token值
|
存储 前端开发 Java
Java Web实战 | 拦截器案例:用户登录权限验证
在配置文件中如果只定义了一个拦截器,程序首先执行拦截器类中的preHandle()方法。如果preHandle()方法返回false,则中断后续所有代码的执行。如果该方法返回true,程序将继续执行处理器以处理请求。当处理器执行过程中没有出现异常时,会执行拦截器中的postHandle()方法。postHandle()方法执行后会通过相关资源向客户端返回响应,并执行拦截器的afterCompletion()方法;如果处理器执行过程中出现异常,将跳过拦截器中的postHandle()方法,直接由前端控制器渲染异常页面返回响应,最后执行拦截器中的afterCompletion()方法。
180 0
|
缓存 前端开发 JavaScript
[实验]登录&amp;拦截器 | 学习笔记
快速学习[实验]登录&amp;拦截器
165 0
[实验]登录&amp;拦截器 | 学习笔记
|
安全 Java 数据安全/隐私保护
权限控制 &amp; 注销|学习笔记
快速学习权限控制 &amp;注销
61 0
|
安全 前端开发 Java
登录 &amp;认证 &amp;授权|学习笔记
快速学习登录 &amp;认证 &amp;授权
60 0
登录 &amp;认证 &amp;授权|学习笔记
|
Dubbo Java 应用服务中间件
服务提供者配置&amp;测试|学习笔记
快速学习服务提供者配置&amp;测试
81 0
服务提供者配置&amp;测试|学习笔记
|
SQL 监控 druid
JDBC&amp ;自动配置原理|学习笔记
快速学习JDBC&amp ;自动配置原理
144 0