0


【cookie+mybatis+servlet】实现免登录时长两天半

文章目录

🌕博客x主页:
己不由心王道长🌕!

🌎文章说明:javaWeb🌎

✅系列专栏:
javaWeb

🌴本篇内容:使用cookie、session+servlet+filter+jsp实现十天免登录(对所需知识点进行选择阅读呀~)🌴

☕️每日一语:人生需要多彩,别让无聊占据心灵的天空,前行的路上,不但有鸟语花香,也有风雨雷电,靠谁不如靠自己,我们需要的是真真实实的幸福与温暖。 ☕️

🕤作者详情:作者是一名双非大三在校生,喜欢Java,欢迎大家探讨学习,喜欢的话请给博主一个三连鼓励。🕤

前言

应用主要用到的技术有session、cookie、转发、重定向、filter、和servlet,最重要的还是具体的来运用它们在前端页面真正的搭建出一个应用,通过这个练习,对我们所学的web知识做一个整合。

流程

整体流程就是浏览器(客户端)向服务器端发送请求,服务器端servlet调用mybatis对数据库进行查询及操作,返回结果
在这里插入图片描述

大概框架

在这里先把简单的架子搭起来,测试能不能实现前后端互通。比如前端登录之后经过服务器调用查询数据库,先把架子搭起来,再添加其他的操作。这样更能使得框架结构清晰
----------值得注意的是,要把各种依赖或者配置的版本整合起来,这里大概配置如下:jdk1.8、tomcat9、webservlet4.0

数据库实现:

我比较习惯从后端往前端做,先把表设计出来,这里因为只做一个简单的十天免登录,所以用户表只设置了两个字段。

createtable tbl_user(
username varchar(22),
password  varchar(22));insertinto 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><packagename="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"/><packagename="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层的接口创建方法访问数据库:

packagecom.bipt.mapper;importcom.bipt.pojo.User;importorg.apache.ibatis.annotations.Param;/**
 * @author 不止于梦想
 * @date 2022/10/3 18:53
 */publicinterfaceUserMapper{//验证登录的用户是否存在Userselect(@Param("username")String username,@Param("password")String password);//添加用户intaddUser(@Param("username")String username,@Param("password")String password);}

应该注意到UserMapper 的方法和UserMapper.xml中的select中的id相同,这就是动态代理的方式,通过配置文件映射创建对象,并调用方法

三层架构的service层

编程一个理念是面向接口编程,如果要想实现方法,就创建该接口的实现类!!!
在这里我们创建service接口,并创建实现类用以实现接口方法。
UserService:

packagecom.bipt.service;importcom.bipt.pojo.User;/**
 * @author 不止于梦想
 * @date 2022/10/3 20:04
 */publicinterfaceUserService{/**
     * 登录方法
     */Userlogin(String username,String password);/**
     * 注册方法
     */intregister(String username,String password);}

implUserService:

packagecom.bipt.service.implService;importcom.bipt.mapper.UserMapper;importcom.bipt.pojo.User;importcom.bipt.service.UserService;importcom.bipt.utils.SqlSessionFactoryUtils;importorg.apache.ibatis.session.SqlSession;importorg.apache.ibatis.session.SqlSessionFactory;/**
 * @author 不止于梦想
 * @date 2022/10/3 20:16
 */publicclassImplUserServiceimplementsUserService{SqlSessionFactory sessionFactory =SqlSessionFactoryUtils.getSqlSessionFactory();@OverridepublicUserlogin(String username,String password){SqlSession session =sessionFactory .openSession();UserMapper mapper = session.getMapper(UserMapper.class);User user = mapper.select(username, password);return user;}@Overridepublicintregister(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:

```packagecom.bipt.controller;importcom.bipt.pojo.User;importcom.bipt.service.implService.ImplUserService;importjavax.servlet.ServletException;importjavax.servlet.http.*;importjava.io.IOException;/**
 * 用户登录的servlet
 * @author 不止于梦想
 * @date 2022/10/3 18:26
 *///@WebServlet("/loginServlet")publicclassLoginServletextendsHttpServlet{privateImplUserService implUserService =newImplUserService();@OverrideprotectedvoiddoGet(HttpServletRequest req,HttpServletResponse resp)throwsServletException,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)){//为真,则创建cookieCookie cookie1 =newCookie("username",username);Cookie cookie2 =newCookie("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);}}@OverrideprotectedvoiddoPost(HttpServletRequest req,HttpServletResponse resp)throwsServletException,IOException{this.doGet(req,resp);}}***执行注册控制的loginServlet:***
```java
packagecom.bipt.controller;importcom.bipt.service.implService.ImplUserService;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;importjava.io.Writer;/**
 * @author 不止于梦想
 * @date 2022/10/5 13:42
 */@WebServlet("/registerServlet")publicclassRegisterServletextendsHttpServlet{privateImplUserService implUserService =newImplUserService();@OverrideprotectedvoiddoGet(HttpServletRequest req,HttpServletResponse resp)throwsServletException,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");}}@OverrideprotectedvoiddoPost(HttpServletRequest req,HttpServletResponse resp)throwsServletException,IOException{this.doGet(req, resp);}}

为了防止在我们没有登录的情况下,就访问了其他资源,我创建了一个utils工具包,配置了一个过滤器

packagecom.bipt.utils;importjavax.servlet.*;importjavax.servlet.annotation.WebFilter;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.Cookie;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpSession;importjava.io.IOException;/**
 * @author 不止于梦想
 * @date 2022/10/5 22:03
 */@WebFilter(filterName ="loginFilter",urlPatterns ="*.html")publicclassLoginFilterimplementsFilter{@OverridepublicvoiddoFilter(ServletRequest req,ServletResponse resp,FilterChain filterChain)throwsIOException,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,对用户是否登录进行查证,已经登录则放行,没有登录则跳转登录界面。

packagecom.bipt.controller;importcom.bipt.pojo.User;importcom.bipt.service.implService.ImplUserService;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.Cookie;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;/**
 *
 * 实现登录检查
 * @author 不止于梦想
 * @date 2022/10/5 19:37
 */@WebServlet("/logCheckServlet")publicclassLogCheckServletextendsHttpServlet{privateImplUserService implUserService =newImplUserService();@OverrideprotectedvoiddoGet(HttpServletRequest req,HttpServletResponse resp)throwsServletException,IOException{String username=null;String password=null;Cookie[] cookies = req.getCookies();for(Cookie cookie:cookies){if("username".equals(cookie.getName())){
                username = cookie.getValue();}elseif("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");}}}@OverrideprotectedvoiddoPost(HttpServletRequest req,HttpServletResponse resp)throwsServletException,IOException{this.doGet(req,resp);}}
标签: tomcat maven java

本文转载自: https://blog.csdn.net/qq_63992577/article/details/127172181
版权归原作者 己不由心王道长 所有, 如有侵权,请联系我们删除。

“【cookie+mybatis+servlet】实现免登录时长两天半”的评论:

还没有评论