springboot基本使用八(mbatisplus+filter实现登录功能)

mybatisplus依赖:

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version>
</dependency>

mysql依赖:

<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope>
</dependency>

 lombox依赖:

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>

数据库表数据:


SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (`id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '唯一标识',`nickname` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户名称'
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('843232', '李哪吒');
INSERT INTO `user` VALUES ('994343', '杨戬');SET FOREIGN_KEY_CHECKS = 1;

前端:

    html:

<div class="whole"><ul class="user_login"><li><label>id:</label><input type="text" name="id"  /></li><li><label>姓名:</label><input type="text" name="nickname" class="name" /><span          class="prompt_mes"></span></li><li><span class="bnt_login">登录</span></li></ul></div>

    css:

 <style>*{margin: 0;padding: 0;}ul{list-style: none;}.whole{margin: 0 auto;height: 200px;width: 500px;border: 1px solid #000000;}.user_login li{height: 50px;margin: 10px 0;position: relative;}label{display: inline-block;width: 180px;text-align: right;}input{height: 30px;outline: none;padding-left: 5px;}.prompt_mes{position: absolute;top: 5px;left: 360px;font-size: 14px;color: red;}.bnt_login{background: red;position: absolute;left: 50%;transform: translateX(-50%);bottom: 0;padding: 10px 20px;color: white;cursor: pointer;border-radius: 5px;}</style>

      js:

<script>$(function () {$(".bnt_login").on("click",function () {var name = $(".name").val();if(name.trim() == ""){$(".name").siblings(".prompt_mes").html("用户名不能为空");return;}$.ajax({url:"/user/login",type:"GET",data:{"nickname":$(".name").val().trim()},success:function (data) {window.location.href="/success.html";},error:function (error) {$(".name").siblings(".prompt_mes").html(error.responseText.replace(/"/g, ''));}})});});</script>

       整体前端代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录</title><script type="application/javascript" src="js/jquery.js"></script><style>*{margin: 0;padding: 0;}ul{list-style: none;}.whole{margin: 0 auto;height: 200px;width: 500px;border: 1px solid #000000;}.user_login li{height: 50px;margin: 10px 0;position: relative;}label{display: inline-block;width: 180px;text-align: right;}input{height: 30px;outline: none;padding-left: 5px;}.prompt_mes{position: absolute;top: 5px;left: 360px;font-size: 14px;color: red;}.bnt_login{background: red;position: absolute;left: 50%;transform: translateX(-50%);bottom: 0;padding: 10px 20px;color: white;cursor: pointer;border-radius: 5px;}</style><script>$(function () {$(".bnt_login").on("click",function () {var name = $(".name").val();if(name.trim() == ""){$(".name").siblings(".prompt_mes").html("用户名不能为空");return;}$.ajax({url:"/user/login",type:"GET",data:{"nickname":$(".name").val().trim()},success:function (data) {window.location.href="/success.html";},error:function (error) {$(".name").siblings(".prompt_mes").html(error.responseText.replace(/"/g, ''));}})});});</script>
</head>
<body><div class="whole"><ul class="user_login"><li><label>id:</label><input type="text" name="id"  /></li><li><label>姓名:</label><input type="text" name="nickname" class="name" /><span class="prompt_mes"></span></li><li><span class="bnt_login">登录</span></li></ul></div>
</body>
</html>

后端:

       启动类:

@SpringBootApplication
@ServletComponentScan
public class HellordApplication {public static void main(String[] args) {SpringApplication.run(HellordApplication.class, args);}}

      注意:一定要加上@ServletComponentScan注解,通过这个注解扫描filter,不然filter不生效

实体类:

@Data
public class User {private String id;private String nickname;
}

     mapper层:

@Mapper
public interface UserMapper extends BaseMapper<User> {
}

       service层:

public interface UserService extends IService<User> {
}

      service层实现类:

@Service
public class UserServiceImple extends ServiceImpl<UserMapper, User> implements UserService {
}

     controller层:

@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/login")public String login(String nickname, HttpServletRequest request, HttpServletResponse response){LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<User>();lambdaQueryWrapper.eq(nickname != null,User::getNickname,nickname);User user = userService.getOne(lambdaQueryWrapper);//System.err.println(user);if(user == null){response.setStatus(400);return "用户名不正确";}request.getSession().setAttribute("id",user.getId());return "成功";}
}

      处理中午乱码:

@Configuration
public class WebReourcesConfig extends WebMvcConfigurationSupport {/*** 设置静态资源映射* @param registry*/@Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry){// 访问地址为http://localhost:端口/123/静态资源名称// registry.addResourceHandler("/123/**").addResourceLocations("classPath:/123/");// 访问地址为http://localhost:端口/静态资源名称registry.addResourceHandler("/**").addResourceLocations("classPath:/");}/*** 处理中文乱码问题* @param converters*/@Overrideprotected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {//创建消息转换器对象MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();//设置对象转换器,底层使用Jackson将Java对象转为jsonmessageConverter.setObjectMapper(new JacksonObjectMapper());//将上面的消息转换器对象追加到mvc框架的转换器集合中converters.add(0,messageConverter);}}
public class JacksonObjectMapper extends ObjectMapper {public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";public JacksonObjectMapper() {super();//收到未知属性时不报异常this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);//反序列化时,属性不存在的兼容处理this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);SimpleModule simpleModule = new SimpleModule().addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT))).addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT))).addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT))).addSerializer(BigInteger.class, ToStringSerializer.instance).addSerializer(Long.class, ToStringSerializer.instance).addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT))).addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT))).addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));//注册功能模块 例如,可以添加自定义序列化器和反序列化器this.registerModule(simpleModule);}
}

      filter:

@WebFilter(filterName = "loginFilter",urlPatterns = "/*")
public class LoginFilter implements Filter {public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;// 获取本次请求的地址String requestURI = request.getRequestURI();Object id = request.getSession().getAttribute("id");// 放行路径String[] urls = new String[]{"/user/**","/login.html"};boolean flag = check(urls,requestURI);if(flag){filterChain.doFilter(request,response);return;}if(id != null){ // 表示已经登陆过filterChain.doFilter(request,response);return;}response.sendRedirect("/login.html");}/*** 路径匹配,检查本次请求是否需要放行* @param urls* @param requestURI* @return*/public boolean check(String[] urls,String requestURI){for (String url : urls) {boolean match = PATH_MATCHER.match(url, requestURI);if (match) {return true;}}return false;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/781834.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式(5):原型模式

一.原型模式 通过 n e w 产生一个对象需要非常繁琐的数据准备或访问权限&#xff0c;则可以使用原型模式。 \color{red}{通过new产生一个对象需要非常繁琐的数据准备或访问权限&#xff0c;则可以使用原型模式。} 通过new产生一个对象需要非常繁琐的数据准备或访问权限&#xf…

代码学习记录31---动态规划开始

随想录日记part31 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.29 主要内容&#xff1a;今天开始要学习动态规划的相关知识了&#xff0c;今天的内容主要涉及四个方面&#xff1a; 理论基础 ; 斐波那契数 ;爬楼梯 ;使用最小花费爬楼梯。 理论基础 509. 斐…

SQLServer sys.default_constraints介绍

sys.default_constraints 是 SQL Server 的系统视图&#xff0c;它包含了数据库中所有默认约束的信息。默认约束是数据库对象&#xff08;如表中的列&#xff09;的约束&#xff0c;它为列定义了一个默认值&#xff0c;当在插入新行时没有为该列提供值时&#xff0c;将使用这个…

【保姆级教程】DeepLabV3+语义分割:训练自己的数据集

一、DeepLabV3图像语义分割原理 DeepLabV3架构采用扩张卷积&#xff08;也称为空洞卷积&#xff09;来捕捉多尺度信息&#xff0c;从而在不损失空间分辨率的情况下实现对图像的精细分割。 二、DeepLabV3代码及预训练权重下载 2.1 下载deeplabv3代码 这里使用的是B站大佬Bu…

axios+springboot上传图片到本地(vue)

结果&#xff1a; 前端文件&#xff1a; <template> <div> <input type"file" id"file" ref"file" v-on:change"handleFileUpload()"/> <button click"submitFile">上传</button> </div&g…

基于ssm的留学生交流互动论坛网站(java项目+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的留学生交流互动论坛网站。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 留学生交流互动论坛网站…

如何做一个知识博主? 思考 + 提问

如何将一件事情思考清楚&#xff1f; 能从全局出发去思考&#xff0c;而非局部&#xff0c;脑子更为开放而非局限做事情依赖逻辑&#xff0c;也依赖自己的直觉兼具理性和充满情感有事情有很强的好奇心了解自己的动机&#xff0c;并且将动机转化为很强的力量 [行动力]大胆假设小…

Solana 2024 投资新风口:挖掘 DeFi、硬件开发与交易创新

将区块链的技术红利带给所有用户&#xff0c;Solana 自 2017 年诞生以来就致力于赋予开发者、消费者、投资人等各路人士的优越应用体验。在“以太坊杀手”林立的公链竞争阶段&#xff0c;Solana 凭借高性能公链的独特定位&#xff0c;朝着去中心化、安全性、低成本的目标不断精…

刷爆LeetCode:两数之和 【1/1000 第一题】

&#x1f464;作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 作者专栏每日更新&#xff1a;LeetCode解锁1000题: 打怪升级之旅https://blog.csdn.net/cciehl/category…

设计模式之建造者模式精讲

也叫生成器模式。将一个复杂的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 在建造者模式中&#xff0c;有如下4个角色&#xff1a; 抽象建造者&#xff08;Builder&#xff09;&#xff1a;用于规范产品的各个组成部分&#xff0c;并进行抽象&…

c++使用类的一些注意事项

前言&#xff1a; 本篇内容为前面的补充&#xff0c;介绍了我们使用类时需要注意些什么以及一些编译器的优化&#xff0c;可能有些理解不到位或者错误&#xff0c;请斧正。 目录 前言&#xff1a; 1.再谈构造函数 2.&#xff08;c98&#xff09;隐式类型转换中的编译器的优…

【BlossomRPC】服务暴露与发现

文章目录 RPC项目 配置中心项目 网关项目 与传统RPC框架一样&#xff0c;我们需要保证我们的服务是能被发现的。 也就是说&#xff0c;我希望通过一种简单的方式&#xff0c;就能将我们的服务暴露出去&#xff0c;使得其他服务可以方便的去依赖这个服务。 因此&#xff0c;我…

Codeforces Round 934 (Div. 2) D. Non-Palindromic Substring

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e9, maxm 4e4 5; co…

JavaScript如何制作轮播图

在JavaScript中实现轮播图可以通过多种方式&#xff0c;但最常见的方式是使用数组来存储图片&#xff0c;然后使用setInterval函数定期更改显示的图片。下面是一个简单的例子&#xff1a; 首先&#xff0c;你需要在HTML中设置一些用于显示图片的<img>标签&#xff0c;以…

【初阶数据结构】——牛客:CM11 链表分割

文章目录 1. 题目介绍2. 思路分析3. 代码实现 1. 题目介绍 链接: link 这道题是给我们一个链表和一个值X &#xff0c;要求我们以给定值x为基准将链表分割成两部分&#xff0c;所有小于x的结点排在大于或等于x的结点之前。 最终返回重新排列之后的链表的头指针。 2. 思路分析…

用WHERE命令可以在命令行搜索文件

文章目录 用WHERE命令可以在命令行搜索文件概述笔记没用的小程序END 用WHERE命令可以在命令行搜索文件 概述 想确认PATH变量中是否存在某个指定的程序(具体是在PATH环境变量中给出的哪个路径底下?). 开始不知道windows有where这个命令, 还自己花了2个小时写了一个小程序. 后…

Redis 的慢日志

Redis 的慢日志 Redis 的慢日志&#xff08;Slow Log&#xff09;是用于记录执行时间超过预设阈值的命令请求的系统。慢日志可以帮助运维人员和开发人员识别潜在的性能瓶颈&#xff0c;定位那些可能导致 Redis 性能下降或响应延迟的慢查询。以下是 Redis 慢日志的相关细节&…

hcip综合实验2

目录 实验拓扑&#xff1a; 实验要求&#xff1a; 实验思路&#xff1a; 实验步骤&#xff1a; 1.配置设备接口IP 2.通过配置缺省路由让公网互通 3.配置ppp 1.R1和R5间的ppp的PAP认证&#xff1b; 2.R2与R5之间的ppp的CHAP认证; 3. R3与R5之间的HDLC封装; 4.构建R1、…

K8S故障处理指南:pod驱逐问题处理

更多技术博客,请关注微信公众号:运维之美 在K8S集群故障处理过程中,你可能遇到过pod的各种状态,Evicted状态代表你的K8S环境遇到了资源驱逐的问题,本节通过对驱逐问题的解决,参数的调整,问题的处理思路,希望给你解决此类问题提供帮助。 一、pod驱逐问题 pod出现状态为…

鸽巢原理,也被称为抽屉原理或鸽笼原理

鸽巢原理&#xff0c;也被称为抽屉原理或鸽笼原理&#xff0c;是数学中一种非常重要的基本原理。它的表述虽然简单&#xff0c;但应用范围却极其广泛&#xff0c;无论是在理论数学还是在实际应用中&#xff0c;鸽巢原理都发挥着不可替代的作用。 一、鸽巢原理的基本定义与表述…