个人主页:欢迎访问Ali.s的首页
⏰ 最近更新:2022年9月6日
⛽ Java框架学习系列:【Spring】【SpringMVC】【Mybatis】
Java项目实战系列:【飞机大战】【图书管理系统】
Java算法21天系列:【查找】【排序】【递归】
⛳ Java基础学习系列:【继承】【封装】【多态】
通信仿真学习系列:【硬件】【通信】【MATLAB】
个人简介:通信工程本硕、Java程序员。目前只会CURD
点赞 收藏 留言 都是我最大的动力
这里是【JAVASE】
项目实战的第五节课,前面完成了用户模块的所有功能,今天做的是登录功能,使用【Servlet】
、【Session】
、【Filterl】
、【JSP】
来实现登录和注销功能。
在前面用用户新增功能实现后,可以清楚的看到用户直接进入了后台的主界面,登录模块应该是每个管理系统必备的功能模块的,通过登录模块来达到数据安全,用户区分的目的,对于在校学生类型的管理系统,应当需要添加一个登录模块,需要账号密码才能进入系统,防止学生信息泄露。下面对登录模块进行需求分析。
当用户在浏览器登录页面提交用户名和密码后。通过服务器解析数据,与数据库信息进行校验,如果账户密码正确,则进行页面重定向操作到主界面。如果账号密码错误,则在浏览器前端登录页面给出相应的信息。如果账号未注册 ,则提示该账号无效。
在dao
层和service
层中创建接口。这里与用户模块类似,首先完成前端页面的信息,然后进行后端的校验逻辑的判断,到层处理sql
语句。
创建login.jsp
页面,对提交的表单信息进行处理,当点击提交账号密码时,通过post
请求进入登陆的控制层servlet
,在servlet
进行数据处理操作。在账号密码都正确时进入主界面,而当其错误时,返回到登录页面,并对用户给出信息错误的提示。
<div class="loginbody">
<span class="systemlogo">span>
<div class="loginbox">
<form action="/loginServlet" method="post">
<ul>
<li>
<input name="userName" type="text" class="loginuser" value="admin" />
li>
<li>
<input name="password" type="password" class="loginpwd" value="123"/>
li>
<li>
<input name="" type="submit" class="loginbtn" value="登录"/>
<label>
<input name="" type="checkbox" value="" checked="checked" />
记住密码
label>
<label>
<c:if test="${empty sessionScope.msg}">
<a href="#">忘记密码?a>
c:if>
<c:if test="${not empty sessionScope.msg}">
<span style="color: red">${sessionScope.msg}span>
c:if>
label>
li>
ul>
form>
div>
div>
通过检查账号和密码,对用户的真实性做出判读,在到dao
层完成此方法,在service
层进行调用。
@Override
public User checkUserNameAndPassword(String userName, String password) {
QueryRunner queryRunner = DBUtils.getQueryRunner();
String sql="select * from t_user where is_deleted=? and user_name=? and password=?";
try {
return queryRunner.query(sql, new ResultSetHandler<User>() {
@Override
public User handle(ResultSet resultSet) throws SQLException {
if (resultSet.next()){
User user=new User();
user.setUserName(resultSet.getString("user_name"));
user.setId(resultSet.getInt("id"));
user.setPassword(resultSet.getString("password"));
user.setPhoneNum(resultSet.getString("phone_num"));
user.setEmail(resultSet.getString("email"));
return user;
}
return null;
}
},DelFlag.No.code,userName,password);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
进入登录功能后,将不能直接访问main.jsp
页面,除了在已经登录的状态下,无法反问系统的其它资源,只有在服务器校准数据的正确性时,才能进入系统访问私有的资源信息,对数据有保护作用,通过设置过滤器,将资源进行放过,在过滤器中先判断当前的请求是否是可以匿名访问的,如果是就放过,如果不是,就拦截并跳转回登录页面。
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest) servletRequest;
HttpServletResponse response=(HttpServletResponse) servletResponse;
//获取跳转的页面的后缀
String requestURI= request.getRequestURI();
//判断是否是登录页面
if (requestURI.contains("login.jsp") || requestURI.contains("loginServlet"){
filterChain.doFilter(servletRequest,servletResponse);
}else{
//判断是否是登录状态
HttpSession session=request.getSession();
Object attribute = session.getAttribute(Constant.SESSION_LONGIN);
if (attribute!=null){
//已经登录
filterChain.doFilter(servletRequest, servletResponse);
}else{
//没有登录,进行跳转到登录页面
session.setAttribute("msg","请先登录后,再继续操作");
response.sendRedirect("/login.jsp");
}
}
在Servlet
中进行获取登录功能的实现,创建LoginServlet
,对表单信息做绑定。
package com.song.bookmanagersystem.controller;
import com.song.bookmanagersystem.entity.User;
import com.song.bookmanagersystem.service.UserService;
import com.song.bookmanagersystem.service.impl.UserServiceImpl;
import com.song.bookmanagersystem.utils.Constant;
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 javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(name="loginServlet",urlPatterns = "/loginServlet")
public class LoginServlet extends HttpServlet {
UserService userService=new UserServiceImpl();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//get请求也是使用post请求
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取表单提交的信息
String userName=req.getParameter("userName");
String password=req.getParameter("password");
//2.调用service中的方法来验证
User user = userService.checkUserNameAndPassword(userName, password);
HttpSession session = req.getSession();
//3.根据验证的结果来做出对应的响应
if (user !=null){
//防止密码泄露
user.setPassword(null);
//登录成功,拿到用户信息给session
session.setAttribute(Constant.SESSION_LONGIN,user);
resp.sendRedirect("/main.jsp");
}else{
session.setAttribute("msg","账号密码错误");
resp.sendRedirect("/login.jsp");
}
}
}
在登录模块有登录就肯定有注销,退出当前登录的状态,用户显示的点击【退出】钮,实现退出功能,创建LogoutServlet
,对参数进行绑定。
package com.song.bookmanagersystem.controller;
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 javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(name = "logoutServlet",urlPatterns = "/logoutServlet")
public class LogoutServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
//注销方法
session.invalidate();
//进行重定向操作
resp.sendRedirect("/login.jsp");
}
}
启动服务器,让项目在服务器中运行,进入登录页面,这里初始化默认为前面创建的已有的用户信息,提示登录后,再继续操作:
输入正确的账户信息,点击记住密码,这里记住密码也是在数据校验阶段进行数据库信息比对后,通过cookie
值进行本地缓存,方便下次登录。进入主页面:
点击退出按钮,对当前用户进行注销,返回登录页面,再输入错误的用户密码信息,检测是否还能访问首页信息,确保过滤器设置正确。
输入错误的用户信息,点击提交后,重新回到登录页面,并在页面提示账号密码错误,说明过滤器设置生效,至此登录模块的功能全部实现。
以上就是今天要讲的内容,使用【Servlet】
、【Session】
、【Filterl】
、【JSP】
完成登录模块,对用户数据进行校验避免直接进入主页,设置过滤器保证资源的安全,通过Session
记住密码,与本地的Cookie
共同作用,实现用户登录和注销的功能。