【Java-Web】利用Session和Filter进行权限管理

news2024/11/25 10:50:58

目录

1.Cookie

概念

优势和不足

2.Session

3.用Session实现登陆

概念

代码

4.使用Filter实现过滤


        在使用浏览器的时候,浏览器如何保存我们的个人信息呢?有两种方法,一个是Cookie,一个是Session,区别在于,前者是在客户端保存,即我们的电脑或手机等设备上本地保存;后者是在服务器端保存,不需要占用我们本地的空间。两者共同点是都有一个保存期限。比如使用Session的网页,登陆一个网站,第一次登陆之后,可能后面几天不需要再次登录,进去就是自己的页面,但是再过一段时间会提示身份验证过期,需要重新登陆,这就是服务器端的Session保存期限到了,销毁了。

1.Cookie

概念

        cookie的作用是把信息存在客户端,然后通过用户的访问传给服务器。

        如下,第一次访问的时候,客户端向服务器端发送第一次请求request1,服务器端收到之后,返回第一次请求response1,并且返回cookies,expire(cookie的期限)等信息,客户端收到这些信息之后,在本地创建cookies。在后面的一次次request请求中,客户端会携带着cookies一起发送请求,然后服务器端也会更新cookies并返回。

        此外,除了服务器端建立cookies信息,也可以通过JavaScript,在服务器端创建cookies。

        如下,通过网页的开发人员工具,可以看到cookie信息。

        也可以看到,在浏览器设置里面的,针对cookie有许许多多的设置。

优势和不足

        cookie是在本地创建,所以不需要占用服务器的资源

        但是与此同时,如果我们清除了本地的cookie,那么它就不存在了。比如,一个使用cookie的网站,第一次登录之后,选择七天免账号密码登陆,然后第二天,我把浏览器的cookie等等数据清除了,清除之后再次登陆,发现不是免账号密码,还是需要重新登陆,这就是因为cookie数据被清除,服务器端无法读取对应信息。

        此外,使用cookie其实安全性并不高,上面说到,cookie可以在客户端修改,那么如果一些别有用心的黑客通过修改cookie来欺骗服务器,对服务器端构成威胁。

        所以,现在很多网站使用cookie不是那么多。

2.Session

        相较cookie,session(会话)的安全性更高。其将信息存储在了服务器端。

        在客户端向服务器端发送request之后,服务器端会返回response,同时返回一个id号,并且在服务器端的内存开辟空间,存储这个id和相关data 。这个id号是标识了当前用户的。在该用户接下来的每一次访问,都会带着这个id,服务器端都会在内存里查找这个id是否存在。而和这个用户相关的信息,也是存储在服务器端。当然,Session也是有时间限制,只要服务器端对应的 id 没有过期,这个会话就还保留着。

        典型的例子是,去网上购物商城买东西,在第一个网店买了本书,加入购物车;第二个网店买鞋子,加入购物车;第三个网店买衣服,加入购物车。最后结算的时候是一起结算的。很明显,访问的是三个不同的网店,但是结帐的时候它怎么会知道我选了哪些商品?明显有一个地方存储我的这些信息,这个地方就是服务器端。

        如下,一次request代表一次请求,一次reponse代表一次返回,而一个会话(Session)是多次请求、返回,反反复复交流才叫一个Session。Session是由很多request和response组成的,而会话的 id 就存在服务器端,对应的信息也存在服务器端。

        这种模型,一方面对于客户端的依赖少了。另一方面,数据存在服务器端,客户端无法修改,安全性更高

3.用Session实现登陆

概念

         在客户端访问的时候,tomcat会自动在服务器端创建一个Session存储相关信息,如下,Actor 1 绑定的 Session 是 1 (圆圈),Actor 2 绑定的 Session 是 2。Session对象和用户的每次访问都是绑定在一起的。

         比如在Session里面创建一个 flag,标记用户是否登陆,如果未登陆就让他登陆,已经登陆,就可以使用网站里的资源,就可以实现我们平常使用的登陆功能。

代码

        创建一个Java类,名字为 LoginServlet.java ,其中的代码如下。

        一些解释也在注释里面。中间用到的UserRepo里面的 auth方法下面放了一张图片。

package cn.edu.swu.inout;

import cn.edu.swu.user.User;
import cn.edu.swu.user.UserRepo;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
import java.sql.SQLException;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {

    public static final String LOGIN_TOKEN="USER_LOGIN_TOKEN";

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        this.doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String userName = request.getParameter("user");
        String password = request.getParameter("password");


        //这里的逻辑是
        //如果账号密码不为空,那么就直接登陆
        //如果为空,有可能已经登陆,有可能直接没输入,那么看session,session两种情况,一个是有数据,一个是没有数据
        //如果没有数据,那么跳到login.html页面
        //如果有数据,说明之前登陆过,那么直接跳到admin页面
        if (userName != null && password != null) {
            //为什么要有这个判断,因为点了登陆之后,他是跳到login的,即这个loginservlet,所以要在这里有
            this.doLogin(request, response);
        } else {
            HttpSession session = request.getSession();
            if (session == null || session.getAttribute(LoginServlet.LOGIN_TOKEN) != Boolean.TRUE) {
                response.sendRedirect("./login.html");
            } else {
                response.sendRedirect("./admin.html");
            }
        }
    }

    public void doLogin(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String userName = request.getParameter("user");
        String password = request.getParameter("password");

        try {
            User user = UserRepo.getInstance().auth(userName, password);
            if (user != null) {
                HttpSession session=request.getSession();//创建一个session
                session.setAttribute(LOGIN_TOKEN,Boolean.TRUE);//这就相当于flag,标记是否登陆,为true则已经登陆,否则未登录
                response.sendRedirect("./admin.html");
            } else {
                response.sendRedirect("./index.html");
            }
        } catch (SQLException | IOException e) {
            throw new RuntimeException(e);
        }
    }

}

         如下,这个方法就是在数据库里面,通过账号密码 寻找相匹配的用户并返回。

         但是,像这样子些,如果我得到了后台的网页地址,直接输入网址就可以进入,相当于绕过了登陆,并且进行各种操作。这样非常不安全,所以,要使用 Filter 进行过滤。

4.使用Filter实现过滤

        在这里我们进行简单的操作,使用 Filter 对所有资源进行过滤,这样子所有资源都无法直接访问,也包括一些图片资源之类的。当然,像一些图片资源、登陆界面、初始界面等等,可以直接“放行”,不需要对其进行限制。

        除了直接“放行”的资源,其余资源通过Session来判断是否放心。如果没有Session,那么肯定就是未登陆过,就需要登陆。如果有Session,有的网站会一进入就创建Session,所以有两种情况,一种是已经登陆,一种是没有登陆,但是自动创建Session两者区分要用Session里面的flag来判定(flag是上文说过的来标记是否登陆过的信息)。 逻辑和代码如下,由于只是简单模拟,整个逻辑并不特别复杂。

        使用 Filter 进行过滤之后,即使得到了后台网址,也不可以直接访问,要先登录,安全性大大提高。就好比我们平时登陆校园网,如果直接输入同学给的内部链接,不可以直接访问操作界面,跳出来的是登陆界面。

package cn.edu.swu.user;

import cn.edu.swu.inout.LoginServlet;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;

@WebFilter("/*")
//这里是所有网页都生效
public class AuthFilter extends HttpFilter {

    public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpSession session = request.getSession();
        System.out.println("auth filter");

        String uri = request.getRequestURI();
        System.out.println(uri);
        if ( uri.endsWith("login.html") || uri.endsWith("index.html") || uri.endsWith("verifyCode") ||
                uri.endsWith("png") || uri.endsWith("jpg") || uri.endsWith("css") || uri.endsWith("login")) {
            chain.doFilter(request, response);
            return;
        }

        if (session == null) {
            System.out.println("auth failed");
            response.sendRedirect("./login.html");
        } else {
            Boolean toke = (Boolean) session.getAttribute(LoginServlet.LOGIN_TOKEN);
            if (toke == Boolean.TRUE) {
                //这里还要判断的原因是,有的网站,即使不登陆也要验证session,所以这里验证一下session里的LOGIN_TOKEN
                //是否为true,为true则是登陆过,否则未登陆过。因为只有之前登陆正确才会设置它
                System.out.println("登录验证成功");
                chain.doFilter(request, response);
            } else {
                System.out.println("auth failed");
                response.sendRedirect("./login.html");
            }
        }
    }

}

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

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

相关文章

详解设计模式:适配器模式

适配器模式(Adapter Pattern)又称为变压器模式,是 GoF 的 23 种设计模式中的一种结构型设计模式。适配器模式 的功能是将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而导致无法在一起工作的两个类能够一起工…

双十二选什么牌子的led台灯质量好?2022最新几款真的能护眼的台灯推荐

说到led台灯,那么护眼灯必然是不能忽视的存在,现在市面上的大多数护眼台灯都是使用led灯珠作为发光源,这不仅是因为其高效节能、绿色环保的特性,更重要的是具有很多种保护眼睛的效果。 比起传统的卤素灯或者白炽灯,led…

计算机程序语言的执行过程(个人简单理解)

各种程序语言都只能转换为“机器语言”才能执行 现在的编程语言多种多样,例如,汇编语言;c语言;c,Java,python 语言发展的过程 除了机器语言外,其他语言转换为二进制机器语言 这里要明白两种将…

R语言深度学习不同模型对比分析案例

介绍 深度学习是机器学习最近的一个趋势,模拟高度非线性的数据。在过去的几年中,深度学习在各种应用中获得了巨大的发展势头(Wikipedia 2016a)。其中包括图像和语音识别,无人驾驶汽车,自然语言处理等等。 …

Allegro输出带等长规则的Excel操作指导

Allegro输出带等长规则的Excel操作指导 Allegro可以输出带等长规则的Excel文件,方便检查和查阅,具体操作如下 打开规则管理器 选择Relative Propagation Delay 选择需要输出的match group-expand展开所有规则 菜单选择Tool-Excel 出现一个对话框,选择Active worksheet,…

德国质量链接中国速度,奥迪一汽新能源汽车有限公司在电动化赛道上全速奔跑

(图片一:奥迪一汽新能源汽车有限公司经管会成员暖封闭启动仪式环节合影) 长春,2022年11月21日——11月21日,奥迪一汽新能源汽车有限公司举行了伙伴共进暨暖封闭仪式。随着暖封闭的顺利完成,奥迪一汽新能源…

JAVA并发编程--4.1理解Condition

背景:Condition 多线程条件并发控制,与Lock配合可以实现等待/通知模式; 1 condition 使用demo(生产者与消费者模型): package org.lgx.bluegrass.bluegrasscoree.util.testcondition;import java.util.Ar…

java 每日一练 (5)

java 每日一练(5) 文章目录单选不定项选择题编程题单选 1.下面的程序 编译运行后,在屏幕上显示的结果是() A: 0 B : 2 C: 5 D :80 5的二进制 : 0101   右移 >>: 最右侧位不…

_gdb和进程概念

gdb 在windows下的vs2013下,我们可以进行调试,方便我们了解程序的具体的运行步骤和存在的问题,那么在Linux中,也存在这样一种调试机制,gdb就是在Linux系统下的调试指令。 Linux下和Windows下的调试的区别 答&#x…

如何在保证身份安全的同时提升员工体验

自疫情以来越来越多的企业员工的工作方式都发生了改版。远程和线上下混合工作形式已经成了新常态,企业员工希望随时随地都能访问其工作资源。而且为了方便办公他们更希望使用多种设备(甚至是个人设备)来访问公司数据。 运维有小邓 在如此复杂…

网上商城购物系统设计与实现(Java+Web+SSM+MySQL)

目 录 1 绪论 1 1.1 研究背景 1 1.2 目的和意义 1 1.3 开发工具及技术 1 2 需求分析 3 2.1 功能需求分析 3 2.1.1 网站前台功能 3 2.1.2 网站后台功能 3 2.2 性能分析 3 2.3 系统用户用例图 4 3 系统设计 5 3.1 系统的总体设计 5 3.2 数据库的分析与设计 5 3.2.1数据库概念设计…

DDR PCB设计布线时,拓扑结构的选择

在PCB设计时我们在处理DDR部分的时候都会进行一个拓扑的选择,一般DDR有T点和Fly-by两种拓扑结构,那么这两种拓扑结构的应用场景和区别有哪些呢? T点拓扑结构:CPU出来的信号线经过一个过孔后分别向两边进行连接,分叉点一般在信号的…

哪款蓝牙耳机打电话好用?打电话用的蓝牙耳机推荐

我们需要集中精神,闹中取静。特别是工作或者学习的时候,为了让意志力力更加集中,提高工作或者学习的效率,或是对于一个热爱音乐的人来说,蓝牙耳机肯定是必不可少的;蓝牙耳机现在的功能有很多,质…

锐捷交换机系统安装与升级

锐捷交换机系统安装与升级 文章目录锐捷交换机系统安装与升级一、实验步骤二、实验实施1、到锐捷官网下载交换机型号对应的系统文件2、配置本机IP,与将要升级设备互联3、打开文件中的TFTPserver4、进入BOOT模式恢复系统交换机在MGMT的情况下,通过MGMT口来…

主数据管理系统mdm哪个产品好,为什么,越详细越好?

当企业对主数据管理不善时,会出现数据冗余、数据不一致、业务低效、数据孤岛等问题,多个系统之间的数据难以协调,难以发挥数据的价值。这时我们就需要对企业主数据进行管理。 亿信华辰前不久在“2022中国数字经济创新发展大会”上荣获“2022年…

艾美捷QuickTiter 逆转录病毒定量试剂盒的制备方案

Cell Biolabs艾美捷QuickTiter逆转录病毒定量试剂盒提供了一种测定逆转录病毒滴度的快速方法。该测定法测量逆转录病毒的病毒核酸含量,可以在纯化病毒之前或之后进行。 试剂的制备: •1X QuickTiter™ 解决方案C:准备1X QuickTiter™ 溶液C通…

[Linux] 常用命令--文件操作grep/nl/more/less/head tail/set

✨✨个人主页:沫洺的主页 📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏 📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专…

【仿牛客网笔记】项目进阶,构建安全高效的企业服务——将文件上传至云服务器

使用七牛云,首先进行注册,注册之后认证。 https://www.qiniu.com 登录七牛云 查看手册 存储的时候使用对象存储 SDK 存储空间 域名30天,到期后重新创建 具有独立域名可以绑定域名。 再创建一个空间为community_share 在项目中引用七牛云 首先…

python的继承知识点总结

python继承,python丰富的类因为继承而变得多姿多彩,如果语言不支持继承,那么类就没什么优势。 1、首先我们来定义两个类 一个dog类,一个bird类class Dog: def sleeping(self): print (dog 正在睡觉) def speaking(…

指纹浏览器是什么?可以用来解决广告投放的什么问题?

说到指纹浏览器,相信很多跨境电商人都不陌生,但是很多小伙伴不知道的是,指纹浏览器对于广告投放来说也是非常有帮助的工具!为什么呢?今天,东哥就跟大家聊一聊指纹浏览器到底为什么适合用于广告投放和广告营…