你好,看完你的博客文章,感觉很不错!希望与你网站首页友情链接 流量卡知识网 http://53go.cn/ 专注于移动/联通/电信推出的大流量多语音活动长短期套餐手机卡的相关知识的介绍普及听说互换友情链接可以增加网站的收录量,特此来换,如果同意的话就给internetyewu@163.com[微信ganenboy]发信息或者就在此回复下吧!【建站问题也可以一起讨论!】
你好,看完你的博客文章,感觉很不错!希望与你网站首页友情链接 流量卡知识网 http://53go.cn/ 专注于移动/联通/电信推出的大流量多语音活动长短期套餐手机卡的相关知识的介绍普及听说互换友情链接可以增加网站的收录量,特此来换,如果同意的话就给internetyewu@163.com[微信ganenboy]发信息或者就在此回复下吧!【建站问题也可以一起讨论!】
你好
http://bigota.d.miui.com/V14.0.9.0.TLJCNXM/ingres_images_V14.0.9.0.TLJCNXM_20230323.0000.00_13.0_cn_chinatelecom_aff802bb3e.tgz
已添加贵站友链 Southerly 个人博客 || http://www.southerly.top || https://www.southerly.top/imgs/favicon.ico || 一个正在努力搬砖的兼职程序员,记录生活,分享生活,欢迎大家来访。
目前这种不行了
老哥呀,现在这种方法还能爬到数据嘛?可以聊聊不
https://www.aliyundrive.com/s/5N2bKDVZfxC
https://wwi.lanzoup.com/iU6FZ0o4as1i
04824ADB9F824ADB9F0400824ADB9F000F
https://lihh.lanzouf.com/ij6c80nhq7rg
https://cloud.189.cn/web/share?code=FvuIbuJBnEVr
https://lihh.lanzouf.com/ij6c80nhq7rg
https://developer.aliyun.com/plan/student?taskCode=vmfeitian2023&recordId=5246709&undefined&share_source=copy_link
已加,三天之后检查没加本站链接 就下了
首页
大佬聚集地
欢迎大家
教程分享
每日一看
Search
1
欢迎来到河马博客
41,755 阅读
2
守护者群管小栗子框架下载教程
40,885 阅读
3
烟花模拟器(php)
35,661 阅读
4
外链搜索引擎优化如何发布
13,617 阅读
5
一键搭建表白墙源码+教程
13,255 阅读
软件分享
教程分享
源码分享
游戏攻略
百科知识
SEO课程
登录
Search
标签搜索
推特
升学考试
账号
数学
饺子
笔记本电脑
笔记本
研究生考试
字符
英语
函数
马斯克
笔记本电脑排名前十
操作
初一
联想
考研
广告
注册
账户
河马
累计撰写
7,218
篇文章
累计收到
81
条评论
今日撰写
50
篇文章
首页
栏目
软件分享
教程分享
源码分享
游戏攻略
百科知识
SEO课程
页面
大佬聚集地
欢迎大家
教程分享
每日一看
用户登录
登录
搜索到
607
篇与
的结果
2023-12-03
一篇读懂(javaweb项目开发实战入门(全彩版))javaweb实战视频,你要的JavaWeb项目实战课程请查收!,java web开发实战,
记得不要活在别人眼里而要活在自己心里该坚强就坚强该善良就善良想哭的时候就放声哭泣记得不要在乎别人非议要习惯性选择忘记把所有冷眼嘲笑都当作一种鼓励就不会觉得有多委屈无所谓平凡与伟大这世界赐我们独一无二的你你所有的努力 就是成为自己——2022年涛哥号列车就要发车了请系好安全带目地的《卖淘乐》后台管理系统......这是一套适合正在学习JavaWeb阶段的小伙伴学习的项目实战课程,也可以作为童鞋们的毕设项目,项目课程采用技术选型为:前端静态网页 HTML/CSS/JS+jQueryServlet/JSPJDBC:Druid + apache commons DBUtil通过项目实战,你将收获到软件系统开发流程,业务流程设计,数据库设计,例如使用PDMan逆向生成数据库模型等。项目后台长这样,看着就是低调、舒服、有内涵的风格,涛哥,我想问一下,是找的哪个前端妹子设计的呀,能不能介绍一下:卖淘乐后台管理系统系统功能实现总揽图项目功能的层次结构图:列出系统的功能,并建立起功能之间的层次关系涛哥简介我是涛哥,这是2022年的首套课程,以项目实战跟大家见面了,不知道小伙伴们2021年涛哥的视频都学完了没有,是不是都掌握了,每套视频的录制过程,都倾注了涛哥的心血,练就了这一喉沙哑而富有磁性的声线。不是自夸,记得有一个涛哥的小迷妹跟我说,总是喜欢晚上听听涛哥的声音,越听越兴奋的那种,情不自禁就撸了起来,一撸就是到深夜,晚上撸代码好伤身体呀,涛哥安慰她要循序渐进,不要急于求成,希望涛哥可以陪伴她到成功。生活让我们在B站相遇,相识到...不知道多远,希望几十年后,当我回忆这段历程,相信内心深处是欣慰的。因为我们没有虚度年华,我们一起努力拼搏做了一件非常有意义的事情:帮助更多迷茫的学生实现他们的梦想!我是涛哥,还是那个最有B格的Java讲师。课程详细内容:001-《卖淘乐》后台管理系统-介绍002-《卖淘乐》后台管理系统-开发流程003-《卖淘乐》后台管理系统-功能说明004-《卖淘乐》后台管理系统-业务流程设计005-《卖淘乐》后台管理系统-数据库分析006-《卖淘乐》后台管理系统-数据库创建007-《卖淘乐》后台管理系统-UI设计说明008-《卖淘乐》后台管理系统-技术选型及项目搭建009-管理员登录-实现流程设计010-管理员登录-数据库操作代码实现011-管理员登录-业务层代码实现012-管理员登录-视图层和控制层代码实现013-登录验证码-实现流程设计014-登录验证码-生成验证码并校验015-登录过滤器-实现流程设计016-登录过滤器-代码实现017-密码加密业务及流程介绍018-密码加密的安全性-加盐019-密码加密校验代码实现020-权限管理介绍021-RBAC权限管理实现介绍022-首页菜单加载-实现流程设计023-首页菜单加载-数据表关系及查询SQL024-首页菜单加载-创建菜单实体类025-首页菜单加载-数据库查询菜单026-首页菜单加载-业务逻辑层代码实现027-首页菜单加载-登录成功查询菜单并显示028-菜单管理-流程分析029-菜单管理-数据库操作实现030-菜单管理-业务逻辑层实现031-菜单管理-显示一级菜单、二级菜单032-菜单管理-二级菜单异步联动-异步请求二级菜单033-菜单管理-二级菜单异步联动-渲染二级菜单034-菜单启用与停用-实现流程设计035-菜单启用与停用-动态显示二级菜单状态036-菜单启用与停用-数据库及业务实现037-菜单启用与停用-ajax请求菜单启用和停用038-菜单启用与停用-前端处理ajax请求响应039-菜单启用与停用-解决同一个菜单连续启用和停用的bug040-管理员登录成功之后隐藏禁用菜单041-角色信息列表-角色列表实现流程分析042-角色信息列表-角色列表功能代码实现043-角色信息列表-使用dataTables实现角色列表分页044-添加新角色-实现流程分析045-添加新角色-显示系统菜单列表-数据库及业务层代码实现046-添加新角色-显示系统菜单列表-功能实现047-添加新角色-保存角色信息-数据库操作实现048-添加新角色-保存角色信息-业务逻辑层实现049-添加新角色-保存角色信息-功能实现050-删除角色-实现流程分析051-删除角色-数据库及业务层代码实现052-删除角色-视图层及控制层代码实现053-删除角色-批量删除角色的流程与实现054-修改角色-业务流程分析055-修改角色-角色信息回显-数据库及业务实现056-修改角色-角色信息回显-功能代码实现057-修改角色-角色信息修改实现(授权)058-管理员信息列表-实现流程分析059-管理员信息列表-数据库及业务实现060-管理员信息列表-功能流程代码实现061-添加管理员-实现流程分析062-添加管理员-数据库操作及业务实现063-添加管理员-功能流程代码实现064-删除管理员-实现流程分析065-删除管理员-功能代码实现066-修改管理员-实现流程分析067-修改管理员-数据库操作及业务实现068-修改管理员-管理员信息回显及修改实现069-分类管理-实现流程分析070-分类管理-数据库操作代码实现071-分类管理-业务逻辑代码实现072-分类管理-分类列表功能实现073-分类管理-添加分类功能实现074-分类管理-删除分类功能实现075-分类管理-修改分类功能实现076-品牌管理-品牌列表功能流程分析077-品牌管理-品牌列表功能实现078-品牌管理-按分类查询品牌功能实现079-品牌管理-添加品牌功能流程分析(图片异步上传)080-品牌管理-添加品牌数据库及业务代码实现081-品牌管理-添加品牌-图片异步上传功能实现082-品牌管理-添加品牌-保存品牌信息功能实现083-品牌管理-修改品牌-业务流程设计084-品牌管理-修改品牌-数据库操作及业务实现085-品牌管理-修改品牌-功能流程代码实现086-品牌管理-删除品牌-数据库操作及业务实现087-品牌管理-删除品牌-功能流程代码实现088-评估类目管理-类目列表、添加类目流程分析089-评估类目管理-类目列表功能实现090-评估类目管理-添加类目功能实现091-评估选项管理-评估选项列表实现流程设计092-评估选项管理-评估选项列表数据库及业务层实现093-评估选项管理-评估选项列表功能流程实现094-评估选项管理-评估类目与选项列表联动实现095-评估选项管理-添加评估选项功能实现096-商品管理-商品列表功能-实现流程设计097-商品管理-商品列表功能-显示一级分类功能实现098-商品管理-商品列表功能-根据分类联动显示品牌列表实现099-商品管理-商品列表功能-商品查询显示实现100-商品管理-添加商品-实现流程设计102-商品管理-添加商品-显示一级分类联动品牌显示实现103-商品管理-添加商品-商品图片异步上传104-商品管理-添加商品-商品数据提交与保存功能实现105-《卖淘乐》后台管理系统功能实现总结-完结106-《卖淘乐》管理系统源码导入及项目部署运行私聊我获取相关视频哦!
2023年12月03日
0 阅读
0 评论
0 点赞
2023-12-03
太疯狂了(面向服务的架构soa三个方面内容)面向服务的架构soa是一种细粒度,什么是面向服务的体系结构? 了解SOA和基于SOAP的Web服务的关键特征,使用java web服务构建soa,
获取更多资讯:https://wdapp.zaiiu.com/dear/profess/picture.jpgwdapp.zaiiu.com/dear/profess/picture.jpg面向服务的体系结构(SOA)在本世纪初随着分布式计算的发展而出现。在SOA之前,服务被理解为应用程序开发过程的最终结果。在SOA中,应用程序本身由服务组成。服务可以单独交付,也可以作为组件组合到更大的复合服务中。服务使用诸如REST或 SOAP (简单对象访问协议)之类的协议在线进行交互。服务是松散耦合的,这意味着服务接口独立于基础实现。开发人员或系统集成商可以将一个或多个服务组合到一个应用程序中,而不必知道每个服务的实现方式。本文概述了Java SOA和使用基于SOAP的Web服务实现的面向服务的体系结构的关键特性。我还将简要比较SOA和微服务,并讨论RESTful和Java中基于SOAP的Web服务之间的区别。SOA和Web服务SOA和Web服务经常合并在一起,但是它们不是一回事。SOA是允许开发人员将多个应用程序服务组合到一个较大的复合服务中的体系结构。可以使用基于SOAP的Web服务或REST API或有时两者结合来实现SOA 。必须了解,在SOA中,服务是可以响应请求的任何远程可用资源。一个Web服务是使用特定的协议来实现。为什么采用面向服务的架构?SOA解决了三个常见的企业挑战:快速响应业务变化。利用现有基础设施投资。支持与客户,合作伙伴和供应商互动的新渠道。企业基础结构在操作系统,应用程序,系统软件和应用程序基础结构之间是异构的。结果,许多企业系统由交付一系列相互依赖的服务的复杂且不一致的应用程序组成。运行当前业务流程的现有应用程序至关重要,因此从头开始或对其进行修改是一个微妙的主张。但是企业必须能够修改和扩展技术基础架构,以满足业务需求。SOA和微服务微服务是从SOA演变而来的一种架构样式。两者都是分布式体系结构,并且都提供解耦的范例。面向服务的架构在基础架构上比较繁重,而微服务则提供了更加灵活,轻量级的开发风格。两者都有优点和缺点,并且都被广泛使用。一般而言,SOA由拥有资源以支持更多形式化的既定企业实施或维护。微服务通常吸引需要敏捷性的新组织或成长型组织。与单块架构相比,SOA的松散耦合性质使它可以相对无缝地插入新服务或升级现有服务以满足新业务需求。它还提供了使服务可跨不同渠道使用以及将旧版应用程序作为服务公开的选项,从而保护了基础架构投资。由于它们是松散耦合的,因此可以在不影响其他组件的情况下更改SOA组件。组件也可以以标准化的方式添加到体系结构中,并且可以缩放以解决负载问题。例如,考虑企业如何使用一组现有应用程序来创建新的复合供应链应用程序。尽管现有应用程序是异构的,并且分布在各种系统中,但是它们的功能是使用标准接口公开和访问的。图1.面向服务的体系结构中的供应链应用程序SOA的关键特性SOA可以很简单,就像一个组件消耗另一个组件所提供的服务一样,也可以复杂到像通过MuleSoft的ESB之类的企业服务总线进行交互的一系列组件一样复杂。无论规模如何,成功实现SOA的关键是使用尽可能少的复杂性来实现您的目标。您的第一个也是最后一个问题应该始终是:此设计是否满足我们的业务需求?无论规模或复杂程度如何,面向服务的体系结构的模式大致相同:服务提供商公开端点并描述每个端点处的可用操作。服务使用者发出请求并使用响应。服务提供商生成消息以处理请求。实施面向服务的架构要实现SOA,您将从基本服务体系结构开始,然后提供基础结构,含义协议和其他可实现通信和互操作性的工具。图2显示了典型的服务体系结构图。在此图中,三个使用者通过向企业服务总线发送消息来调用服务,企业总线将消息转换并路由到适当的服务实现。一个业务规则引擎集成在一个服务或在服务业务规则。一个服务管理层管理审计一样,计费和伐木活动。此体系结构中的组件是松散耦合的,因此可以将它们切换或更新,而对整个应用程序的影响相对最小。这使企业能够灵活地根据需要添加或更新业务流程。在大多数情况下,对单个服务的更改不会在很大程度上影响其他服务。SOAP与RESTful Web服务可以采用SOA样式并通过REST来实现它,例如使用JAX-RS API或Spring Boot Actuator,但是该讨论不在本文讨论范围之内。有关SOAP与RESTful Web服务的有用比较,请参见“SOAP vs REST vs JSON”。RESTful Web服务和与微服务关联的更轻量级样式之间也存在一些重叠。基于SOAP的Web服务使用SOAP实现的Web服务仍比RESTful Web服务或微服务实现更为严格,但比SOA早期的灵活性要强得多。在这里,我们只看基于SOAP的Web服务所需的高级协议。SOAP,WSDL和XSDSOAP,WSDL和XSD是基于SOAP的Web服务实现的基本基础结构。WSDL用于描述服务,而SOAP是用于在服务使用者和提供者之间发送消息的传输层。服务与使用XML Schema(XSD)正式定义的消息进行通信。您可以将WSDL视为服务的接口(类似于Java接口)。该实现是在Java类中完成的,并且跨网络的通信是通过SOAP进行的。从功能上讲,使用者将寻找服务,获取该服务的WSDL,然后使用SOAP调用该服务。Web服务安全在WS-I Basic Profile的2.0规范的地址信息的安全性。该规范专注于凭证交换,消息完整性和消息机密性。Web服务发现一旦成为Web服务发现的基石,UDDI(通用描述,定义和集成)便逐渐淡出历史。如今,通过端点URL以与其他任何服务相同的方式公开基于SOAP的Web服务是很常见的。例如,您可以使用JAX-WS服务端点接口及其@WebService和@WebMethod注释。构建和部署Web服务Java开发人员可以使用多种选项来构建和部署基于SOAP的Web服务,包括 Apache Axis2和Spring-WS。但是,Java标准是JAX-WS,即XML Web Services的Java API。JAX-WS的核心思想是创建Java类并对其进行注释以创建所需的工件。在幕后,JAX-WS使用了多个Java软件包,包括JAXB,这是一个用于将Java类绑定到XML的通用库。JAX-WS向开发人员隐藏了潜在的复杂性和协议,从而简化了定义和部署基于Java的SOAP服务的过程。诸如Eclipse之类的现代Java IDE 完全支持开发JAX-WS Web服务。JAX-WS规范也已选择在Jakarta EE中进行开发结论与RESTful Web服务或微服务相比,使用基于SOAP的Web服务实现的面向服务的体系结构需要更严格和正式的服务定义。但是,一些较大的组织仍然喜欢SOAP强制采用的更为正式的样式。许多大规模的遗留系统也基于SOAP构建,并且某些B2B和内部系统选择基于SOAP的Web服务来为其更正式定义的API合同。无论您是开发还是维护大型企业系统,了解SOA模式并能够评估实现该模式的选择都将为您的编程事业提供良好的服务。
2023年12月03日
0 阅读
0 评论
0 点赞
2023-12-03
墙裂推荐(一篇搞定java过滤器的文章)一篇搞定java过滤器的论文,一篇搞定Java过滤器,java referer,
Filter:过滤器引言我们可以通过使用前面的技术,做出一些简单的登陆注册以及配合数据库实现对数据增删改查的Demo,程序是基本运行起来了,但是却存在着一个重大的安全问题,那就登陆权限验证,一般来说登陆的正确流程是这样的:用户在客户端发出请求 -> 后台判断是否登录 -> 是则不限制,否则 跳转回登录页面,判断是否登录和我们前面所学习的 Header中获取referer再判断达从而到防盗链的效果有相似的感觉,就是起一个判断过滤的样子,而Filter则是一个更好的解决这样问题的技术,当然强大的功能不止这一点,下面我们就好好来说一说!(一) 过滤器概述过滤器,顾名思义就是起到过滤筛选作用的一种事物,只不过相较于现实生活中的过滤器,这里的过滤器过滤的对象是客户端访问的web资源,也可以理解为一种预处理手段,对资源进行拦截后,将其中我们认为的杂质(用户自己定义的)过滤,符合条件的放行,不符合的则拦截下来当然,过滤器既可以拦截request,也可以拦截返回的response,我们来看一张图(二) 第一个过滤器程序过滤器的本质就是一个实现了 Filter 接口的 Java 类我们先自己创建一个类,实现Filter接口(javax.servlet),重写其中的所有方法 @WebFilter("/*")public class FilterDemo1 implements Filter {public void destroy() {}public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {//放行代码 chain.doFilter(req, resp);}public void init(FilterConfig config) throws ServletException {}}我们先不探究其中的方法,我们先看一下如何配置filter(三) filter配置第一种:web.xml配置 <filter><filter-name>filterDemo1</filter-name><filter-class>package cn.ideal.web.filter.FilterDemo1</filter-class></filter><filter-mapping><filter-name>filterDemo1</filter-name><!-- 拦截路径 --><url-pattern>/*</url-pattern></filter-mapping>filter<filter-name></filter-name> :指定filter名字<filter-class></filter-class> :指定filter全类名(带包名)filter-mapping<filter-name></filter-name> :这里的标签是为了与上面filter中的名字对应,从而指向到对应的文件中<url-pattern></url-pattern> :设置filter所拦截的路径 ※ 这里决定了什么样的资源会被过滤器拦截处理拦截路径设置格式解释/test.jsp只有访问test.jsp这个资源的时候才会执行过滤器/test/*访问test下所有资源你的时候,执行过滤器*.jsp所有jsp格式的资源被访问的时候,执行过滤器/*任意资源被访问,均执行过滤器由于过滤器内设置的是比较通用的一些设置,所以一般来说使用 /* 这种格式,不过也可以根据需求情况选择拦截方式配置:dispatcher拦截方式配置也就是资源被访问的形式,有这么几个属性REQUEST:默认值,浏览器直接请求资源FORWARD:转发访问资源 : RequestDispatcher.forward();INCLUDE:包含访问资源 : RequestDispatcher.include();ERROR:错误跳转资源 : 被声明式异常处理机制调用的时候补充:声明式异常处理即:在web.xml中通过配置来确定不同的异常类型将如何被处理,最后跳转到哪个页面,也就是我们常常看到的一些404错误页面 <error-page><!--异常的类--><exception-type>xxx</exception-type><!--异常发生时跳转的页面--><location>xxx</location></error-page>第二种:使用注解配置与servlet相似的配置 ,我们可以指定它的名字和拦截路径 @WebFilter("filterName="FilterDemo1",urlPatters="/*")但是直接在类上声明注解,显然那我们是不需要指定其名字的,而通过查看源码又可以知道,urlPatters又可以被value指定,而value又可以省略,所以我们可以简写为 @WebFilter("/*")若想在filter注解中配置dispatcher,我们需要设置dispatcherTypes属性 @WebFilter(value = "/*",dispatcherTypes ={DispatcherType.FORWARD,DispatcherType.FORWARD} )(四) 过滤器的生命周期讲完了配置,下面我们就回归主题来说一说过滤器的生命周期,也就是上面实现接口而重写的那些方法们首先是 init(FilterConfig config) 方法和 void destroy() 方法,Servlet也有这两个方法,两者分别在服务器启动和关闭的时候被创建以及销毁,两者均执行一次,用于加载以及释放资源其实就这两个方法来说在Servlet的基础上还是很好理解的再者就是我们过滤器的核心方法了: void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)doFilter方法就是我们真正进行拦截的方法,通过前两个参数我们可以知道,不论是Request亦或是Respone我们都可以对其进行过滤操作,那么第三个参数是什么意思呢?我们打开FilterChain的源码 public interface FilterChain {void doFilter(ServletRequest var1, ServletResponse var2) throws IOException, ServletException;}嗯!FilterChain是一个接口,接口内也定义了一个doFilter方法,它存在的意义是什呢?这是一种链式结构,我们在这里称作过滤器链,其作用就是为了配置多个过滤器,多个过滤器下的执行流程是这样的那么,多个过滤器谁前谁后呢?这还与我们前面的配置有关注解配置:按照类名字符串比较,值小的先执行Eg:AFilterDemo 优先于 BFilterDemoweb.xml配置:<filter-mapping>中谁在上面,谁优先执行过滤器的简单执行流程执行过滤器执行放行后的资源,可能是下一个过滤器,也可能是web资源(JSP/Servlet)执行过滤器放行代码chain.doFilter(req, resp);下边的代码(五) Filter的应用(1) 登录权限验证我们前面的的知识已经能简单的满足我们对于登录以及简单注册的实现,但是如果我们知道地址,直接通过url访问一些 资源,很显然这是很不合理的,所以我们需要对登录状态进行验证,未登录则转发到的登录界面,登录则可以依据登录状态自由访问一些页面我们写一个简单的模拟程序,为了可读性,以及篇幅问题,我们省略数据库连接的部分,采用固定的密码这是index.jsp页面,也就是需要登录后才能放开访问权限的页面<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>$Title$</title></head><body><h1>这是首页,只有登录后才能查看</h1></body></html>这是login.jsp页面,也就是登录页面,非常简单<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>Title</title></head><body><form action="/web-test/loginServlet" method="post"><table><tr><td>用户名:</td><td><input type="text" name="username"></td></tr><tr><td>密码:</td><td><input type="password" name="password"></td></tr><tr><td><input type="submit" value="登录"></td></tr></table></form></body></html>我们创一个domain 包,写一个User实体,补充其get、set方法 package cn.ideal.domain;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;}@Overridepublic String toString() {return "User{" +"username=" + username + \ +", password=" + password + \ +};}}下面开始编写LoginServlet,也就是处理登录验证问题的代码 package cn.ideal.web.servlet;import cn.ideal.dao.UserDao;import cn.ideal.domain.User;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;@WebServlet("/loginServlet")public class LoginServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//设置编码 request.setCharacterEncoding("utf-8");//获取请求参数 String username = request.getParameter("username");String password = request.getParameter("password");//封装user对象 User loginUser = new User();loginUser.setUsername(username);loginUser.setPassword(password);UserDao dao = new UserDao();User user = dao.login(loginUser);if (user == null){//登陆失败 request.getRequestDispatcher("/failServlet").forward(request,response);}else{//登录成功 request.getSession().setAttribute("user",user);request.getRequestDispatcher("/index.jsp").forward(request,response);}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}}我们根据 user 是否等于 null来判断用户名密码是否正确,那么我们你就来写一下这个返回了一个User对象的login方法我们在dao层中创建一个UserDao类,正式一些的项目会写成接口的形式,在impl层中再写实现,为了掩饰我们简化这一步 package cn.ideal.dao;import cn.ideal.domain.User;public class UserDao {public User login(User loginUser) {//定义真实用户名密码(代替数据库读取) String trueUsername = "admin";String truePassword = "admin";if (loginUser.getUsername().equals(trueUsername) && loginUser.getPassword().equals(truePassword)) {//登陆成功 return loginUser;} else {return null;}}}关键来了,这也就是我们所讲的过滤器方法,这里所需要注意的就是 登陆成功后,记得写入状态request.getSession().setAttribute("user",user); package cn.ideal.web.filter;import javax.servlet.*;import javax.servlet.annotation.WebFilter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;@WebFilter("/*")public class LoginFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {HttpServletRequest request = (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) resp;//获取资源请求路径 String requestURI = request.getRequestURI();//排除包含登录确实所需要的资源,给予放行 if (requestURI.contains("/login.jsp") || requestURI.contains("/loginServlet")) {chain.doFilter(request,response);}else{//不包含,即验证用户是否已经登录 Object user = request.getSession().getAttribute("user");if (user != null){//登陆了,放行 chain.doFilter(request,response);}else{//没有登录,跳转回登录页面 request.getRequestDispatcher("/login.jsp").forward(request,response);}}}public void init(FilterConfig config) throws ServletException {}}(2) 敏感词过滤如果我们想要对用户提交的一些信息进行过滤,在servlet中进行一些代码的编写也算一种方法,但是最为合适的还是fiter,它更加通用,下面我们使用代理模式增强request从而使用filter进行敏感词的过滤我们就在刚才的index页面上加以修改 <%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>$Title$</title></head><body><h1>这是首页,只有登录后才能查看</h1><form action="/web-test/replaceServlet" method="post"><table><tr><td><input type="text" name="words"></td></tr><tr><td><input type="submit" value="敏感字检测"></td></tr></table></form></body></html>我们把传入的参数读取进来 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("UTF-8");String words = request.getParameter("words");System.out.println(words);} package cn.ideal.web.filter;import javax.servlet.*;import javax.servlet.annotation.WebFilter;import java.io.*;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.util.ArrayList;import java.util.List;@WebFilter("/*")public class ReplaceFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {//创建代理对象,增强getParameter ServletRequest proxy_req = (ServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//判断是不是getParameter方法 if (method.getName().equals("getParameter")){//获取返回值 String value = (String)method.invoke(req, args);if (value != null){for (String s : list){if (value.contains(s)){value = value.replaceAll(s,"***");}}}return value;}return method.invoke(req,args);}});chain.doFilter(proxy_req, resp);}private List<String> list = new ArrayList<String>();public void init(FilterConfig config) throws ServletException {try {//获取文件真实路径 ServletContext servletContext = config.getServletContext();String realPath = servletContext.getRealPath("/WEB-INF/classes/replace.txt");//读取文件 BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(realPath),"UTF-8"));//将每一行数据添加到list中 String line = null;while((line = br.readLine())!=null){list.add(line);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}结尾:如果内容中有什么不足,或者错误的地方,欢迎大家给我留言提出意见, 蟹蟹大家 !^_^如果能帮到你的话,那就来关注我吧!(系列文章均会在公众号第一时间更新)在这里的我们素不相识,却都在为了自己的梦而努力 ❤一个坚持推送原创Java技术的公众号:理想二旬不止
2023年12月03日
0 阅读
0 评论
0 点赞
2023-12-03
难以置信(java中枚举类的使用)java中枚举的用法总结,Java 中枚举类的使用,java intvalue用法,
在日常写项目时,很多数据字典常量都需要定义和使用,同时在 Java 面试中,枚举也是一个绕不开的话题,这篇文章就来详细介绍一下枚举的定义以及使用。01 什么是枚举类?枚举类型在 C# 或 C++ 、 java 、 VB 等一些编程语言中是一种基本数据类型而不是构造数据类型。而在C语言中则是一种构造数据类型。它用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。枚举类的定义就是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内,使用枚举可以很方便地定义数据常量、以及我们的使用。 02 为什么需要枚举类?举个简单的例子来说明一下~(1)出于类型安全考虑,没用枚举类之前,常用静态常量来表示。比如对于性别的表示:public static final int WOMAN = 0;public static final int MAN = 1;这种性别定义实际上是一个整数数据类型。首先,这些变量可用于加减运算,但我们通常不这么干。第二,含义不明确。我们调试的时候,最初将“男”输出,结果为1。因此,我们必须在前面寻找0的含义。尤其是当我们查看其他人的代码时会看不懂。而定义枚举类在类里面进行详细说明的话就能清楚得知含义。(2)代码更优雅。在大一点的项目中,可以使用数百个静态常量。如果它们都写在一个文件类里面的话,很容易造成命名混乱,程序也很难读取。(3)可以帮助我们定义所需的类型。枚举易于记忆和使用,相当于一个接口。使用时,只需封装内部数据类型并限制数据字段。此外,还可以为不同的枚举变量调用不同的处理方法(这可以通过实现枚举类的抽象方法来实现)。03 枚举类的定义和使用下面就定义一个试题类型的枚举类来帮助大家理解:/*** 试题类型 枚举类; 0 填空题、1 判断 题、2 单选题、3 多选题、4 简答题、5 问答题、6 论述题、7 计算题、8 画图题、9 其他题* @date 2022/08/30*/public enum TopicTypeEnum {/** 填空题 */FILL_IN_THE_BLANK(0, "填空题"),/** 判断题 */JUDGE(1, "判断题"),/** 单选题 */SINGLE_CHOICE(2, "单选题"),/** 多选题 */MULTIPLE_CHOICE(3, "多选题"),/** 简答题 */BRIEF_ANSWER(4, "简答题"),/** 问答题 */QUESTIONS_AND_ANSWERS(5, "问答题"),/** 论述题 */DISCUSS(6, "论述题"),/** 计算题 */COMPUTE(7, "计算题"),/** 画图题 *///最后一个类型必须要用分号结束DRAW_PICTURE(9, "画图题");/** 值 */private final Integer code;/** 名称 */private final String name;public static TopicTypeEnum getByCode(Integer code) {if (null == code) {return null;}for (TopicTypeEnum status : TopicTypeEnum.values()) {if (status.getCode().intValue() == code.intValue()) {return status;}}return null;}public static TopicTypeEnum getByName(String name) {for (TopicTypeEnum status : TopicTypeEnum.values()) {if (status.getName().equals(name)) {return status;}}return null;}public static List<NameCode> getNameCode() {return Stream.of(TopicTypeEnum.values()).map(item -> new NameCode(item.getCode(), item.getName())).collect(Collectors.toList());}TopicTypeEnum (Integer code, String name) {this.code = code;this.name = name;}public Integer getCode() {return code;}public String getName() {return name;}/*** @author lyy* @date 2022/06/14* @return 枚举对象数组*/public static List<Map<String, Object>> toList() {List<Map<String, Object>> list = new ArrayList<>();for (TopicTypeEnum item : TopicTypeEnum.values()) {Map<String, Object> map = new HashMap<>();map.put("code", item.getCode());map.put("name", item.getName());list.add(map);}return list;}一些枚举类的常用方法:valueOf():返回当前枚举类的name属性,如果没有,则throw new java.lang.IllegalArgumentException()。具体可以查看java.lang.Enum源码。values():返回包括所有枚举变量的数组。toString(),name():返回当前枚举类变量的name属性ordinal():枚举类会给所有的枚举变量一个默认的次序,该次序从0开始,是根据我们定义的次序来排序的。而ordinal()方法就是获取这个次序(或者说下标)。compareTo():返回两个次序相减后的结果。
2023年12月03日
0 阅读
0 评论
0 点赞
2023-12-03
原创(java中的运算符号)java运算符笔记,《Java基础知识》Java 运算符,java运算符,
计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。我们可以把运算符分成以下几组:算术运算符关系运算符位运算符逻辑运算符赋值运算符其他运算符算术运算符算术运算符用在数学表达式中,它们的作用和在数学中的作用一样。下表列出了所有的算术运算符。表格中的实例假设整数变量A的值为10,变量B的值为20:回到目录实例下面的简单示例程序演示了算术运算符。public class var { public static void main(String[] args) { int a = 10; int b = 20; int c = 25; int d = 25; System.out.println("a + b = " + (a + b) ); System.out.println("a - b = " + (a - b) ); System.out.println("a * b = " + (a * b) ); System.out.println("b / a = " + (b / a) ); System.out.println("b % a = " + (b % a) ); System.out.println("c % a = " + (c % a) ); System.out.println("a++ = " + (a++) ); System.out.println("a-- = " + (a--) ); // 查看 d++ 与 ++d 的不同 System.out.println("d++ = " + (d++) ); System.out.println("++d = " + (++d) ); } }以上实例编译运行结果如下:回到目录自增自减运算符1、自增(++)自减(--)运算符是一种特殊的算术运算符,在算术运算符中需要两个操作数来进行运算,而自增自减运算符是一个操作数。public class var { public static void main(String[] args) { int a = 3;//定义一个变量; int b = ++a;//自增运算 int c = 3; int d = --c;//自减运算 System.out.println("进行自增运算后的值等于"+b); System.out.println("进行自减运算后的值等于"+d); } }运行结果为:解析:int b = ++a; 拆分运算过程为: a=a+1=4; b=a=4, 最后结果为b=4,a=4int d = --c; 拆分运算过程为: c=c-1=2; d=c=2, 最后结果为d=2,c=22、前缀自增自减法(++a,--a): 先进行自增或者自减运算,再进行表达式运算。3、后缀自增自减法(a++,a--): 先进行表达式运算,再进行自增或者自减运算 实例:public class var { public static void main(String[] args) { int a = 5;//定义一个变量; int b = 5; int x = 2*++a; int y = 2*b++; System.out.println("自增运算符前缀运算后a="+a+",x="+x); System.out.println("自增运算符后缀运算后b="+b+",y="+y); } }运行结果为:关系运算符下表为Java支持的关系运算符表格中的实例整数变量A的值为10,变量B的值为20:实例下面的简单示例程序演示了关系运算符。public class var { public static void main(String[] args) { int a = 10; int b = 20; System.out.println("a == b = " + (a == b) ); System.out.println("a != b = " + (a != b) ); System.out.println("a > b = " + (a > b) ); System.out.println("a < b = " + (a < b) ); System.out.println("b >= a = " + (b >= a) ); System.out.println("b <= a = " + (b <= a) ); } }运行结果为:位运算符Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。位运算符作用在所有的位上,并且按位运算。假设a = 60,b = 13;它们的二进制格式表示将如下:A = 0011 1100B = 0000 1101-----------------A&b = 0000 1100A | B = 0011 1101A ^ B = 0011 0001~A= 1100 0011下表列出了位运算符的基本运算,假设整数变量A的值为60和变量B的值为13:实例下面的简单示例程序演示了位运算符。public class var { public static void main(String[] args) { int a = 60; /* 60 = 0011 1100 */ int b = 13; /* 13 = 0000 1101 */ int c = 0; c = a & b; /* 12 = 0000 1100 */ System.out.println("a & b = " + c ); c = a | b; /* 61 = 0011 1101 */ System.out.println("a | b = " + c ); c = a ^ b; /* 49 = 0011 0001 */ System.out.println("a ^ b = " + c ); c = ~a; /*-61 = 1100 0011 */ System.out.println("~a = " + c ); c = a << 2; /* 240 = 1111 0000 */ System.out.println("a << 2 = " + c ); c = a >> 2; /* 15 = 1111 */ System.out.println("a >> 2 = " + c ); c = a >>> 2; /* 15 = 0000 1111 */ System.out.println("a >>> 2 = " + c ); } } 运行结果为:逻辑运算符下表列出了逻辑运算符的基本运算,假设布尔变量A为真,变量B为假实例下面的简单示例程序演示了逻辑运算符。public class var { public static void main(String[] args) { boolean a = true; boolean b = false; System.out.println("a && b = " + (a&&b)); System.out.println("a || b = " + (a||b) ); System.out.println("!(a && b) = " + !(a && b)); } }运行结果为:短路逻辑运算符当使用与逻辑运算符时,在两个操作数都为true时,结果才为true,但是当得到第一个操作为false时,其结果就必定是false,这时候就不会再判断第二个操作了。public class var { public static void main(String[] args) { int a = 5;//定义一个变量; boolean b = (a<4)&&(a++<10); System.out.println("使用短路逻辑运算符的结果为"+b); System.out.println("a的结果为"+a); } }运行结果为:解析: 该程序使用到了短路逻辑运算符(&&),首先判断 a<4 的结果为 false,则 b 的结果必定是 false,所以不再执行第二个操作 a++<10 的判断,所以 a 的值为 5。赋值运算符下面是Java语言支持的赋值运算符:实例简单示例程序演示了赋值运算符。public class var { public static void main(String[] args) { int a = 10; int b = 20; int c = 0; c = a + b; System.out.println("c = a + b = " + c ); c += a ; System.out.println("c += a = " + c ); c -= a ; System.out.println("c -= a = " + c ); c *= a ; System.out.println("c *= a = " + c ); a = 10; c = 15; c /= a ; System.out.println("c /= a = " + c ); a = 10; c = 15; c %= a ; System.out.println("c %= a = " + c ); c <<= 2 ; System.out.println("c <<= 2 = " + c ); c >>= 2 ; System.out.println("c >>= 2 = " + c ); c >>= 2 ; System.out.println("c >>= 2 = " + c ); c &= a ; System.out.println("c &= a = " + c ); c ^= a ; System.out.println("c ^= a = " + c ); c |= a ; System.out.println("c |= a = " + c ); } }运行结果为:条件运算符(?:)条件运算符也被称为三元运算符。该运算符有3个操作数,并且需要判断布尔表达式的值。该运算符的主要是决定哪个值应该赋值给变量。variable x = (expression) ? value if true : value if false实例public class var { public static void main(String[] args) { int a , b; a = 10; // 如果 a 等于 1 成立,则设置 b 为 20,否则为 30 b = (a == 1) ? 20 : 30; System.out.println( "Value of b is : " + b ); // 如果 a 等于 10 成立,则设置 b 为 20,否则为 30 b = (a == 10) ? 20 : 30; System.out.println( "Value of b is : " + b ); } }运行结果为:instanceof 运算符该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型)。instanceof运算符使用格式如下:( Object reference variable ) instanceof (class/interface type)如果运算符左侧变量所指的对象,是操作符右侧类或接口(class/interface)的一个对象,那么结果为真。下面是一个例子:String name = "James";boolean result = name instanceof String; // 由于 name 是 String 类型,所以返回真如果被比较的对象兼容于右侧类型,该运算符仍然返回true。看下面的例子:class Vehicle {} public class Car extends Vehicle { public static void main(String[] args){ Vehicle a = new Car(); boolean result = a instanceof Car; System.out.println( result); } }以上实例编译运行结果如下:trueJava运算符优先级当多个运算符出现在一个表达式中,谁先谁后呢?这就涉及到运算符的优先级别的问题。在一个多运算符的表达式中,运算符优先级不同会导致最后得出的结果差别甚大。例如,(1+3)+(3+2)*2,这个表达式如果按加号最优先计算,答案就是 18,如果按照乘号最优先,答案则是 14。再如,x = 7 + 3 * 2;这里x得到13,而不是20,因为乘法运算符比加法运算符有较高的优先级,所以先计算3 * 2得到6,然后再加7。下表中具有最高优先级的运算符在的表的最上面,最低优先级的在表的底部。尚学堂给同学们带来全新的Java300集课程啦!java零基础小白自学Java必备优质教程_手把手图解学习Java,让学习成为一种享受_哔哩哔哩_bilibiliwww.bilibili.com/video/BV1qL411u7eE?spm_id_from=333.337.search-card.all.click&vd_source=3117718bf474f48fd81d26049c0c97ac
2023年12月03日
0 阅读
0 评论
0 点赞
1
2
...
122