cookie+mybatis+servlet实现免登录时长两天半的整体流程
前言
应用主要用到的技术有session、cookie、转发、重定向、filter、和servlet,最重要的还是具体的来运用它们在前端页面真正的搭建出一个应用,通过这个练习,对我们所学的web知识做一个整合。
流程
整体流程就是浏览器(客户端)向服务器端发送请求,服务器端servlet调用mybatis对数据库进行查询及操作,返回结果
大概框架
在这里先把简单的架子搭起来,测试能不能实现前后端互通。比如前端登录之后经过服务器调用查询数据库,先把架子搭起来,再添加其他的操作。这样更能使得框架结构清晰
----------值得注意的是,要把各种依赖或者配置的版本整合起来,这里大概配置如下:jdk1.8、tomcat9、webservlet4.0
数据库实现:
我比较习惯从后端往前端做,先把表设计出来,这里因为只做一个简单的十天免登录,所以用户表只设置了两个字段。
create table tbl_user( username varchar(22), password varchar(22) ); insert into tbl_user values ('zhangsan','775033');
这里得介绍一个东西,什么东西呢?三层架构!!!**
三层架构:
不用想的太复杂,其实就是在开发中,随着信息量的增大,如果按照以前的格式代码全写一块,过于冗余,而且不便于维护,这个时候就跳出了三层架构的方法,简单来说就是把复制不同功能的代码分成不同阶级。每一部分各司其职。
表示层(controller):主要对用户的请求接受,以及数据的返回,为客户端提供应用程序的访问。
业务逻辑层(service):主要负责对数据层的操作。也就是说把一些数据层的操作进行组合。
数据访问层(dao/mapper):主要看数据层里面有没有包含逻辑处理,实际上它的各个函数主要完成各个对数据文件的操作。而不必管其他操作。
介绍完上边之后,我们就可以开始搭建三层架构的框子了!!!
三层架构架子
这里的pojo是实体类,也就是JavaBean
项目创建—导入依赖
相信大家都会创建项目了,这里我创建了一个叫做session的模块,用于项目的实现
pom.xml:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>servlet-test01</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <!-- 添加测试依赖--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!-- 添加mybatis依赖--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <!-- 添加servlet依赖--> <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <!-- 添加MySQL依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.29</version> </dependency> <!-- 添加jsp依赖--> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.2.1</version> <scope>provided</scope> </dependency> <!-- 添加el表达式依赖--> <dependency> <groupId>javax.el</groupId> <artifactId>javax.el-api</artifactId> <version>3.0.0</version> </dependency> <!-- 添加jstl标签库依赖--> <dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl-api</artifactId> <version>1.2</version> </dependency> </dependencies> </project>
接下来就是从底层做起,先从数据访问层开始
mybatis配置文件创建:
SqlMapperConfig.xml:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!--导入数据源--> <properties resource="jdbc.properties"> </properties> <typeAliases> <!--设置实体类别名--> <typeAlias type="com.bipt.pojo.User" alias="user"></typeAlias> <package name="com.bipt.pojo"/> </typeAliases> <!--配置环境--> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/><!--事物管理器--> <dataSource type="POOLED"><!----> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!--注册mapper文件--> <mappers> <mapper resource="com/bipt/mapper/UserMapper.xml"/> <package name="com.bipt.mapper.UserMapper"/> </mappers> </configuration>
jdbc.properties:
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/tbl_student?serverTimezone=UTC jdbc.username=root jdbc.password=775033
构造usermapper:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.bipt.mapper.UserMapper">
数据访问层的映射文件:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.bipt.mapper.UserMapper"> <select id="select" resultType="user"> select username,password from tbl_user where username=#{username} and password=#{password}; </select> <insert id="addUser"> insert into tbl_user values ('${username}','${password}'); </insert> </mapper>
注意该映射文件是在mapper同级目录下的,名字和mapper的实体类名字相同
当然,你也可以把UserMapper和UserMapper.xml都放在mapper层,不过这样的话就得手动的添加文件build。不推荐
创建mapper层接口
我们把配置文件弄好了之后,就开始构建mapper层的接口创建方法访问数据库:
package com.bipt.mapper; import com.bipt.pojo.User; import org.apache.ibatis.annotations.Param; /** * @author 不止于梦想 * @date 2022/10/3 18:53 */ public interface UserMapper { //验证登录的用户是否存在 User select(@Param("username") String username, @Param("password") String password); //添加用户 int addUser(@Param("username") String username, @Param("password") String password); }
应该注意到UserMapper 的方法和UserMapper.xml中的select中的id相同,这就是动态代理的方式,通过配置文件映射创建对象,并调用方法
三层架构的service层
编程一个理念是面向接口编程,如果要想实现方法,就创建该接口的实现类!!!
在这里我们创建service接口,并创建实现类用以实现接口方法。
UserService:
package com.bipt.service; import com.bipt.pojo.User; /** * @author 不止于梦想 * @date 2022/10/3 20:04 */ public interface UserService { /** * 登录方法 */ User login(String username,String password); /** * 注册方法 */ int register(String username,String password); }
implUserService:
package com.bipt.service.implService; import com.bipt.mapper.UserMapper; import com.bipt.pojo.User; import com.bipt.service.UserService; import com.bipt.utils.SqlSessionFactoryUtils; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; /** * @author 不止于梦想 * @date 2022/10/3 20:16 */ public class ImplUserService implements UserService { SqlSessionFactory sessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory(); @Override public User login(String username,String password) { SqlSession session =sessionFactory .openSession(); UserMapper mapper = session.getMapper(UserMapper.class); User user = mapper.select(username, password); return user; } @Override public int register(String username,String password) { SqlSession session =sessionFactory .openSession(); UserMapper mapper = session.getMapper(UserMapper.class); int flag = mapper.addUser(username,password); return flag; } }
controller层
现在在controller层还是一些servlet实现对各种操作的控制
执行登录控制的loginServlet:
```package com.bipt.controller; import com.bipt.pojo.User; import com.bipt.service.implService.ImplUserService; import javax.servlet.ServletException; import javax.servlet.http.*; import java.io.IOException; /** * 用户登录的servlet * @author 不止于梦想 * @date 2022/10/3 18:26 */ //@WebServlet("/loginServlet") public class LoginServlet extends HttpServlet { private ImplUserService implUserService = new ImplUserService(); @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取用户名信息 String username = req.getParameter("username"); //获取密码 String password = req.getParameter("password"); //获取记住状态 String remember = req.getParameter("remember"); //获取访问的项目路径 String contextPath = req.getContextPath(); //查询客户是否存在 User user = implUserService.login(username,password); System.out.println(user.getName()); System.out.println(user.getPassword()); //判断用户是否为真 if(user != null){ //判断用户是否勾选了记住我选项 if("1".equals(remember)){ //为真,则创建cookie Cookie cookie1 = new Cookie("username",username); Cookie cookie2 = new Cookie("password",password); //设置cookie的存活时长,设置为两天半 //cookie中无法设置double数据,那么两天半等于多少秒呢--21600秒,我们直接设置秒数 // cookie1.setMaxAge(60*60*24*2.5);这样是不行的 cookie1.setMaxAge(21600); cookie2.setMaxAge(21600); //绑定路径--任意路径访问均可 cookie1.setPath("/"); cookie2.setPath("/"); //发送cookie到客户端 resp.addCookie(cookie1); resp.addCookie(cookie2); } //把对象存储到session域中,便于过滤器使用 HttpSession session = req.getSession(); session.setAttribute("user",user); //表示成功,跳转到欢迎页面 resp.sendRedirect(""+contextPath+"/index.html"); }else{ req.getRequestDispatcher(""+contextPath+"/login.jsp").forward(req,resp); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req,resp); } } ***执行注册控制的loginServlet:*** ```java package com.bipt.controller; import com.bipt.service.implService.ImplUserService; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.Writer; /** * @author 不止于梦想 * @date 2022/10/5 13:42 */ @WebServlet("/registerServlet") public class RegisterServlet extends HttpServlet { private ImplUserService implUserService = new ImplUserService(); @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取数据 String username = req.getParameter("username"); String password = req.getParameter("password"); //获取访问的项目路径 String contextPath = req.getContextPath(); //添加用户,返回1表示添加成功,返回登录界面,返回0表示失败,返回注册界面 int flag = implUserService.register(username,password); if("1".equals(flag)){ resp.sendRedirect(contextPath+"/login.jsp"); }else{ resp.sendRedirect(contextPath+"/register.jsp"); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }
为了防止在我们没有登录的情况下,就访问了其他资源,我创建了一个utils工具包,配置了一个过滤器
package com.bipt.utils; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.io.IOException; /** * @author 不止于梦想 * @date 2022/10/5 22:03 */ @WebFilter(filterName = "loginFilter",urlPatterns = "*.html") public class LoginFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest) req; HttpSession session = httpServletRequest.getSession(); // String uri = ((HttpServletRequest) req).getRequestURI(); // int startPos = uri.lastIndexOf("."); // String result = uri.substring(startPos); Object user = session.getAttribute("user"); if(user==null){ httpServletRequest.getRequestDispatcher( httpServletRequest.getContextPath()+"/login.jsp").forward(req,resp); return; } else filterChain.doFilter(req,resp);//否则则继续执行 } }
配置filter过滤器之后,设置一个checkloginServlet,对用户是否登录进行查证,已经登录则放行,没有登录则跳转登录界面。
package com.bipt.controller; import com.bipt.pojo.User; import com.bipt.service.implService.ImplUserService; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * * 实现登录检查 * @author 不止于梦想 * @date 2022/10/5 19:37 */ @WebServlet("/logCheckServlet") public class LogCheckServlet extends HttpServlet { private ImplUserService implUserService = new ImplUserService(); @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username=null; String password=null; Cookie[] cookies = req.getCookies(); for (Cookie cookie:cookies) { if("username".equals(cookie.getName())){ username = cookie.getValue(); }else if("password".equals(cookie.getName())){ password = cookie.getValue(); } } /** * 判断username和password的值是否为空,如果不为空,则查询数据库,查到则转发到欢迎界面 */ if(username != null &&password != null){ //调用查询语句 User user = implUserService.login(username,password); if(user!=null){ resp.sendRedirect(req.getContextPath()+"index.html"); } else { resp.sendRedirect(req.getContextPath()+"/login.jsp"); } } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req,resp); } }
到此这篇关于cookie+mybatis+servlet实现免登录时长两天半的文章就介绍到这了,更多相关mybatis免登录时长内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Java Collection和Collections的区别
本文主要介绍了Java Collection和Collections的区别,Collection 是表示集合的接口,而 Collections 是对集合进行操作的工具类,下面就来介绍一下具体用法,感兴趣的可以了解一下2023-12-12MybatisPlus保存、读取MySQL中的json字段失败问题及解决
这篇文章主要介绍了MybatisPlus保存、读取MySQL中的json字段失败问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-07-07利用Spring Social轻松搞定微信授权登录的方法示例
这篇文章主要介绍了利用Spring Social轻松搞定微信授权登录的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-12-12
最新评论