文章目录
🌕博客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);}}
版权归原作者 己不由心王道长 所有, 如有侵权,请联系我们删除。