自动登录——过滤器

1、登录流程图:

  (1)index.jsp:向web层的Servlet提供用户信息:password、username,以及用户是否选择自动登录(通过autolog属性来提供相关的信息),通过EL技术获取错误提示信息。

(2)Servlet:从表单获取数据,并将表单中的数据作为参数从Service层获得dao层从数据库中获得的用户信息,如果存在此user,则判断是否选择自动登录,来进行不同的处理。

(3)过滤器:查询符合条件的Cookie,并将此user信息存储到Session域中,供main.jsp通过EL调用。

(4)数据库:dao层通过sql语句实现从数据库中获得用户信息,即与表单提交的用户信息进行比对,如果存在此用户则返回该用户的信息给service层,如果不存在则返回空。

(5)main.jsp:登录成功后跳转到此页面,通过EL从Session域中获得用户的账户名。

2、工程结构:

 3、代码实现:

(1)jsp:

login.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <meta charset="UTF-8">
  <title>login</title>
</head>
<body bgcolor="aqua">
<center>
  <h3>登录</h3>
  <form action="/Login_MVC_war_exploded/loginservlet" method="post">
    &nbsp;用户名:<input type="text" name="username" size="12"><br>&nbsp;&nbsp;码 :<input type="password" name="password" size="12" ><br><br>

    <input type="checkbox" value="autologin" name="autologin">自动登录<br><br>

    <input type="reset" value="取消">

    <input type="submit" value="登录">
  </form>
  <h5 style="color:red">${requestScope.logerrorinf}</h5> <!--运用EL获取值-->
</center>
</body>
</html>

main.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>main</title>
</head>
<body>
<c:if test="${empty user}">
    <li><a href="index.jsp"></a></li>
</c:if>
<c:if test="${!empty user}">
    你好,${sessionScope.user.getAccount()}
</c:if>
</body>
</html>

(2)web层:

LoginServlet:

package pers.zhb.web;
import pers.zhb.domain.User;
import pers.zhb.service.UserService;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class LoginServlet extends javax.servlet.http.HttpServlet {
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
    HttpSession httpSession=request.getSession();
    String username=request.getParameter("username");//从表单获取数据,并作为形式参数传递到login函数中
    String password=request.getParameter("password");
    UserService userService=new UserService();
    User user=userService.login(username,password);//从service层获取user信息,该信息是从数据库中查询的
    if(user!=null){
    String autoLogin=request.getParameter("autologin");
    if(autoLogin!=null){//如果选择自动登录则将用户的信息持久化存储到磁盘
        Cookie cookie_username=new Cookie("cookie_username",user.getAccount());//创建Cookie
        Cookie cookie_password=new Cookie("cookie_password",user.getPassword());
        cookie_username.setMaxAge(60*60);//设置Cookie的持久化存储时间为一小时
        cookie_password.setMaxAge(60*60);
        cookie_username.setPath(request.getContextPath());//路径
        cookie_password.setPath(request.getContextPath());
        response.addCookie(cookie_username);//发送
        response.addCookie(cookie_password);
    }
    httpSession.setAttribute("user",user);
    response.sendRedirect(request.getContextPath()+"/main.jsp");//成功的话,重定向到主页
    }else{
    request.setAttribute("logerrorinf","用户名或密码错误") ;//向request域写入信息
    request.getRequestDispatcher("/index.jsp").forward(request,response);
}
    }

    protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {

    }
}

过滤器:

 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest =(HttpServletRequest)servletRequest;//获取Cookie必须强转
        HttpServletResponse httpServletResponse=(HttpServletResponse)servletResponse;
        HttpSession httpSession=httpServletRequest.getSession();
        String cookie_username=null;
        String cookie_password=null;
        Cookie[] cookies=httpServletRequest.getCookies();
        if(cookies!=null){//自动登录,Cookie不为空
            for(Cookie cookie:cookies){
                if("cookie_username".equals(cookie.getName())){//找到Cookie的名字为cookie_username的Cookie
                    cookie_username=cookie.getValue();//获取存储username的Cookie的值
                }
                if("cookie_password".equals(cookie.getName())){//找到Cookie的名字为cookie_password的Cookie
                    cookie_password=cookie.getValue();//获取存储password的值
                }
            }
        }
        if(cookie_username!=null&&cookie_password!=null){//从Cookie中
            System.out.println(cookie_username);//检验cookie_username和cookie_password的值
            System.out.println(cookie_password);
            UserService userService=new UserService();
            User user=userService.login(cookie_username,cookie_password);//从service层获取user信息,该信息是从数据库中查询的
            httpSession.setAttribute("user",user);//session域中写入user信息
            httpServletRequest.getRequestDispatcher("/main.jsp").forward(httpServletRequest,httpServletResponse);//成功的话重定向到首页
        }
         filterChain.doFilter(httpServletRequest,httpServletResponse);
    }

(3)service层:

public class UserService {
    public User login(String username, String password) {//返回dao层的user信息
        UserDao userDao=new UserDao();
        return userDao.login(username,password);
    }
}

(4)dao层:

public class UserDao {
    public User login(String username, String password) {//返回查找到的符合条件的用户
        Connection con=null;
        User user= null;
        try {
            con= C3p0Utils.getConnection();
            QueryRunner qr = new QueryRunner();
            String sql = "Select * from login where account=? and password=?";
            Object[] select = {username,password};
            return qr.query(con, sql, new BeanHandler<User>((User.class)), select);
        }
        catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

3、运行结果:

 

原文地址:https://www.cnblogs.com/zhai1997/p/11693595.html