Web应用安全控制

本内容摘自《Java Web程序设计基础教程》

第13章 系统安全控制


目标:

u 掌握使用登录功能对系统的用户进行认证;

u 掌握如何控制只有具有相应权限的用户才可以访问相应的资源;

u 掌握如何控制页面中的部分功能只能在特定的情况下才能使用;

u 掌握如何对多个文件的安全同时进行控制;

u 了解验证码的工作原理。

网站的很多功能是普通用户不能访问的,例如添加图书这样的功能只能由管理员完成,普通用户是无法访问的,如果普通用户要访问,应该提示普通用户没有相应的权限。本章介绍如何控制用户的权限。

13.1 完善登录功能

第4、5、6章中介绍的登录功能只是简单的模拟,现在对该功能进行完善。

13.1.1 功能描述

用户在登录界面输入用户ID和口令,系统根据用户输入的用户ID和口令进行处理:

l 用户ID和口令都正确,并且当前用户是管理员,则跳转到管理员的默认界面。

l 如果用户ID和口令正确,并且是普通用户,则跳转到普通用户的默认界面。

l 如果用户ID和口令不正确,则重新转向登录界面。

不管是管理员还是普通用户,登录之后的默认界面应该是用户使用频率最高的界面。如果网站比较智能,可以对用户的访问进行统计,为用户显示经常使用的界面,或者上次访问的界面。对于管理员来说,使用频率最高的功能应该是订单管理,所以应该把订单管理作为管理员的默认界面。对于普通用户来说,使用频率最高的功能应该是图书查看,所以应该把图书查看界面作为普通用户的默认界面。

13.1.2 思路分析

仍然采用MVC模式来设计该功能。

首先是M部分,可以使用UesrBean中原有的方法findUserById。

其次是V部分,登录界面在前面已经完成,图书查看功能是读者在前面实训中完成的功能,假设为findBooks,订单管理是下一章将要完成的实训内容,假设为findOrders。

最后是C部分,获取用户输入的用户ID和口令,根据ID调用模型的findUserById方法,根据返回值进行处理:

u 如果返回值为null,则说明用户不存在;

u 否则,判断口令是否匹配:

n 如果不匹配,说明口令不正确;

n 如果匹配,判断用户的类型:

u 如果用户类型为1,说明该用户为管理员;

u 否则为普通用户。

13.1.3 修改登录控制器Servlet

根据上面的分析,修改后的控制器的代码如下:

package bookstore.servlet;

import javax.servlet.*;

import javax.servlet.http.*;

import java.io.*;

import bookstore.bean.*;

public class LoginServlet extends HttpServlet

{

public void doGet(HttpServletRequest request,HttpServletResponse response)

throws IOException,ServletException {

// 获取用户提交的信息

String userid = request.getParameter("userid");

String userpass = request.getParameter("userpass");

// 创建JavaBean对象

UserBean ub = new UserBean();

// 转向的文件

String forward=null;

// 提示信息

String info=null;

UserBean user=ub.findUserById(userid);

// 用户不存在

if(user == null){

forward="login.jsp";

}

// 口令不正确

else if(!user.getUserpass().equals(userpass)){

forward="login.jsp";

}

// 管理员

else if(user.getType().equals("1")){

forward="findOrders";

}

// 普通用户

else{

forward="findBooks";

}

// 定义跳转文件

RequestDispatcher rd=request.getRequestDispatcher(forward);

// 完成重定向

rd.forward(request,response);

}

public void doPost(HttpServletRequest request,HttpServletResponse response)

throws IOException,ServletException {

doGet(request,response);

}

}

13.2 用户管理的安全控制

13.2.1 功能描述

只有管理员可以使用图书添加功能,如果用户没有登录,提示用户“您还没有登录,请先登录!”,如果当前用户是普通用户,提示用户“您不是管理员,不能添加用户”。如果当前用户是管理员,则显示添加界面。

13.2.2 运行效果

首先,直接访问图书添加的页面,得到如图13.1所示界面。

图13.1 没有登录的提示界面 图13.2 没有权限的提示界面

然后,点击“登录”超链接跳转到登录界面,输入普通用户的ID和口令,然后再访问图书添加界面,得到如图13.2所示界面。

然后,点击“登录”超链接跳转到登录界面,输入管理员用户ID和口令,然后再访问图书添加界面,得到如图9.1所示的用户添加界面。

13.2.3 思路分析

要防止这个文件被没有权限的人访问,必须对每个访问这个文件的人的身份进行验证,要想知道当前用户的权限,在登录的时候必须记录当前用户的权限。

在访问这个文件的时候,首先应该从session中获取用户信息,如果用户不存在,跳转到“没有登录”的提示界面,如果用户是普通用户,跳转到“没有权限”的提示界面,不让用户访问当前页面,这样就保证了当前页面的安全。

为了方便用户的操作,需要在信息提示页面增加到登录页面的超链接。

13.2.4 操作session

使用session对象能够在多个页面之间共享信息,在Servlet中也可以使用session对象,但是与在JSP中不同,在JSP中session对象是内部对象,在Servlet中需要先获取session对象。要完成安全控制需要使用session对象保存用户信息,下面介绍关于session的常用操作。

获取session对象

session对象存储在request对象中,request对象也就是服务类方法的第一个参数,可以使用HttpServletRequest的下面的方法来获取session对象:

HttpSession getSession(boolean);

通常是在doGet方法或者doPost方法中,通过第一个参数request来获取。代码如下:

HttpSession session;

session =request.getSession(true);

在session中存储信息

获取session对象之后,如果希望在session中存储信息,可以使用下面的方法:

session.setAttribute("name",value);

用于在session中保存信息,有两个参数,第一个参数是字符串,是要存储信息的名字,第二个参数是保存的值本身,可以是各种类型的对象。如果第一个参数所指定的名字存在,会替换该名字原来对应的值;如果第一个参数所指定的名字不存在,会把第二个参数指定的值存储到session中。

从session中获取信息

如果要从session中获取已经保存的信息,可以使用下面的方法:

session.getAttribute("name");

参数就是要获取的信息的名字。在使用的时候对得到的信息必须进行强制类型转换,因为方法的返回值类型是Object。例如在session中存储的是String对象,要得到这个对象,可以使用下面的代码:

String str = (String)session.getAttribute("name");

删除session中存储的信息

如果要删除session中的某个信息,可以使用下面的方法进行删除:

session.remove("name");

参数就是要删除的session中的对象的名字。

使session失效

如果不想使用session了,可以使用下面的方法:

session.invalidate()

使用该方法之后,就不能继续使用session了,包括session中的所有信息。

13.2.5 修改登录处理的代码

在登录成功之后,把用户信息保存到session中。因为这个信息是与特定用户相关的,在用户的整个访问过程中都有效。

在Servlet中首先要获取session对象,在用户登录成功之后,把用户对象保存到session中。修改后的Servlet的代码如下:

package bookstore.servlet;

import javax.servlet.*;

import javax.servlet.http.*;

import java.io.*;

import bookstore.bean.*;

public class LoginServlet extends HttpServlet

{

public void doGet(HttpServletRequest request,HttpServletResponse response)

throws IOException,ServletException {

// 获取用户提交的信息

String userid = request.getParameter("userid");

String userpass = request.getParameter("userpass");

// 创建JavaBean对象

UserBean ub = new UserBean();

// 转向的文件

String forward=null;

// 提示信息

String info=null;

// 得到session对象

HttpSession session;

session =request.getSession(true);

UserBean user=ub.findUserById(userid);

// 用户不存在

if(user == null){

forward="login.jsp";

}

// 口令不正确

else if(!user.getUserpass().equals(userpass)){

forward="login.jsp";

}

// 管理员

else if(user.getType().equals("1")){

session.setAttribute("login",user);

forward="findOrders";

}

// 普通用户

else{

session.setAttribute("login",user);

forward="findBooks";

}

// 定义跳转文件

RequestDispatcher rd=request.getRequestDispatcher(forward);

// 完成重定向

rd.forward(request,response);

}

public void doPost(HttpServletRequest request,HttpServletResponse response)

throws IOException,ServletException {

doGet(request,response);

}

}

13.2.6 在用户添加界面增加控制

在原来的添加界面的代码中,增加对用户是否登录已经是否有相应的权限的判断。判断过程如下:

u 从session中获取“login”对象,如果不存在表示没有登录,转向需要登录的提示界面;

u 如果用户存在,并且是普通用户,转向没有权限的提示界面;

u 如果是管理员,继续向下执行即可。

用于判断的代码如下:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<!--判断session中是否存在login-->

<c:if test="${empty login}">

<!--跳转到需要登录的提示界面-- >

<jsp:forward page="needlogin.jsp"/>

</c:if>

<!--判断session中用户是否是管理员-->

<c:if test="${login.type==0}">

<!--跳转到没有权限的提示界面-->

<jsp:forward page="noright.jsp"/>

</c:if>

把这段代码添加到addUser.jsp页面的前面即可。

13.2.6 对控制器进行安全控制

上面完成了对添加用户的界面的安全控制,这样如果不是管理员就不能访问这个界面了。好像已经完成了安全控制,事实是不是这样呢?

添加用户的过程是:在添加界面输入用户信息,提交给控制器处理,控制器调用业务方法完成添加过程。如果用户直接访问控制器怎么办?因为控制器是Servlet,是允许访问的。

有人会说虽然可以访问,但是没有用户信息,仍然不能添加。实际上,可以通过问号传递参数,效果与表单提交完全相同。在前面讲分页显示的时候,页码就是通过问号传递的。所以要想保证用户添加功能的安全,还需要对控制器进行安全控制。

在控制器中进行安全控制,主要的过程:

u 从session中获取登录信息

u 然后对登录信息进行判断:

n 如果为null,说明用户没有登录,跳转到“需要登录”的提示界面;

n 如果不为

web安全思维导图 收集的一些关于web安全的思维导图 立即下载

相关推荐

IT系统安全管理指南

IT系统安全管理指南(sp 800-30)中文版说明

springboot安全管理 safe

springboot安全管理

m0_49286715的博客 341

WEB应用程序设计代码完整版

WEB应用程序设计代码开发,web程序设计与开发技术,应用于web服务器开发技术代码完整版

html页面访问安全控制,学习spring security(一 ) demo

1.跟着spring官方给的guide做个demo,来学习spring security.首先引入依赖:dependencies {compile('org.springframework.boot:spring-boot-starter-web')compile('org.springframework.boot:spring-boot-starter-thymeleaf')compile('o...

weixin_42513296的博客 644

UE5在Ubuntu22.04.4下的高效开发环境配置指南

本文详细介绍了在Ubuntu 22.04.4系统上配置UE5高效开发环境的完整指南,包括系统准备、显卡驱动安装、UE5引擎编译与配置、开发工具链设置以及性能优化技巧。通过逐步指导,帮助开发者快速搭建稳定的UE5开发环境,解决常见问题,提升开发效率。

weixin_29251131的博客 383

一个固定翼飞机仿真程序带你系统性上手如何实现配平(工具箱+脚本)

老规矩,该博客所用的模型和脚本已上传至百度网盘,名字为“固定翼配平训练例子”,自己自取。

zouxu634866的博客 2573

html页面访问安全控制,Spring Boot如何使用Spring Security进行安全控制

我们在编写Web应用时,经常需要对页面做一些安全控制,比如:对于没有访问权限的用户需要转到登录表单页面。要实现访问控制的方法多种多样,可以通过Aop、拦截器实现,也可以通过框架实现(如:Apache Shiro、spring Security)。本文将具体介绍在Spring Boot中如何使用Spring Security进行安全控制。准备工作首先,构建一个简单的Web工程,以用于后续添加安全控制...

weixin_42510271的博客 406

Ubuntu20.04安装NVIDIA显卡驱动避坑指南:从.run文件到完美运行

本文详细介绍了在Ubuntu20.04系统上通过.run文件安装NVIDIA显卡驱动的完整流程和避坑技巧。从禁用Nouveau驱动、选择合适显示管理器到处理常见安装问题,提供了一套经过验证的解决方案,帮助用户顺利完成驱动安装并优化性能。

weixin_30776273的博客 604

web应用安全控制

安全控制流程

sdaujsjczh的专栏 262

GBASE南大通用GBase 8s数据库-从零开始的手动安装与实例配置指南

本文详细介绍了GBASE南大通用GBase 8s数据库的手动安装与实例配置全过程,包括环境准备、用户创建、安装包准备、实例创建、环境变量配置等关键步骤。通过实战经验分享和常见问题解决方案,帮助用户快速掌握GBase 8s数据库的安装与配置技巧,确保数据库稳定运行。

weixin_29209825的博客 455

嵌入式工程师必学(118):MCU的硬件定时器和中断

大多数微处理器都有一个或多个可编程硬件定时器,这些定时器包括对中断的支持。可以有不同类型的计时器,用于不同的应用程序。例如,LPC1768 具有四个 32 位通用定时器、一个看门狗定时器、一个重复中断定时器、一个系统滴答定时器、一个正交编码器接口、6 个 PWM 输出和一个支持中断的实时时钟。硬件定时器用于计时和计数作,允许处理器在 timer 进程运行时继续执行其他进程。硬件定时器是一种使用 clock 信号来增加 register 的电路。

码农17年的博客 211

Spring Security Web应用安全控制:保护你的应用程序

Spring Security是一个功能强大且高度可定制的Java安全框架,用于保护基于Spring的应用程序。Spring Security是一个功能全面且灵活的安全框架,适用于各种规模的Web应用。通过本文的学习,你应该能够掌握Spring Security的基本操作,并开始在你的项目中使用Spring Security进行安全控制。

2201_75568026的博客 470

大数据领域存算分离:教育行业的数据应用探索

在当今数字化时代,教育行业积累了海量的数据,如学生的学习记录、考试成绩、在线学习行为等。如何高效地存储、管理和分析这些数据,以挖掘其潜在价值,为教育决策、教学改进和学生个性化发展提供支持,成为教育行业面临的重要挑战。大数据领域的存算分离技术为解决这一问题提供了新的思路和方法。本文旨在探索存算分离技术在教育行业的数据应用,分析其原理、优势和实际应用场景,为教育行业的数据管理和分析提供参考。本文共分为十个部分。第一部分介绍背景,包括目的和范围、预期读者、文档结构概述和术语表;

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 814

是否对Web应用的Web服务器和应用服务器之间的通信进行了安全控制?

配置Web服务器时需要对来自不同区域的请求进行限制以实现访问控制:```shell根据上述实践方法,用户在Web服务器及应用服务器间的通信过程中可以实现有效的安全控制措施包括访问控制、WAF防护以及数据传输加密等方面内容从而提高了系统的整体安全性。不过值得注意的是这些仅仅是一些基本的防护措施在实际应用场景中可能还需要结合其他技术手段和管理流程才能更好地满足复杂多变的安全需求例如实时监控报警和应急响应计划等内容需要配套完善以确保系统的安全稳定运行。

ZOMO的博客 416

文献解读:结构方程模型SEM基础,小白看这个就基本够了

今天要解读的依然是一篇教学文献:The Basics of Structural Equation Modeling,文献作者是Diana Suhr, Ph.D. University of Northern Colorado。 文献链接: https://www.lexjansen.com/wuss/2006/tutorials/TUT-Suhr.pdf 结构方程模型是: 用来检验显变量与潜变量关系假设的综合性的统计技巧 用来表示,估计或者检验变量间理论关系的技巧 用来探究一系列潜变量和显变量因

Codewar的博客 6万+

详解FreeRTOS:FreeRTOSConfig.h系统配置文件(拓展篇—1)

FreeRTOS的系统配置文件为FreeRTOSConfig.h,在配置文件中可以完成FreeRTOS的裁剪和配置,这是非常重要的一个文件,本篇博文就来讲解这个文件。

不脱发的程序猿 1548

是否对Web应用的Cookie和Session管理实施了安全控制?

*什么是Cookie?**Cookie 是指网站服务器为每个用户创建的一种小型文本文件(通常只有几KB大小),并将其存储在使用 Cookie 的用户的浏览器上。当用户访问同一网站时,该网站便可通过 Cookie 识别不同的用户并保存他们的设置信息 (如购物车等)。**Cookie有哪些特点?**1. 保存在客户端:Cookie 存储于用户的浏览器端而非服务器端,这使得用户无需重新登录即可继续之前的活动状态。

ZOMO的博客 1141

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

web网站的安全控制

加密机制:加密是保护数据在传输和存储过程中安全性的核心技术。通过对数据进行加密,可以确保只有拥有解密密钥的授权用户可以访问和读取数据。常见的加密算法包括对称加密(如AES)和非对称加密(如RSA)。数字签名机制:数字签名用于验证数据的完整性和来源。通过使用私钥对数据进行签名,接收方可以使用公钥验证签名的有效性,从而确保数据在传输过程中没有被篡改,并且确实来自声称的发送方。身份认证机制:身份认证是确认用户或实体身份的过程。

migo_的专栏 1247

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ASP.NET应用程序安全控制的作用及原理

作为Web服务器,就是向浏览者友好的提供反馈信息。如果访问者按照网络服务的规则,以合理身份和合理的权限提交数据访问请求,那么交互关系就会显得顺理成章。但是事实上并非这么简单,正如世界上的交通一样,并非所有的车辆都是按照规定行道来行驶,总会有些有意无意的访问是不合规则(不合法)的。因此网络应用程序安全问题显得尤为重要。   我们知道Web应用程序提供的服务是可以通过世界上任意一台可以连到互联网的计

The key to .Net 311

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Spring Boot中使用Spring Security进行安全控制

我们在编写Web应用时,经常需要对页面做一些安全控制,比如:对于没有访问权限的用户需要转到登录表单页面。要实现访问控制的方法多种多样,可以通过Aop、拦截器实现,也可以通过框架实现(如:Apache Shiro、Spring Security)。 本文将具体介绍在Spring Boot中如何使用Spring Security进行安全控制。 准备工作 首先,构建一个简单的Web工程,以用于后续...

优秀的判断力来自经验,但经验来自于错误的判断 251

使用 Smart Security 实现安全控制

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34050519的博客 457
上一篇: JDBC相关的知识点总结
下一篇: 为“得”而“舍”
Java_Web_Book
博客等级 码龄18年 8粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值