Servlet进阶(Session对象实现登录)

简介: Servlet进阶(Session对象实现登录)

Servlet进阶(Session对象实现登录)


引言:

        本文主要分享了有关Session对象的内容,并且利用Session对象实现登录操作,引入ValidateCode实现验证码判定;

@[toc]

1. Session概述

               Session对象用于记录用户的状态,指的是在一段时间内,单个客户端与Web服务器的一系列交互过程;在一个Session中,客户可能会多次访问一个资源同样也可能是不同的资源;

1.1 Session的原理

Session是由服务器创建的;

  • 服务器为每一次会话分配一个Session对象;
  • 同一浏览器发起多次请求属于一次会话;
  • 首次使用Session时,服务器会创建自动Session,并创建Cookie存储Session发送回客户端;

1.2 Session的使用

Session的作用范围是一次会话有效,拥有存储数据的空间;

  • 同一浏览器发起多次请求属于一次会话,一旦浏览器关闭就结束会话;
  • Session中存入数据,再一次会话的任意位置进行获取;
  • 可以传递任意类型的数据;

1.2.1 获取Session

  • 通过Request对象获取
//写入session
HttpSession session = request.getSession();
System.out.println("name:" + session.getName());

1.2.2 保存数据

  • setAttribute(属性名,Object);、保存数据到Session中;
//传入session中
session.setAttribute("vcode", codes);

1.2.3 获取数据

  • setAttribute(属性名);、获取Session中的数据;
//获取数据
session.getAttribute("vcode");
  • 通过vcode访问codes

1.2.4 移除数据

  • removeAttribute(属性名);、从Session中删除数据;
//删除数据
session.getAttribute("vcode");

1.3 Session和Request的区别

  • Session:一次会话有效,浏览器改变Session改变
  • Request:一次请求有效,请求改变Request改变

2. 基于Session的登录案例

步骤:

  1. 创建数据库表
  2. 将数据写入接口实现类中
  3. 当用户首次访问登录页时,服务端先生成验证码,并将其存入session中,再生成图片随登录页显示
  4. 用户登录(含有验证码);
  5. 当用户登陆时,将用户名、密码、验证码发送到后端;
  6. servlet接受到登录请求时,先判断验证码是否有效(和服务端的session存储的验证码比对);
  7. 如果验证码有效,则继续根据用户名查询用户信息;
  8. 将登录请求的密码和用户信息中的密码进行对比;
  9. 如果密码匹配正确,则登录成功,再将用户信息写入session作用域中;
  10. 返回登录成功页面;
  11. 当用户访问其他页面时,首先判定用户是否登陆,如果没登陆则,导航到登录页;如果已登陆,则直接访问该页;

2.1 创建数据库表

CREATE TABLE login(
    username VARCHAR(20),
    PASSWORD VARCHAR(50)
)CHARSET = utf8;

INSERT INTO login(username,PASSWORD) VALUES ("admin","123456");

2.2 创建UserInfo.java封装用户名、密码

package com.yl.kaka.entity;

public class UserInfo {
   
   
    private String username;
    private String password;

    public String getUsername() {
   
   
        return username;
    }
    public void setUsername(String username) {
   
   
        this.username = username;
    }
    public String getPassword() {
   
   
        return password;
    }
    public void setPassword(String password) {
   
   
        this.password = password;
    }
}

2.3 创建JDBCUtils.java封装JDBC工具类

package com.yl.kaka.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JDBCUtils {
   
   
    //定义常量
    final static String driver = "com.mysql.jdbc.Driver";
    final static String url = "jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=utf8";
    final static String username = "root";
    final static String password = "root";

    //声明常用对象
    protected Connection conn = null;
    protected PreparedStatement pstmt = null;
    protected ResultSet rs = null;

    //静态代码块
    static{
   
   
        try {
   
   
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
   
   
            e.printStackTrace();
        }
    }

    //获取连接
    public void getConnection(){
   
   
        try {
   
   
            conn = DriverManager.getConnection(url,username,password);
        } catch (SQLException e) {
   
   
            e.printStackTrace();
        }
    }

    //关闭资源
    public void closeAll(){
   
   
        try {
   
   
            if(rs != null) rs.close();
            if(pstmt != null) rs.close();
            if(conn != null) rs.close();
        } catch (SQLException e) {
   
   
            e.printStackTrace();
        }
    }
}

2.4 创建UserInfoDao.java接口

package com.yl.kaka.dao;

import com.yl.kaka.entity.UserInfo;
public interface UserInfoDao {
   
   

    public UserInfo findUserInfoByUsername(String username);
}

2.5 创建UserInfoDaoImpl.java接口实现类

package com.yl.kaka.dao;

import java.sql.SQLException;
import com.yl.kaka.entity.UserInfo;
import com.yl.kaka.util.JDBCUtils;
public class UserInfoDaoImpl extends JDBCUtils implements UserInfoDao {
   
   

    @Override
    public UserInfo findUserInfoByUsername(String username) {
   
   
        String sql = "SELECT * FROM LOGIN";
        try {
   
   
            super.getConnection();
            pstmt = conn.prepareStatement(sql);
            rs = pstmt.executeQuery();
            UserInfo info = new UserInfo();
            while(rs.next()){
   
   
                if (username.equals(rs.getString("username"))) {
   
   
                    String password = rs.getString("password");
                    info.setPassword(rs.getString("password"));
                    info.setUsername(username);

                }else{
   
   
                    return null;
                }
            }
            return info;
        } catch (SQLException e) {
   
   
            e.printStackTrace();
        }finally{
   
   
            super.closeAll();
        }
        return null;
    }
}

2.6 配置XML文件

  <servlet>
    <servlet-name>InforServlet</servlet-name>
    <servlet-class>com.yl.kaka.controller.UserInfoServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>InforServlet</servlet-name>
    <url-pattern>/userInfo</url-pattern>
  </servlet-mapping>

2.7 编写UserInfoServlet.java

package com.yl.kaka.controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.yl.kaka.dao.UserInfoDao;
import com.yl.kaka.dao.UserInfoDaoImpl;
import com.yl.kaka.entity.UserInfo;
import cn.dsna.util.images.ValidateCode;

public class UserInfoServlet extends HttpServlet{
   
   
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
   
        //获取页面的值
        String action = request.getParameter("action");
        if(action == null){
   
   
            //获取跳转的页面
            request.getRequestDispatcher("login.jsp").forward(request, response);
        }else if(action.equals("code")){
   
   //获取验证码
            //生成验证码
            ValidateCode vc = new ValidateCode(200,30,4,10);
            //获取验证码
            String codes = vc.getCode();
            //写入session
            HttpSession session = request.getSession();
            //传入session中
            session.setAttribute("vcode", codes);
            //写入流中
            vc.write(response.getOutputStream());
        }else if(action.equals("login")){
   
   //展示登录页面
            //处理登录请求,获取信息
            String username = request.getParameter("username")== null?"Admins":request.getParameter("username");
            String password = request.getParameter("password");
            String verifyCode = request.getParameter("verifyCode");
            //从session中获取事先存储的验证码
            HttpSession session = request.getSession();
            String sessionCode = (String)session.getAttribute("vcode");
            //匹配验证码
            if(!verifyCode.isEmpty()&&verifyCode.equalsIgnoreCase(sessionCode)){
   
   
                //验证码正确,继续根据用户名查询用户信息
                UserInfoDao uid = new UserInfoDaoImpl();
                //调用方法
                UserInfo userInfo = uid.findUserInfoByUsername(username);
                if (userInfo!=null) {
   
   
                    if(userInfo.getPassword().equalsIgnoreCase(password)){
   
   
                        //登录成功,将用户信息写入session中
                        session.setAttribute("userInfo", username);
                        //显示登录成功
                        request.getRequestDispatcher("success.jsp").forward(request, response);
                    }else{
   
   //验证码不正确,重新到登录页
                        response.sendRedirect("login.jsp");
                    }
                }else{
   
   
                    response.sendRedirect("login.jsp");
                }
            }else{
   
   //验证码不正确,重新到登录页
                response.sendRedirect("login.jsp");
            }
        }else{
   
   
            //验证用户是否登录才可访问的页
            HttpSession session = request.getSession();
            Object info = session.getAttribute("userInfo");
            if(info!=null){
   
   
              request.getRequestDispatcher("page.jsp").forward(request, response);
            }
            else{
   
   
                response.sendRedirect("login.jsp");
            }
        }
    }
}

2.8 编写login.jsp登录页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录页面</title>
<style>
    body{
   
   
        text-align:center;
    }
</style>
</head>
<body>
    <form action="userInfo?action=login" method="post">
        USERNAME:<input type = "text" name = "username" /><br/>
        PASSWORD:<input type = "password" name = "password"/><br/>
        verifyCode:<input type = "text" name = "verifyCode" /> <img src="userInfo?action=code" /> <br/>
        <input type = "submit" value = "LOGIN"/>
    </form>
</body>
</html>

2.9 成功登录页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h2>success...........</h2>
      name:<%=session.getAttribute("userInfo") %>
</body>
</html>

2.10 运行结果

图片.png

图片.png

目录
相关文章
|
6月前
|
SQL 前端开发 关系型数据库
考古Servlet+JDBC实现简约的登录注册界面
考古Servlet+JDBC实现简约的登录注册界面
57 1
|
6月前
|
Java 应用服务中间件 数据库
Servlet实现注册登录列表页面及其相互跳转功能
Servlet实现注册登录列表页面及其相互跳转功能
76 1
|
6月前
|
前端开发 Java Maven
Eclipse里使用Servlet实现简单的登录功能
Maven是一款非常方便的Java开发插件,它可以自动管理好开发过程中需要的jar包,提升开发者们的开发效率。在这里,我手把手教给大家如何新建一个Maven项目,并实现简单的用户登录功能。
189 0
|
1月前
|
缓存 Java Spring
servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header
文章比较了在Servlet和Spring Boot中获取Cookie、Session和Header的方法,并提供了相应的代码实例,展示了两种方式在实际应用中的异同。
151 3
servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header
|
5月前
|
存储 前端开发 小程序
表白墙完善(数据库,前端,后端Servlet),再谈Cookie和Session。以及一个关于Cookie的练习小程序
表白墙完善(数据库,前端,后端Servlet),再谈Cookie和Session。以及一个关于Cookie的练习小程序
|
2月前
|
存储 安全 搜索推荐
探索研究Servlet Session 跟踪
【9月更文挑战第27天】
19 0
|
5月前
|
容器
loadOnStartup的使用,没有访问服务器之前,创键servlet对象,加快用户访问速度
loadOnStartup的使用,没有访问服务器之前,创键servlet对象,加快用户访问速度
loadOnStartup的使用,没有访问服务器之前,创键servlet对象,加快用户访问速度
|
5月前
|
缓存 安全 小程序
从基础到进阶:掌握Java中的Servlet和JSP开发
【6月更文挑战第23天】Java Web开发中的Servlet和JSP是关键技术,用于构建动态网站。Servlet是服务器端小程序,处理HTTP请求,生命周期包括初始化、服务和销毁。基础Servlet示例展示了如何响应GET请求并返回HTML。随着复杂性增加,JSP以嵌入式Java代码简化页面创建,最佳实践提倡将业务逻辑(Servlet)与视图(JSP)分离,遵循MVC模式。安全性和性能优化,如输入验证、HTTPS、会话管理和缓存,是成功应用的关键。本文提供了一个全面的学习指南,适合各级开发者提升技能。
46 7
|
5月前
|
SQL druid Java
javaweb案例实训之基于jsp和servlet的用户管理开发[增删改查及登录注销]
javaweb案例实训之基于jsp和servlet的用户管理开发[增删改查及登录注销]
34 0
|
6月前
|
应用服务中间件
Servlet 教程 之 Servlet Session 跟踪 4
Servlet教程讲解了如何进行Session跟踪,HTTP协议本身无状态,但可通过以下方式维持会话:删除特定属性、整个Session或设定超时时间(使用setMaxInactiveInterval())。此外,可使用logout注销用户,或在web.xml配置全局超时。在Servlet中,getMaxInactiveInterval()返回Session超时(以秒计),例如,web.xml设为15分钟,则返回900。
37 0