SpringBoot日记——登录与拦截器篇
之前的文章我们把登录页写了出来,但是想要让登录现实他的基本功能,要如何做呢?本篇文章就来帮你实现第一步,让登录页对账号密码做校验,并且完成登录跳转。
LoginController
1. 要实现登录,我们需要先编写一个登录的controller类:(每一步的注释应该比较详细了~)
@Controller
public class LoginController { // 发送post请求,代替了RequestMapping(value="/user/login", method="post")
@PostMapping(value = "/user/login")
// 对登录请求判断request的参数值,并存放在map中
public String login(@RequestParam("username") String username,
@RequestParam("password") String password,
Map<String, Object> map) {
// 我们判断,如果登录名不是空,并且,密码是 123456 就登录成功(暂不涉及数据库)
if (!StringUtils.isEmpty(username) && "123456".equals(password)) {
// 登录成功,就跳转到下一个页面
return "dashboard";
} else {
// 登录失败,刷新本登录页
map.put("msg", "用户名密码错误");
return "login";
}
} }
为了开发方便,我们还可以将application.properties中添加一个 禁用缓存的参数: spring.thymeleaf.cache=fasle ,这样html页面有改动的时候,我们只需要用快捷键crtl+F9或者点击如图的编译按钮,重新编译下就可以在页面看结果,而不需要再次启动Tomcat服务了。

这时候访问页面,会报错,是因为我们没有在html页面中将类中的参数放进去,所以找不到我们需要的值,那么……
2. 校验页面
先来看,没有配置html页时访问的情况,表示完全没有关联或者获取的页面的数据;

然后我们添加下方参数配置再看,若只添加action和method,会是神马情况:(表示String的参数username不存在)

最后看添加了所有参数后的情况,我们在最后看一下;
login.HTML
我们来看html页要如何修改呢?
来看,我图中标记的地方,就是需要添加的东西:
1. 首先添加th:action,告诉模板,我们要跳转的请求是user/login,而且是post请求的;
2.告诉模板,我们的参数名称是username和password,这也是controller类中设定的参数值,要完全一致。

3.注意,我们之前说如果账号密码不对,要有个msg提示,可这msg在模板中并没有表现,所以,我们要在html中添加一段关于msg的判断:如果msg是空,就不展示mgs,如果不为空就展示:
看,我在下方还用到了th:if语句,这个在官方文档中有记录如何使用,而且优先级比较高,所以会优先判断这个方法是否生效,然后才展示text。
<p style="color: red;" th:text="${msg}" th:if="${not #strings.isEmpty(msg)}"></p>
好,接下来我们试一下,是否成功了,先输入账号admin,密码111,点击登录,看跳转是否依然还是login页:

然后来看,账号admin,密码123456,是否跳转到下一页中:

我们的跳转是成功的,只是样式有些问题,稍后,我们来看怎么处理。
试图映射与重定向
跳转没问题了,可是还有另一个问题,当我们进入到跳转页以后,按F5刷新页面,会发现,页面提示:问是否需要重新提交表单,那么为了不重复提交表单,我们需要这样配置。
1. 首先在我们之前的LoginController类中添加映射:(修改return ,将我们的请求定向到另一个路径,而非/user/login)
if (!StringUtils.isEmpty(username) && "123456".equals(password)) {
// 登录成功,就跳转到下一个页面
// 重定向URL
return "redirect:/main.html";
2.然后在之前的MyMvcConfig中添加一下映射的路径,让上边的main.html引到我们想要跳转的那个“dashboard”页。
registry.addViewController("/main.html").setViewName("dashboard");
3. 再来用正确的账号密码登录一下,查看我们修改的东西是否生效了,注意看url和页面:

很棒,效果和我们想的基本一样,那么这还没完,一个完整的登录还有其他的问题,比如我们把这个url复制到其他浏览器会是什么样子的?
依然能访问成功,那我们做登录还有卵用,所以这个时候,拦截器的作用就体现出来了。
拦截器
首先,了解一下拦截器的作用,他是用来做登录检查的,也就是没有前边的登录,就不可以访问后边的页面。
如何实现,来看:
1. 先添加一个拦截器,我们新建一个登录的拦截器在component包下,名字就叫 LoginHandlerInterceptor (实现接口HandlerInterceptor),IDEA编译器,我们按ctrl+O,把需要用到的三个接口都拉出来,然后开始编写:
/**
* 拦截器,登录检查
*/ public class LoginHandlerInterceptor implements HandlerInterceptor {
// 目标方法执行之前
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object user = request.getSession().getAttribute("loginUser");
// 如果获取的request的session中的loginUser参数为空(未登录),就返回登录页,否则放行访问
if (user == null) {
// 未登录,给出错误信息,
request.setAttribute("msg","无权限请先登录");
// 获取request返回页面到登录页
request.getRequestDispatcher("/index.html").forward(request, response);
return false;
} else {
// 已登录,放行
return true;
}
} @Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { }
}
2. 上边配置的session需要取值才能做判断,那么我们需要在controller中设置这个session值,以让它生效:

3. 之前说过,要让登录有个拦截器的功能,就是除了访问首页我们可以,其他未登录的都拦截下来,所以,需要在MyMvcConfig中添加一个拦截器,让上边的配置都有作用:
// 注册拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 添加拦截的请求,并排除几个不拦截的请求
registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/index.html", "/", "/user/login");
}
这样,除了首页的请求意外,其他请求都会被拦截下来,我们再看这样配置以后的效果:
当我们直接访问localhost:8080/main.html时:

这时候,就只能通过拦截器排除的那几个请求来访问和登录后才能正常访问了
SpringBoot日记——登录与拦截器篇的更多相关文章
- SpringBoot整合Mybatis完整详细版二:注册、登录、拦截器配置
接着上个章节来,上章节搭建好框架,并且测试也在页面取到数据.接下来实现web端,实现前后端交互,在前台进行注册登录以及后端拦截器配置.实现简单的未登录拦截跳转到登录页面 上一节传送门:SpringBo ...
- taotao用户登录springMVC拦截器的实现
在springMVC中写拦截器,只需要两步: 一.写 java 拦截器类,实现 interceptor 拦截器接口. 二.在 springMVC 的xml配置文件中,配置我们创建的拦截器对象及其拦截目 ...
- 4_4.springboot之Web开发登录和拦截器
1.登录处理 1).禁用模板引擎的缓存 # 禁用缓存 spring.thymeleaf.cache=false 2).页面修改完用ctrl+f9:重新编译: LoginController @Cont ...
- Springboot:员工管理之登录、拦截器(十(4))
1:构建登录javaBean com\springboot\vo\LoginUser.java package com.springboot.vo; import lombok.Data; @Data ...
- SpringBoot从零单排 ------ 拦截器的使用
在项目开发中我们常常需要对请求进行验证,如登录校验.权限验证.防止重复提交等等,通过拦截器来过滤请求.自定义一个拦截器需要实现HandlerInterceptor接口.代码如下: import org ...
- 如何在SpringBoot项目中使用拦截器
相比springmvc,springboot中拦截器不需要在xml中配置,只需定义拦截器类 implements HandlerInterceptor 和拦截器拦截路径的配置类extends WebM ...
- SpringBoot静态资源访问+拦截器+Thymeleaf模板引擎实现简单登陆
在此记录一下这十几天的学习情况,卡在模板引擎这里已经是四天了. 对Springboot的配置有一个比较深刻的认识,在此和大家分享一下初学者入门Spring Boot的注意事项,如果是初学SpringB ...
- Java 过滤器实现(登录) + 拦截器(两种方法)
以下是实现未登录不能进入页面的实现 使用了thyemeleaf+SpringBoot+过滤器实现的,过滤器的核心代码如下: @Component @WebFilter(filterName = &qu ...
- springboot(五).如何在springboot项目中使用拦截器
在每个项目中,拦截器都是我们经常会去使用的东西,基本上任一一个项目都缺不了拦截器的使用. 如日志记录.登录验证,session验证等,都需要拦截器来拦截URL请求,那springboot中的拦截器是如 ...
随机推荐
- Mina使用总结(三)MinaClient
简单的Mina客户端代码MinaSimpleClient.java: package com.bypay.mina.client; import java.net.InetSocketAddress; ...
- python的unittest框架中如何删除测试数据,清理环境,可以通过addCleanup函数
def addCleanup(self, function, *args, **kwargs): """Add a function, with arguments, t ...
- Python 2.7和3.6爬取妹子图网站单页测试图片
1.url= http://www.mzitu.com/74100/x,2为1到23的值 2.用到模块 os 创建文件目录; re模块正则匹配目录名 图片下载地址; time模块 限制下载时间;req ...
- ES6新特性4:字符串的扩展
本文摘自ECMAScript6入门,转载请注明出处. 一.ES5字符串函数 concat: 将两个或多个字符的文本组合起来,返回一个新的字符串. indexOf: 返回字符串中一个子串第一处出现的索引 ...
- 正则表达式详解<一>
正则表达式是一种处理字符串的微型语言:有以下的基本术语: l 模式(pattern):正则表达式实际上是通过字符串表达的一个模式 l 匹配(match): 判断正则表达式和给出的序列[first ...
- select、poll 和epoll区别
阻塞 I/O(blocking IO) 当用户进程调用了recvfrom这个系统调用,kernel就开始了IO的第一个阶段:准备数据(对于网络IO来说,很多时候数据在一开始还没有到达.比如,还没有收到 ...
- mysql 二进制日志binary log操作简单命令
show master status \G; #查看当前正在记录的二进制日志 show binary logs; #查看binary log 所有文件列表 show binlog events; #查 ...
- 如何将freemarker文件转化为html文件
最近在做静态的页面报表服务,将前端生成的ftl文件转化为html格式的文件,供后面合成pdf使用. freemarker基础可以参见:freemarker官方文档 前期准备:需要一个基础的ftl格式的 ...
- P1880 [NOI1995]石子合并
题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...
- bat 数组实现
bat中没有数组的概念,可以通过有[]的多个变量来存储一组值 @echo off & setlocal enabledelayedexpansion .txt) do ( echo %%b e ...