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中的拦截器是如 ...
随机推荐
- print(函数.__closure__) 来判断是不是闭包, 返回cell , 是闭包, 返回None 则不是闭包
print(函数.__closure__) 来判断是不是闭包, 返回cell , 是闭包, None 则不是闭包
- 【1】python-正则表达式语法规范与案例
正则表达式的用法与案例分析 2018-08-24 21:26:14 [说明]:该文主要为了随后复习和使用备查,由于做了word文档笔记,所以此处博文没有怎么排版,没放代码,以插入图片为主, 一.正则表 ...
- 我在德国做SAP CRM One Order redesign工作的心得
时间过得很快,今天是我到德国工作的第四周,刚好一个月.Prototype的框架已经搭起来了,现在Order能够在新的框架下正常读写,能跑一些简单的scenario,这些scenario对于end us ...
- 到底该用img还是background-image?
在前端页面的实现过程中,我们经常会遇到这个情况:有一个盒子,盒子里面需要放一张图片.这个时候,我们既可以通过添加image标签来实现,也可以通过设置背景图的形式实现,哪种更好呢? 一般情况下,可能就是 ...
- 关于右键属性与du -sh显示的文件大小不一致的解决
du -sh filename(其实我们经常用du -sh *,显示当前目录下所有的文件及其大小,如果要排序再在后面加上 | sort -n) 关于右键属性与du -sh显示的文件大小不一致的解决 ...
- hdu2824 The Euler function(欧拉函数个数)
版权声明:本文为博主原创文章,未经博主同意不得转载. vasttian https://blog.csdn.net/u012860063/article/details/36426357 题目链接:h ...
- 1034. [ZJOI2008]泡泡堂【贪心】
Description 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表 队由n名选手组成,比赛的项目是老少咸宜的网络游戏泡泡堂.每一场比赛前,对 ...
- 【转】np.linspace()、np.logspace()、np.arange()
转自:https://blog.csdn.net/ui_shero/article/details/78881067 1.np.linspace() 生成(start,stop)区间指定元素个数num ...
- Caused by: org.apache.velocity.exception.MethodInvocationException: Invocation of method 'getUser' in class org.uncommons.reportng.ReportMetadata threw exception class java.net.UnknownHostException :
Running TestSuite [TestNG] [WARN] Ignoring duplicate listener : org.uncommons.reportng.HTMLReporter ...
- JS判断指定dom元素是否在屏幕内的方法实例
前言 刷网页的时候,有时会遇到这样一个情景,当某个dom元素滚到可见区域时,或者图片的懒加载效果,它就会展现显示动画,十分有趣.那么这是如何实现的呢? 实现原理 想要实现这个功能,就要知道具体的实现原 ...