Spring 全家桶之 Spring Boot 2.6.4(六)- Web Develop(Part B)

简介: Spring 全家桶之 Spring Boot 2.6.4(六)- Web Develop(Part B)

三、登录功能开发

登录页面以及Dashboard页面均可在 Bootstrap官网 获取

新建LoginController,增加login方法来处理登录请求,login方法中只要求前端输入用户名为lilith且password为pc12138才可以返回dashboard页面

@Controller
public class LoginController {
    @PostMapping("/user/login")
    public String login(@RequestParam("username") String username, @RequestParam("password") String password,
                        Map<String, Object> map){
        if ("lilith".equals(username) && "pc12138".equals(password)){
            // 用户名lilith,密码为pc12138即可登录成功
            return "dashboard";
        } else {
            // 登录失败
            map.put("msg", "用户名密码错误");
            return "index";
        }
    }
}
复制代码

当验证失败时,将错误信息放在map中,并使用Thymeleaf模板引擎渲染出错误提示信息。

修改index.html页面登录表单提交地址为/user/login,表单提交的method为post。重新启动应用,进入localhost:8080并在登录表单输入正确的用户名和密码;点击登录

image.png

页面报错404,并且服务端报错username参数不存在

image.png

这是因为在用户名和密码的input框没有name属性,请求的body中也就没有username和password这两个key,Spring MVC也就无法获取这两个参数。

这里修改html页面可能会由于thymeleaf缓存导致修改不会生效,可以开启禁用thymeleaf缓存

# 禁用thymeleaf缓存
spring.thymeleaf.cache=false
复制代码

页面修改完成之后需要重新编译。

重新启动应用,输入正确的用户名密码之后,点击登录

image.png

浏览器跳转到dashboard页面。

重新回到登录页面,输入错误的用户名和密码,点击登录

image.png

页面重新跳转到登录页面,没有显示在login方法中定义的错误信息;要想在页面显示错误消息,需要使用Thymeleaf模板引擎;可以参考Thymeleaf官方文档 7.1 Simple conditionals: “if” and “unless”

Please sign in下面添加P标签

<!--判断,只有输入的用户名密码错误是才会显示p标签,既map不为空的时候显示p标签-->
<p style="color: red" th:text="${msg}" th:if="${not #strings.isEmpty(msg)}"></p>
复制代码

重新启动应用,输入错误的用户名和密码并点击登录

image.png

通过Thymeleaf模板引擎已经成功获取map中报错的错误提示消息并显示在页面上。

解决表单重复提交的问题

在登录成功之后虽然页面可以跳转到dashboard页面,但是浏览器的URL地址仍然是user/login,这是表单提交的地址,如果刷新首页会出现重提提交表单的提示。

image.png

解决这个问题最好是重定向到dashboard页面,而不是直接返回dashboard页面,首先要增加一个视图映射

public void addViewControllers(ViewControllerRegistry registry) {
    // 浏览器发送 /lilith 页面跳转到success页面
    registry.addViewController("/lilith").setViewName("success");
    registry.addViewController("/").setViewName("index");
    registry.addViewController("/index.html").setViewName("index");
    registry.addViewController("/dashboard").setViewName("dashboard");
}
复制代码

修改login方法,重定向到dashboard

@PostMapping("/user/login")
public String login(@RequestParam("username") String username, @RequestParam("password") String password,
                    Map<String, Object> map){
    if ("lilith".equals(username) && "pc12138".equals(password)){
        // 用户名为lilith,密码为pc12138即可登录成功
        // 防止表单提交,重定向到dabshboard
        return "redirect:/dashboard";
    } else {
        // 登录失败
        map.put("msg", "用户名密码错误");
        return "index";
    }
}
复制代码

重新启动应用,再次测试,浏览器的地址已经不再是表单提交的地址了,并且不会发生表单提交的问题,资源加载的问题也解决了。

image.png

但是还有一个问题,就是该页面没有做权限控制,也就是说在浏览器输入这个地址可以直接进入该页面无需登录,更没有登录提示;这时候就可以使用拦截器进行登录检查,只有登录之后才能进入该页面。

在这之前要修改login方法,将登录后的用户信息保存在session中

@PostMapping("/user/login")
public String login(@RequestParam("username") String username, @RequestParam("password") String password,
                    Map<String, Object> map, HttpSession session){
    if ("lilith".equals(username) && "pc12138".equals(password)){
        // 用户名为lilith,密码为pc12138即可登录成功
        // 防止表单提交,重定向到dabshboard
        session.setAttribute("currentUser",username);
        return "redirect:/dashboard";
    } else {
        // 登录失败
        map.put("msg", "用户名密码错误");
        return "index";
    }
}
复制代码

接着在config包下新建一个登录拦截器

public class LilithHandlerInterceptor implements HandlerInterceptor {
    // 目标方法执行前
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // session中获取登录用户
        Object currentUser = request.getSession().getAttribute("currentUser");
        if (currentUser == null){
            // 未登录的情况,拦截
            request.setAttribute("msg","请先登录");
            request.getRequestDispatcher("/index.html").forward(request,response);
            return false;
        } else {
            // 已经登录,放行
            return true;
        }
    }
}
复制代码

在config包下的LilithMvcCofnig配置类中注册拦截器

// 注册拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new LilithHandlerInterceptor())
            .addPathPatterns("/**")
            .excludePathPatterns("/index.html","/","/user/login");
}
复制代码

重启应用,在火狐浏览器中输入 http://localhost:8080/dashboard

image.png

显示登录界面,说明拦截器生效了,但是页面样式丢失,说明静态资源也被拦截掉了,需要对静态资源放行

修改注册的拦截器

// 注册拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new LilithHandlerInterceptor())
            .addPathPatterns("/**")
            .excludePathPatterns("/index.html","/","/user/login","/asserts/**","/webjars/**");
}
复制代码

重新启动应用,浏览器中再次输入 http://localhost:8080/dashboard

image.png

页面样式已经正常

REST 风格 URL 定义

REST是一种软件架构风格,或者说是一种规范,其强调HTTP应当以资源为中心,并且规范了URI的风格;规范了HTTP请求动作(GET/PUT/POST/DELETE/HEAD/OPTIONS)的使用,具有对应的语义。

根据REST风格定义CRUD的URL

操作 URI Method
查询所有 list GET
查询单个 employee/{id} GET
进入添加页面 employee GET
添加操作 employee POST
进入修改页面 edit/{id} GET
保存操作 employee PUT
删除操作 employee/{id} DELETE


相关文章
|
8天前
|
网络协议 Java Shell
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
39 7
|
23天前
|
监控 Java 应用服务中间件
SpringBoot是如何简化Spring开发的,以及SpringBoot的特性以及源码分析
Spring Boot 通过简化配置、自动配置和嵌入式服务器等特性,大大简化了 Spring 应用的开发过程。它通过提供一系列 `starter` 依赖和开箱即用的默认配置,使开发者能够更专注于业务逻辑而非繁琐的配置。Spring Boot 的自动配置机制和强大的 Actuator 功能进一步提升了开发效率和应用的可维护性。通过对其源码的分析,可以更深入地理解其内部工作机制,从而更好地利用其特性进行开发。
42 6
|
29天前
|
XML Java 应用服务中间件
Spring Boot 两种部署到服务器的方式
本文介绍了Spring Boot项目的两种部署方式:jar包和war包。Jar包方式使用内置Tomcat,只需配置JDK 1.8及以上环境,通过`nohup java -jar`命令后台运行,并开放服务器端口即可访问。War包则需将项目打包后放入外部Tomcat的webapps目录,修改启动类继承`SpringBootServletInitializer`并调整pom.xml中的打包类型为war,最后启动Tomcat访问应用。两者各有优劣,jar包更简单便捷,而war包适合传统部署场景。需要注意的是,war包部署时,内置Tomcat的端口配置不会生效。
231 17
Spring Boot 两种部署到服务器的方式
|
1月前
|
缓存 安全 Java
Spring Boot 3 集成 Spring Security + JWT
本文详细介绍了如何使用Spring Boot 3和Spring Security集成JWT,实现前后端分离的安全认证概述了从入门到引入数据库,再到使用JWT的完整流程。列举了项目中用到的关键依赖,如MyBatis-Plus、Hutool等。简要提及了系统配置表、部门表、字典表等表结构。使用Hutool-jwt工具类进行JWT校验。配置忽略路径、禁用CSRF、添加JWT校验过滤器等。实现登录接口,返回token等信息。
359 12
|
1月前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
83 8
|
2月前
|
缓存 前端开发 Java
【Spring】——SpringBoot项目创建
SpringBoot项目创建,SpringBootApplication启动类,target文件,web服务器,tomcat,访问服务器
|
2月前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
103 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
2月前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
209 5
|
3月前
|
XML Java 网络架构
使用 Spring Boot 公开 SOAP Web 服务端点:详细指南
使用 Spring Boot 公开 SOAP Web 服务端点:详细指南
168 0
|
3月前
|
监控 Java 数据库连接
详解Spring Batch:在Spring Boot中实现高效批处理
详解Spring Batch:在Spring Boot中实现高效批处理
468 12

热门文章

最新文章