Java Web——使用Filter实现用户登录

news2024/10/5 14:35:41

实验名称:

使用Filter实现用户登录

实验目的:

(1)了解什么是Filter。

(2)熟悉Filter的拦截过程和接口中的方法。

(3)掌握第一个Filter程序的编写方法。

(4)能够使用Filter实现用户自动登录

实验内容及原理:

通过前面的学习,我们已经了解到,使用Cookie可以实现用户自动登录的功能。但是使用Cookie实现用户自动登录后,当客户端访问服务器的Servlet时,所有的Servlet都需要对用户的Cookie信息进行校验,这样势必会导致在Servlet程序中书写大量重复的代码。为了解决这种问题,可以在Filter程序中实现Cookie的校验。本实验使用Filter实现用户的自动登录功能。

实验设备及实验步骤:

Win10操作系统+JDK软件+Idea软件+Apache-tomcat软件

1、创建动态WEB项目(5分)

2、编写User类

package com.example.filter7.entity;
public class User {
    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;
    }
}

3、实现登录页面login.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
         pageEncoding="utf-8" import="java.util.*"%>
<html>
<head></head>
<center><h3>用户登录</h3></center>
<body style="text-align: center;">
<form action="${pageContext.request.contextPath }/LoginServlet"
      method="post">
    <table border="1" width="600px" cellpadding="0" cellspacing="0"
           align="center" >
        <tr>
            <td height="30" align="center">用户名:</td>
            <td>&nbsp;&nbsp;
                <input type="text" name="username" />${errerMsg }</td>
        </tr>
        <tr>
            <td height="30" align="center">密   &nbsp; 码:</td>
            <td>&nbsp;&nbsp;
                <input type="password" name="password" /></td>
        </tr>
        <tr>
            <td height="35" align="center">自动登录时间</td>
            <td><input type="radio" name="autologin"
                       value="${60*60*24*31 }" />一个月
                <input type="radio" name="autologin"
                       value="${60*60*24*31*3 }" />三个月
                <input type="radio" name="autologin"
                       value="${60*60*24*31*6 }" />半年
                <input type="radio" name="autologin"
                       value="${60*60*24*31*12 }" />一年
            </td>
        </tr>
        <tr>
            <td height="30" colspan="2" align="center">
                <input type="submit" value="登录" />
                &nbsp;&nbsp;&nbsp;&nbsp;
                <input type="reset" value="重置" />
            </td>
        </tr>
    </table>
</form>
</body>
<html>

4、实现首页index.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
         pageEncoding="utf-8" import="java.util.*"
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
    <title>显示登录的用户信息</title>
</head>
<body>
<br />
<center>
    <h3>欢迎光临</h3>
</center>
<br />
<br />
<c:choose>
    <c:when test="${sessionScope.user==null }">
        <a href="${pageContext.request.contextPath }/login.jsp">用户登录</a>
    </c:when>
    <c:otherwise>
        欢迎你,${sessionScope.user.username }!
        <a href="${pageContext.request.contextPath }/LogoutServlet">注销</a>
    </c:otherwise>
</c:choose>
<hr />
</body>
</html>

5、编写LoginServlet类。

package com.example.filter7.filter;
//省略导包
@WebServlet(name = "LoginServlet")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获得用户名和密码
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        // 检查用户名和密码
        if ("itcast".equals(username) && "123456".equals(password)) {
            // 登录成功
            // 将用户状态 user 对象存入 session域
            User user = new User();
            user.setUsername(username);
            user.setPassword(password);
            request.getSession().setAttribute("user", user);
            // 获取用户选择的自动登录有效时间
            String autoLogin = request.getParameter("autologin");
            if (autoLogin != null) {
                // 注意 cookie 中的密码要加密
                Cookie cookie = new Cookie("autologin", username + "-"
                        + password);
                cookie.setMaxAge(Integer.parseInt(autoLogin));
                cookie.setPath(request.getContextPath());
                response.addCookie(cookie);
            }
            // 跳转至首页
            response.sendRedirect(request.getContextPath() + "/index.jsp");
        } else {
            request.setAttribute("errerMsg", "用户名或密码错");
            request.getRequestDispatcher("/login.jsp")
                    .forward(request, response);
        }
    }
}

6、编写LogoutServlet类。

package com.example.filter7.filter;
//省略导包
@WebServlet(name = "LogoutServlet")
public class LogoutServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 用户注销
        request.getSession().removeAttribute("user");
        // 从客户端删除自动登录的cookie
        Cookie cookie = new Cookie("autologin", "msg");
        cookie.setPath(request.getContextPath());
        cookie.setMaxAge(0);
        response.addCookie(cookie);
        response.sendRedirect(request.getContextPath()+"/index.jsp");
    }
}

7、创建过滤器AutoLoginFilter类。

package com.example.filter7.filter;
//省略导包
@WebServlet(name = "LogoutServlet")
public class LogoutServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 用户注销
        request.getSession().removeAttribute("user");
        // 从客户端删除自动登录的cookie
        Cookie cookie = new Cookie("autologin", "msg");
        cookie.setPath(request.getContextPath());
        cookie.setMaxAge(0);
        response.addCookie(cookie);
        response.sendRedirect(request.getContextPath()+"/index.jsp");
    }
}

8、配置映射信息。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <filter>
        <filter-name>AutoLoginFilter</filter-name>
        <filter-class>com.example.filter7.filter.AutoLoginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>AutoLoginFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.example.filter7.filter.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/LoginServlet</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>LogoutServlet</servlet-name>
        <servlet-class>com.example.filter7.filter.LogoutServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LogoutServlet</servlet-name>
        <url-pattern>/LogoutServlet</url-pattern>
    </servlet-mapping>
</web-app>

运行结果图截图

(1)访问login.jsp页面,账号为itcast,密码为123456。

(2)实现用户登录

点击上图的登录后,便可完成用户自动登录,此时,在浏览器窗口中会显示登录的用户名。

(3)注销账户

在点击注销的超链接,就可以注销当前的用户,然后显示index.jsp界面。

问题及思考:

经过这次实验,我掌握了Filter的编写方法,能够了解到什么时Filter,如何利用Filter实现用户的自动登录。在完成项目时遇到映射信息的问题,是我把filter和servlet搞混了,以为跟servlet配置的标签一样,所以导致出错,后面通过改回filter的标签成功解决问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/622767.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为荣获上海市技术发明一等奖!基于CANN的视频增强平台以AI技术修复历史视频

2023年5月26日&#xff0c;上海市科学技术奖励大会隆重召开&#xff0c;由上海交通大学牵头&#xff0c;中国科学院深圳先进技术研究院、咪咕视讯科技有限公司、华为技术有限公司、上海云视科技股份有限公司、上海人工智能创新中心、上海媒智科技有限公司、上海数字电视国家工程…

Oracle免费云设置Multi-factor Authentication

申请Oracle免费云账号的时候系统就强迫用户设置Multi-factor Authentication&#xff0c;我选择了OracleMobileAuthenticator作为2次认证工具。刚开始用还顺利&#xff0c;但用了一段时间后Oracle登录页面迟迟未向OracleMobileAuthenticator发送通知&#xff0c;要等非常久App才…

大模型 LLM 综述, A Survey of Large Language Models

大模型 LLM 综述, A Survey of Large Language Models 一、概述 一般认为NLP领域的大模型>10 Billion参数(也有人认为是6B、7B, 工业界用, 开始展现涌现能力); 经典大模型有GPT-3、BLOOM、Flan-T5、GPT-NeoX、OPT、GLM-130B、PaLM、LaMDA、LLaMA等; 大模型时间线, 图来自…

chatgpt赋能python:Python绘图教程:将画笔移动到绝对位置的方法

Python绘图教程&#xff1a;将画笔移动到绝对位置的方法 Python作为一门高级编程语言&#xff0c;设计初衷是让编程变得简单、易学、易用&#xff0c;且支持多种编程范式&#xff0c;其中产生了让人惊艳的绘图模块——Turtle&#xff08;海龟&#xff09;。 在这篇教程中&…

Mybatis-plus代码生成器

官网&#xff1a;MyBatis-Plus (baomidou.com) 顾名思义&#xff0c;就是它为你生成代码&#xff0c;这里可以为你生成Entity、Mapper、MapperXML、Service、controller等各个模块的代码&#xff0c;极大的提升开发效率 环境&#xff1a;mysql8.0.24、mybatis-plus3.5.3.1、spr…

<<Linux多线程服务端编程>>学习之栏1————线程安全的对象生命期管理

线程安全的对象生命期管理 此章节开头的前两句话&#xff0c;把我点醒&#xff0c;原来思考功力可以这么深厚&#xff01;如下&#xff1a; 第一句话&#xff1a; 编写线程安全的类不是难事&#xff0c; 用同步原语保护内部状态即可&#xff1b; 第二句话&#xff1a; 但是对…

【论文阅读】ControlNet

简介 目标&#xff1a;加入额外的条件&#xff08;例如边缘图像&#xff0c;深度图像&#xff09;控制生成的图像 现有挑战 特定领域上的数据较少&#xff0c;而预训练模型很大&#xff0c;很容易出现过拟合的情况。在资源有限的情况下&#xff0c;只能选择pretrain- finetun…

传统工业制造企业如何实现数字化转型?

传统工业制造企业如何实现数字化转型&#xff0c;以数字驱动、实现高价值管理&#xff1f; 传统企业实现数字化转型是一条很漫长但不得不走的道路&#xff0c;看到这个问题下有很多专业人士对传统企业如何做数字化转型都提出了专业的见解&#xff0c;所以这篇就以传统制造业为…

用ChatGPT来写高考作文,看看效果!

又是一年高考日&#xff0c;今天高考作文题目一出来&#xff0c;很多人第一时间就用AI进行写作&#xff0c;我这边也用gpt3和4分别生成了一篇文章&#xff0c;没有给他投喂范文&#xff0c;把要求和题目的prompt给它&#xff0c;让它分析和写作&#xff0c;来看看效果吧。 GPT4…

学习态度记录JRebel本地验证

学习态度记录JRebel本地验证 网上有两种方式。 1、直接使用其他同学提供好的远程服务器验证地址(可自行搜索) 2、设置本地反向代理&#xff0c;激活JRebel ps&#xff1a;我的IDEA升级到2023.1.2后无法使用第一种方式了。搜了半天网上都是基于windows环境的教程解说&#xff0…

html 原生js手写树 仿照antd 样式

效果如图 <!doctype html> <html><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…

百度Apollo视频学习笔记

APOLLO视频学习笔记 一、总览 无人驾驶车的运作方式 五个核心部件&#xff1a; 计算机视觉&#xff1a;弄清楚周围的世界是怎样的传感器融合&#xff1a; 合并来自其他传感器的数据&#xff0c;如激光和雷达&#xff0c;更加深入了了解我们周围的环境定位&#xff1a;精确地…

一级建造师执业资格考试--工程法规--速学36记--联想法

第一记&#xff1a;法的效力层级 第二记&#xff1a;法人的分类 【速记方法】口诀&#xff1a;赚钱营利和特别 关键词&#xff1a;营利、特别 【速记内容】 1、营利法人:以取得利润并分配给股东等出资人为目的成立的法人,为营利法人; 如有限责任公司、股份有限公司。经依法登记…

什么牌子电容笔性价比高?iPad触屏笔推荐

电容笔已经成为日常生活中不可或缺的一部分。它可以用于书写&#xff0c;绘画&#xff0c;甚至玩游戏。使用电容笔可以代替传统无纸化书写&#xff0c;提高工作效率。市面上有许多不同价格的电容笔品牌可供选择。本文将介绍四款性价比高的平替电容笔&#xff0c;有需要入手的小…

常用的三种拖拽方法(内置方法 + 接口 + Event Trigger组件)

前言 在Unity中实现拖拽的方法有多种&#xff0c;以下是几种常见的方法和它们的优缺点&#xff1a; Input.GetMouseButtonDown Input.GetMouseButtonDown 方法可以监测用户鼠标按键的点击事件&#xff0c;通过检测鼠标按钮的状态来实现拖拽效果。用户通过鼠标进行拖拽操作。…

Web基本概念

一、前言 World Wide Web的简称&#xff0c;是一个由许多互相链接的超文本组成的系统&#xff0c;通过互联网访问 &#xff08;为用户提供信息&#xff09; 静态网页 仅适用于不能经常更改内容的网页&#xff1b; 动态网页 网络编程技术创建的页面&#xff1b;通过在传统的静态…

MongoDB安装与使用

目录 一、MongoDB介绍与安装 什么是MongoDB 为什么要用MongoDB MongoDB下载 MongoDB安装完成 二、MongoDB Compass MongoDB Compass使用 三、使用mongoose连接数据库 使用MongoDB Compass 创建数据库 使用mongoose 连接数据库 每日一课&#xff1a;MongoDB 常用命令…

Vue项目打包dist目录介绍

如下 CSS目录&#xff1a; ① .css文件是项目要用到的css文件,当你做webpack打包的时候&#xff0c;会把所有的css样式打包到这里 ② .css.map文件是一个Source map文件&#xff0c;Source map就是一个信息文件&#xff0c;里面储存着位置信息。也就是说&#xff0c;转换后的代…

ChatGPT扩展系列之使用pandora本地搭建ChatGPT

ChatGPT扩展系列之使用pandora本地搭建ChatGPT 1. 为什么要本地搭建 主要解决使用上的几个痛点,我们可以看一下下面就是我们最常遇到的几个问题,这里我们重点提一下就是我们本地搭建好了之后,我们获取Access Token,这个Token的有效期长达14天,也就是这14天中,我们都不需…

【沐风老师】3DMAX径向对称插件使用方法应解

3DMAX径向对称插件使用教程 3DMAX径向对称插件&#xff0c;允许你对径向结构建模并查看最终结果。它的功能类似于3dMax自带的“对称”修改器&#xff0c;但它可以在三个轴的任意角度径向对象&#xff0c;这可以创造出很多我们意想不到的建模艺术效果&#xff0c;也可以理解它是…