基于页面基类PageBase和IHttpHandle权限验证
- 格式:ppt
- 大小:579.50 KB
- 文档页数:12
basepage类的js方法BasePage是一个常见的前端开发中使用的类,用于编写页面的基础方法。
它包含了一些常用的函数,可以在页面中进行调用,提供了一些常见的功能。
1. init方法:这是BasePage类的构造函数,在页面加载完成后进行调用。
可以在该方法中初始化一些变量或者执行一些必要的操作。
2. getElementById方法:这个方法用于通过元素的id获取到相应的DOM元素。
可以在页面中使用document.getElementById()方法来获取DOM元素,然后封装在BasePage的getElementById方法中进行调用。
3. addEventListener方法:这个方法用于给DOM元素添加事件监听器。
可以在该方法中使用addEventListener()方法来给指定的元素添加事件监听函数,方便在页面中进行事件处理。
4. removeEventListener方法:这个方法用于移除DOM元素上的事件监听器。
可以在该方法中使用removeEventListener()方法来移除指定元素上的事件监听函数,避免内存泄漏。
5. show方法:这个方法用于显示指定的DOM元素。
可以在该方法中设置元素的display样式为"block",使其在页面中可见。
6. hide方法:这个方法用于隐藏指定的DOM元素。
可以在该方法中设置元素的display样式为"none",使其在页面中不可见。
7. getData方法:这个方法用于从服务器获取数据。
可以使用XMLHttpRequest或者fetch等方式发送HTTP请求,获取服务器返回的数据并进行处理。
8. sendData方法:这个方法用于向服务器发送数据。
可以使用XMLHttpRequest或者fetch等方式发送HTTP请求,将数据发送给服务器进行处理。
BasePage类的这些方法可以作为前端页面的基础功能,方便开发者在实际开发中进行调用和扩展。
authorizationhandler authorizeattribute AuthorizationHandler 和AuthorizeAttribute 是 Core 中用于身份验证和授权的两个关键组件。
在这篇文章中,我们将逐步介绍这两个组件的作用、使用方式以及它们在构建安全的Web 应用程序中的重要性。
第一步:理解身份验证和授权的概念在开始介绍AuthorizationHandler 和AuthorizeAttribute 之前,我们首先需要明确身份验证和授权这两个概念的含义。
身份验证是用于验证用户身份的过程,通过用户名和密码等凭据来确认用户是谁。
一旦用户的身份被验证通过,系统就会生成一个身份凭证,用于后续的请求验证。
授权是用于确定用户是否具有执行特定操作或访问特定资源的权限。
系统会根据用户的身份验证凭证和授权策略来决定用户是否有权进行某个操作。
第二步:介绍AuthorizationHandlerAuthorizationHandler 是一个自定义的类,用于定义和实现授权策略。
它实现了Microsoft.AspNetCore.Authorization.IAuthorizationHandler 接口,并包含一个HandleRequirementAsync 方法,用于处理授权要求。
AuthorizationHandler 可以定义不同的授权要求,并根据一组规则来验证用户是否满足这些要求。
例如,可以使用AuthorizationHandler 来验证用户是否具有特定的角色、是否满足自定义的业务逻辑等。
第三步:使用AuthorizationHandler要使用AuthorizationHandler,我们首先需要将其注册到 Core 应用程序的服务集合中。
可以在Startup.cs 文件的ConfigureServices 方法中添加以下代码:csharpservices.AddScoped<IAuthorizationHandler, MyAuthorizationHandler>();在上述代码中,MyAuthorizationHandler 是我们自定义的AuthorizationHandler 类,可以根据实际情况进行替换。
重写AuthorizeAttribute实现⾃⼰的权限验证在MVC系统开发中,难免会遇到权限验证问题,解决这个问题的⽅法很多,这⾥使⽤⾃定义AuthorizeAttribute来实现,代码如下:public class MyAuthorizeAttribute : AuthorizeAttribute{protected override bool AuthorizeCore(HttpContextBase httpContext){if (httpContext.Request.Cookies["yourset"] == null)return false;return base.AuthorizeCore(httpContext);//bool result = false;//if (httpContext == null)//{// throw new ArgumentNullException("httpContext");//}//string[] users = Users.Split(',');//string[] roles = Roles.Split(',');//if (!er.Identity.IsAuthenticated)// return false;//if (roles.Length != 0)//{// // we can get the roles by our bussiness logic here// List<string> rightRoles = new List<string> { "admin", "owner" };// foreach (var role in roles)// {// if (rightRoles.Contains(role))// {// result = true;// break;// }// }//}//if (!result)//{// httpContext.Response.StatusCode = 403;//}//return result;}public override void OnAuthorization(AuthorizationContext filterContext){base.OnAuthorization(filterContext);if (filterContext.HttpContext.Response.StatusCode == 403){filterContext.Result = new RedirectResult("/Home/Index");}}}这样,我们就可以在我们的Action上⽤它来设置访问权限了。
1数据结构2设计模式2.1四原则2.1.1单一职责2.1.2开放-封闭2.1.3里氏替换2.1.4依赖倒转2.1.5迪米特2.2简单工厂通过工厂类,依照条件把子类造出来2.3策略2.4装饰将需要修饰的类的对象引入,2.5代理2.6工厂对比简单工厂来说,将其自身也子类化将类的实例化延迟到其子类2.7原型2.8单例3C#概念3.1装箱拆箱3.1.1值类型与引用类型值类型:System.ValueType(继承自System.Object)引用类型:System.Object3.1.2System.Object方法clone, getClass, toString, finalize, equals, hashCode, wait, notify,notify all3.1.3强类型RTTI3.2反射3.2.1反射反射提供一种编程方式,让程序员可以在程序运行期获得程序集、模块、类型的相关信息。
Get the information of assembly, module, and class at run time3.2.2晚绑定3.2.3创建动态3.3特性Property is a concept of OOP. It uses ‘get’ and ‘set’ to access themember variables.Attribute is a kind of metadata of .NET file. It is used to describe yourcode at run time.3.4序列化Storage an object in a kind of medium, or transfer this object, in orderto transmit it on the net.The base class can be serialized. It use serializable attribute3.4.1二进制binary3.4.2XML3.4.3SoapSimple Object Access Protocol3.5GC– Garbage Collection3.5.1Disposeexplicit3.5.2FinalizeImplicit, you don’t know when the garbage is collect3.6GAC3.6.1托管代码Managed Code3.6.2GAC 全局程序缓存 Global Assembly Cache3.6.3CLR 公共语言运行库 (common language runtime) 托管代码执行核心中的引擎。
Selenium项⽬实战(三)BasePage封装之前写的代码中都没有加⼊异常处理,规范写法,应该在每次查找元素或操作时加上异常处理、⽇志信息、失败截图等,如下:def input_account(self, account):'''输⼊账号'''try:WebDriverWait(self.driver, 20).until(EC.visibility_of_element_located(self.account))self.driver.find_element(*self.account).send_keys(account)except Exception:raise但是为所有的查找元素和操作都加上这些耗时且不⽅便维护,为了简化操作,可以把⼀些公⽤的⽅法封装到 BasePage 类,其它页⾯ page 直接继承 BasePage 即可调⽤公共⽅法。
BasePage 类:1. 封装基本函数:执⾏⽇志、失败截图、异常处理等2. 所有页⾯公共操作⽅法⽂件结构:⽰例代码:base_page.pyimport osimport timefrom selenium.webdriver.remote.webelement import WebElementfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom common.logger import loggerimport configsclass BasePage:def__init__(self, driver):self.driver = driverdef open(self, url):self.driver.get(url)def wait_ele_visible(self, locator:tuple, doc="", timeout=30, poll_frequency=0.5, ignored_exceptions=None):'''等待元素可见:param locator: 元素定位⽅式,元组形式:param timeout: 超时时间,默认30秒:param poll_frequency: 轮询时间,默认0.5秒:param ignored_exceptions: 要忽略的异常:param doc: 截图模块名称,若没有则只以时间戳明明:return:'''(f"等待元素 {locator} 可见")try:WebDriverWait(self.driver, timeout, poll_frequency, ignored_exceptions).until(EC.visibility_of_element_located(locator))except Exception as e:logger.exception(f"等待元素 {locator} 可见失败")self.save_screenshot(doc)raise e# 查找元素def get_element(self, locator: tuple, doc="")->WebElement:(f"查找元素 {locator} ")try:return self.driver.find_element(*locator)except:logger.exception(f"查找元素 {locator} 失败")self.save_screenshot(doc)raise# 点击元素def click_element(self, locator:tuple, doc=""):ele = self.get_element(locator, doc)try:ele.click()except:logger.exception(f"点击元素 {locator} 失败")self.save_screenshot(doc)raise# 输⼊⽂本def input_text(self, locator:tuple, text, doc=""):ele = self.get_element(locator, doc)try:ele.send_keys(text)except:logger.exception(f"元素 {locator} 输⼊⽂本 {text} 失败")self.save_screenshot(doc)raise# iframe 切换def switch_to_iframe(self, locator:tuple, doc=""):ele = self.get_element(locator, doc)try:self.driver.switch_to.frame(ele)except:logger.exception(f"切换到iframe {locator} 失败")self.save_screenshot(doc)raise# 失败截图def save_screenshot(self, filename):if not os.path.exists(configs.SCREENSHOT_PATH):os.mkdir(configs.SCREENSHOT_PATH)# 图⽚名称:模块名-页⾯名-函数名-年⽉⽇时分秒.pngfile_name = configs.SCREENSHOT_PATH + filename + "_" + time.strftime("%Y%m%d%H%M%S") + ".png"self.driver.save_screenshot(file_name)(f"成功获取截图,路径:{file_name}")demo_login_page.py,页⾯ page 类需继承 BasePage 类import osfrom configparser import ConfigParserfrom common.base_page import BasePageclass LoginPage(BasePage):def get_locator(self):conf = ConfigParser()print(os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + "\\page_locator\\demo_locator.ini")conf.read(os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + "\\page_locator\\demo_locator.ini", encoding="utf-8") self.url = conf.get("Base", "url")section = "LoginPageLocator"# eval 将字符串元组转换为元组self.login_by_pwd_btn = eval(conf.get(section, "login_by_pwd_btn"))self.account = eval(conf.get(section, "account"))self.pwd = eval(conf.get(section, "pwd"))self.login_btn = eval(conf.get(section, "login_btn"))def__init__(self, driver):super().__init__(driver)self.get_locator()def login(self, account, password):doc = "登录页⾯_登录"self.driver.get(self.url) # 打开登录页⾯self.click_element(self.login_by_pwd_btn, doc) # 点击密码登录self.input_text(self.account, account, doc) # 输⼊账号self.input_text(self.pwd, password, doc) # 输⼊密码self.click_element(self.login_btn, doc) # 点击登录demo_home_page.py,页⾯ page 类需继承 BasePage 类import osfrom configparser import ConfigParserfrom common.base_page import BasePageclass HomePage(BasePage):def get_locator(self):conf = ConfigParser()conf.read(os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + "\\page_locator\\demo_locator.ini",encoding="utf-8")section = "HomePageLocator"self.account_info = eval(conf.get(section, "account_info"))def__init__(self, driver):super().__init__(driver)self.get_locator()def is_account_info_exist(self):try:self.wait_ele_visible(self.account_info)return Trueexcept Exception:return Falsetest_demo.pyfrom pytest_assume.plugin import assumefrom selenium import webdriverfrom po.page_object.demo_home_page import HomePagefrom po.page_object.demo_login_page import LoginPageclass TestLogin():def setup_class(self):self.driver = webdriver.Chrome()self.driver.maximize_window()self.driver.implicitly_wait(10)def teardown_class(self):self.driver.quit()def test_demo(self):self.login_page = LoginPage(self.driver)self.home_page = HomePage(self.driver)self.login_page.login("153********", "Pan910124")with assume:assert self.home_page.is_account_info_exist()对于⼀些通⽤的⽅法,我们也可根据⾃⼰的需要进⾏封装,譬如从 demo_locator.ini ⽂件获取数据,我们可以封装⼀个⼯具类 handle_ini.py 放在 common 模块下:import osfrom configparser import ConfigParserclass HandleIni(ConfigParser):# 已字典格式返回 ini ⽂件中某个 section 的数据def get_locator_dict(self, locator_file, section):conf = ConfigParser()conf.read(os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + "\\po\\page_locator\\" + locator_file, encoding="utf-8")section_data = {}for key in conf.options(section):section_data[key] = conf.get(section, key)return section_data那么其他页⾯类就可以使⽤ HandleIni ⼯具类来获取数据:# demo_home_page.pyfrom common.base_page import BasePagefrom common.handle_ini import HandleIniclass HomePage(BasePage):def get_locator(self):locators = HandleIni().get_locator_dict("demo_locator.ini", "HomePageLocator")self.account_info = eval(locators.get("account_info"))def__init__(self, driver):super().__init__(driver)self.get_locator()def is_account_info_exist(self):try:self.wait_ele_visible(self.account_info) return Trueexcept Exception:return False。
dotnet handlerequirementasync 自定义返回code -回复如何使用dotnet中的HandleRequirementAsync来自定义返回code一、简介在dotnet中使用HandleRequirementAsync来对授权要求进行处理是非常常见的。
通常情况下,我们使用HandleRequirementAsync来验证用户是否满足某个特定的授权要求,如果满足,则授予访问权限;如果不满足,则返回相应的错误消息或代码。
然而,在某些情况下,我们可能需要对返回的错误代码进行自定义,以使其更符合我们的应用程序的需求。
本文将重点介绍如何在dotnet中使用HandleRequirementAsync来自定义返回错误代码。
二、了解HandleRequirementAsync在深入讨论如何自定义错误代码之前,我们首先要了解HandleRequirementAsync的工作原理和使用方法。
HandleRequirementAsync是在实现IAuthorizationHandler接口时必须实现的一个方法。
该方法用于处理授权要求,并返回一个Task,其中包含AuthorizationResult类型的结果。
默认情况下,HandleRequirementAsync会返回一个Failed的AuthorizationResult,其StatusCode属性默认为403 Forbidden。
这表示未满足授权要求,请求将被拒绝。
三、自定义错误代码有时,我们希望根据应用程序的需要自定义错误代码,以便更好地区分不同类型的错误或问题。
下面是一些步骤,可以帮助我们实现自定义错误代码。
1. 创建一个自定义的AuthorizationResult我们可以通过继承AuthorizationResult类来创建一个自定义的AuthorizationResult,以添加我们需要的自定义错误代码。
csharppublic class CustomAuthorizationResult : AuthorizationResult {public string ErrorCode { get; set; }public CustomAuthorizationResult(bool isSuccess, string errorCode) : base(isSuccess){ErrorCode = errorCode;}}在以上示例中,我们创建了一个名为CustomAuthorizationResult的自定义类,并添加了一个名为ErrorCode的属性,该属性用于存储自定义错误代码。
basic auth鉴权描述-回复什么是基本身份验证(Basic Auth)?基本身份验证(Basic Auth)是一种用于在客户端和服务器之间进行身份验证的协议。
它是HTTP身份验证的一种简单实现方式,通常使用用户名和密码进行身份验证。
基本身份验证使用了编码的用户名和密码,在每个请求中作为HTTP头部的一部分发送给服务器。
当服务器收到请求时,它会检查发送的用户名和密码是否与其记录中的凭据匹配。
基本身份验证的原理基本身份验证是通过在请求的Authorization头部中发送Base64编码的用户名和密码来进行身份验证的。
这个头部字段有一种特定的格式:`Authorization: Basic <credentials>`。
其中credentials是Base64编码的用户名和密码的组合,格式为`<username>:<password>`,再进行Base64编码。
基本身份验证的步骤下面,让我们一步一步探讨基本身份验证的详细步骤。
1. 客户端发送一个HTTP请求到服务器。
在请求中,客户端包括一个Authorization头部字段,用于进行身份验证。
2. 服务器接收到请求后,开始解析请求头部,查找Authorization字段。
3. 服务器检查Authorization字段的值是否以“Basic”开头,以确定使用的是基本身份验证。
4. 服务器解码Authorization头部字段的值,获取到用户名和密码的组合。
这里通常会使用Base64解码。
5. 服务器根据自己的存储机制,检查解码后的用户名和密码是否与存储的凭据匹配。
6. 如果服务器发现凭据匹配成功,那么继续处理客户端的请求。
否则,服务器将返回一个401 Unauthorized状态码,表示身份验证失败。
7. 如果客户端收到了401状态码,它会向用户显示一个身份验证的对话框,要求用户输入用户名和密码。
8. 客户端将用户输入的用户名和密码进行编码,生成一个新的Authorization头部字段,并将其添加到之前的请求中。
BaseHTTPRequestHandler实现简单的API接口首先,我们需要导入BaseHTTPRequestHandler类和HTTPServer类:```python```然后,我们创建一个继承自BaseHTTPRequestHandler的子类,用于处理HTTP请求和定义API接口。
下面是一个简单的示例:```pythonclass MyAPIHandler(BaseHTTPRequestHandler):def do_GET(self):if self.path == '/api': # 处理/api的GET请求self.send_response(200) # 设置响应状态码为200self.send_header('Content-type', 'application/json') # 设置响应类型为JSONself.end_headersresponse = {'message': 'Hello, World!'} # 构建响应数据self.wfile.write(json.dumps(response).encode() # 发送响应数据else:self.send_response(404) # 设置响应状态码为404self.send_header('Content-type', 'text/html')self.end_headersself.wfile.write(b'404 Not Found') # 发送404响应数据```在上述代码中,我们通过重写do_GET方法来处理HTTP的GET请求。
当请求路径为"/api"时,返回一个包含"message"字段的JSON响应,否则返回"404 Not Found"。
适用专业:请各位考生注意:所有答案必须填写到答题纸上,否则不计分。
一、选择题(每小题2分,共50分,单选题)1.用于使用已创建的自定义控件的指令为()A、RegisterB、ControlC、TagPrefixD、Import2.关于HttpHandler程序的说法不正确的是()A、后缀名为.ashxB、请求处理的终点C、实现了IHttpHandler接口D、IsReusable属性为False时,程序只能使用一次3.为了保护网页,将被保护的网页分类置于不同的目录下,这是为了()A、便于管理B、调用方便C、便于网站的改版D、便于网站的迁移4.如需要添加用户角色,下面哪个工具比较方便?()A、web站点管理工具B、MMC 插件C、内部发布工具D、Xcopy5.在子目录Admin文件夹的Web.config文件中有这样一段代码:<authorization ><deny users=”?”/></ authorization >这说明()A、只有管理员可以访问Admin目录B、所有匿名用户都可以访问Admin目录C、所有匿名用户都不可以访问Admin目录D、所有用户都不可以访问Admin目录6.APP_Data目录用来放置()A、专用数据文件B、共享文件C、被保护的文件D、代码文件7.设置分页时,设置页面大小的属性为()A、PageSettingB、PageINdexC、PageSizeD、AllowPaging8.@Page指令,下面说法不正确的是()A、语言属性可以写JA V AB、AutoEventWireup属性可以不写C、CodeFile可以不写,但必须Inherits也不写D、AutoEventWireup所指定的页面事件包含Page_Load9.当跨页传递数据时,哪个属性标识源页面是跨页提交?()A、IsPostBack B、IsCrossBackC、PreviousPageD、IsCrossPagePostBack10.有关母版页的说法正确的是()A、一个站点只能有一个母版页B、一个内容页对应母版页中的一个位置ContentPlaceHolderC、内容页相当于HTML中的Iframe页,浏览地址显示母版页地址D、母版页的后缀名为.master11.有关ObjectDataSource说法正确的是()A、只能绑定数据访问层方法,才能返回正确数据B、只有通过方式访问数据库,才能使用ObjectDataSourceC、ObjectDataSource可以直接指向数据库,返回DataSetD、ObjectDataSource一般绑定业务逻辑层方法12.ValidationSummary控件的作用是()A、检查总和数B、集中显示所有验证的结果C、判断有无超出范围D、检查数值大小13.需要验证TextBox的输入数据为年龄,并且要求大于18岁,小于65岁,应该使用的验证控件是()A、CompareValidatorB、RangeValidatorC、RequiredFieldValidator和RangeValidatorD、RequiredFieldValidator和CompareValidator14.DataList的换行符模板是()A、SeparatorTemplateB、ItemTemplateC、TemplateFieldD、AlternatingItemTemplate15.关于Repeater控件,下列说法正确的是()A、Repeater控件不能显示内容B、Repeater控件不能显示Html的内容C、Repeater控件不会自动添加Html的相关内容D、Repeater控件不会显示没有设置格式的内容16.下面是TreeView控件代码:<asp:TreeNode Text=”Node1” SelectAction=”Extend”><asp:TreeNode Text=”Node2”….><asp:TreeNode Text=”Node3”….></ asp:TreeNode>当鼠标单击“Node1”时只进行的操作。