glassfish_重写到边缘–充分利用它! 在GlassFish上!

glassfish

现代应用程序开发的一个重要主题是重写。 自从Java Server Faces引入和Java EE 6中新的轻量级编程模型以来,您一直在努力使用漂亮,简单,可添加书签的URL。 PrettyFaces已有一段时间了,即使我可以说服它在3.3.3版本中被称为成熟版也是如此。

主要是因为我必须在xml中配置它。 如果您曾经做过JSF项目,那么您就会知道这是您稍后要做的事情。 或永远不会。 最后一个选项是我看到的很多东西。 重写将改变这种状况。 程序化,易于使用且高度可定制。 正是我想要的。

入门

从其中一个RedHat家伙那里获得的东西入门非常容易。 启动NetBeans,创建一个新的基于Maven的Webapp,将JSF和Primefaces添加到混合中并在GlassFish上运行。
向应用程序添加重写魔术的第一步是向项目添加重写依赖项。

<dependency><groupId>org.ocpsoft.rewrite</groupId><artifactId>rewrite-servlet</artifactId><version>1.1.0.Final</version></dependency>

这还不够,因为我将它与JSF一起使用,您还需要jsf-integration。

<dependency><groupId>org.ocpsoft.rewrite</groupId><artifactId>rewrite-integration-faces</artifactId><version>1.1.0.Final</version></dependency>

接下来实现您自己的ConfigurationProvider。 这是发生大多数魔术的核心部分。现在我们将其称为TricksProvider,我们还将扩展抽象的HttpConfigurationProvider。 一个简单的第一个版本如下所示:

public class TricksProvider  extends HttpConfigurationProvider
{@Overridepublic int priority(){return 10;}@Overridepublic Configuration getConfiguration(final ServletContext context){return ConfigurationBuilder.begin().addRule(Join.path("/").to("/welcomePrimefaces.xhtml"));}
}

现在,您必须注册您的ConfigurationProvider。 您可以通过将一个名为org.ocpsoft.rewrite.config.ConfigurationProvider的简单文本文件添加到应用程序/ META-INF / services /文件夹中来进行此操作。 向其添加ConfigurationProvider实现的标准名称,即可完成。 如果您启动应用程序。

重写基础

复制上述提供程序时,您隐式添加了第一个重写规则。 通过请求http:// host:8080 / yourapp /,您将直接转到NetBeans生成的Primefaces欢迎页面。 所有规则都基于相同的原则。 每个规则都由一个条件和一个运算组成。 类似“如果发生X,则执行Y”。 重写知道两种不同的规则。 一些预配置的(加入)以“ addRule()”开头,而流畅的接口以defineRule()开头。 这有点令人困惑,因为下一个主要版本将弃用defineRule()并将其重命名为addRule()。 因此,您发现的大多数示例(尤其是最新主干中的测试用例)都无法在1.1.0.Final中使用。
重写知道两个不同的方向。 入站和出站。 入站很有可能像您知道的每个重写引擎(例如mod_rewrite)一样工作。 请求到达并被转发或重定向到规则中定义的资源。 出站方向几乎没有。 它基本上在HttpServletRequest的encodeURL()方法中具有一个钩子,并重写您页面中的链接(如果它们完全在encodeURL的帮助下呈现的)。 JSF开箱即用。 如果您打算将其与JSP一起使用,则必须确保自己调用它。

用一些魔法将.html转发到.xhtml

让我们看一下您可以用重写做的一些事情。 首先,我们将以下内容添加到TricksProvider中:

.defineRule()
.when(Direction.isInbound()
.and(Path.matches("{name}.html").where("name").matches("[a-zA-Z/]+")))
.perform(Forward.to("{name}.xhtml"));

这是一条规则,用于检查入站请求,并检查所有与正则表达式模式[a-zA-Z /] +确认的补丁匹配{name} .html,并将其转发到{name} .xhtml文件。

如果执行此规则,则对http:// host:8080 / yourapp / something.html的所有请求最终都将转发到something.xhtml。 现在,您的用户将不再知道您在下面使用的是花哨的JSF内容,并相信您正在使用html :)如果请求的URL与正则表达式不匹配,例如,诸如http:// host:8080 / yourapp / something123.html根本不会转发,如果您的应用程序中没有something123.html,您最终将收到404错误。

重写出站链接

相反,您还可以添加以下规则:

.defineRule()
.when(Path.matches("test.xhtml")
.and(Direction.isOutbound()))
.perform(Substitute.with("test.html"))

您可以想象这在做什么,对吗? 如果您的facelet包含以下内容:

<h:outputLink value="test.xhtml">Normal Test</h:outputLink>

呈现给用户的链接将被重写为test.html。 这是您永远需要的出站链接的最基本操作。 大多数魔术都发生在入站链接上。 看到encodeURL()钩子的作用范围非常有限,这不足为奇。

OutputBuffer

重写中最令人惊讶的东西称为OutputBuffer。 至少直到我们正在使用的发行版为止。 它会在2.0中重命名,但现在让我们简单地看一下您可以做什么。 OutputBuffer是您对响应的了解。 在响应实际到达客户浏览器之前,您想对响应做什么。 考虑转换标记? 转换CSS? 甚至GZIP压缩? 太好了,这正是您所能做的。 让我们实现一个简单的ZipOutputBuffer

public class ZipOutputBuffer implements OutputBuffer {private final static Logger LOGGER = Logger.getLogger(ZipOutputBuffer.class.getName());@Overridepublic InputStream execute(InputStream input) {String contents = Streams.toString(input);LOGGER.log(Level.FINER, "Content {0} Length {1}", new Object[]{contents, contents.getBytes().length});byte[] compressed = compress(contents);LOGGER.log(Level.FINER, "Length: {0}", compressed.length);return new ByteArrayInputStream(compressed);}public static byte[] compress(String string) {ByteArrayOutputStream os = new ByteArrayOutputStream(string.length());byte[] compressed = null;try {try (GZIPOutputStream gos = new GZIPOutputStream(os)) {gos.write(string.getBytes());} compressed = os.toByteArray();os.close();} catch (IOException iox) {LOGGER.log(Level.SEVERE, "Compression Failed: ", iox);}return compressed;}
}

如您所见,我在弄乱一些流,并使用java.util.zip.GZIPOutputStream缩小此方法中接收到的流。 接下来,我们必须将相关规则添加到TricksProvider中:

.defineRule()
.when(Path.matches("/gziptest").and(Direction.isInbound()))
.perform(Forward.to("test.xhtml")
.and(Response.withOutputBufferedBy(new ZipOutputBuffer())
.and(Response.addHeader("Content-Encoding", "gzip"))
.and(Response.addHeader("Content-Type", "text/html"))))

入站规则(我们不愿意在此处重写页面中的链接..因此必须入站),该规则将ZipOutputBuffer添加到Response中。 还要注意额外的响应标头(两者),除非您想让浏览器抱怨我混在一起的内容:)就是这样。 现在,请求http:// host:8080 / yourapp / gziptest提供了具有GZIP压缩功能的te​​st.xhtml。 那是2,6KB和1.23 KB! 不到一半的尺寸! 使用流和byte []并不是很方便。 而且我不确定这是否可以在较大的页面大小上使用内存碎片,但是如果您没有压缩过滤器或者只需要压缩应用程序的单个部分,这是一个简单的解决方法。

通过重写增强安全性

但这还不是您能做的:您还可以通过重写来增强安全性。 林肯发表了关于用重写保护您的应用程序的精彩文章。 关于如何使用此功能,有很多可能的示例。 我提出了一个用例,在该用例中,不想使用欢迎文件功能,而是希望单独分派用户。 在执行此操作时,我还将检查他们的路径,并检查他们输入的内容是否恶意。 您可以使用.matches()条件或使用自定义约束来执行此操作。 将以下内容添加到TricksProvider中:

Constraint<String> selectedCharacters = new Constraint<String>() {@Overridepublic boolean isSatisfiedBy(Rewrite event,EvaluationContext context, String value) {return value.matches("[a-zA-Z/]+");}};

并定义以下规则:

.defineRule()
.when(Direction.isInbound()
.and(Path.matches("{path}").where("path").matches("^(.+)/$")
.and(Path.captureIn("checkChar").where("checkChar").constrainedBy(selectedCharacters))))
.perform(Redirect.permanent(context.getContextPath() + "{path}index.html"))

另一个入站修改。 检查该路径是否具有文件夹模式,并将其捕获到针对自定义约束进行检查的变量中。 大! 现在,您已经有了保存和轻松转发的机制。 现在,所有http:// host:8080 / yourapp / folder /请求都被重写为http:// host:8080 / yourapp / index.html。 如果您从上方查看其他规则,则将.html转发到.xhtml…就可以了!

底线

我很喜欢重写。 与配置prettyfaces的xml文件相比,这感觉要容易得多,在使用林肯和Christian的第一步中,我真的很享受Lincoln和Christian的支持。 我很好奇2.0即将推出的产品,我希望我能为规则配置获得更多调试输出,以便了解正在发生的事情。 默认值是空值,并且找到具有工作规则的条件的正确组合可能非常棘手。
寻找完整的资源? 在github上找到它们 。 很高兴阅读您的经历。

GlassFish部分在哪里?

哦耶。 我在标题中提到了吧? 那应该更像是默认值。 我正在使用最新的GlassFish 3.1.2.2运行所有程序,因此可以确保它可以正常运行。 NetBeans目前为7.2 ,如果尚未尝试,则应尝试一下。 我没有遇到任何与GlassFish相关的问题,我很高兴在此强调这一点。 做得好! 最后一句话:在疯狂地实现OutputBuffer之前,请看一下您最喜欢的应用服务器已经有什么库存。 GlassFish已经了解GZIP压缩 ,因此只需打开即可! 在这里实施之前,请三思而后行是一个好主意。

参考: 重写边缘-充分利用它! 在GlassFish上! 来自我们的JCG合作伙伴 Markus Eisele在Java的企业软件开发博客中。


翻译自: https://www.javacodegeeks.com/2012/08/rewrite-to-edge-getting-most-out-of-it.html

glassfish

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

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

相关文章

BZOJ 4557 JLOI2016 侦查守卫 树形dp

题目链接&#xff1a;https://www.lydsy.com/JudgeOnline/problem.php?id4557 题意概述&#xff1a; 给出一棵树&#xff0c;每个点付出代价w[i]可以控制距离和它不超过d的点&#xff0c;现在给出一些点&#xff0c;问控制这些点的最小代价是多少。 分析: 观察一下数据范围发现…

Java6上开发WebService

Java6上开发WebService 2010-01-23 16:19:00 标签&#xff1a;Java6 WebService 休闲 职场 版权声明&#xff1a;原创作品&#xff0c;如需转载&#xff0c;请与作者联系。否则将追究法律责任。 近日朋友问起Java开发WebService的问题&#xff0c;于是为其写了一份简单说明&…

在spring中该如何使用DTO,以及DTO和Entity的关系

1. DTO是用于将后台的数据结构&#xff08;javaBean&#xff09;转换为对用户友好的表现方式的数据结构&#xff0c;同时也能防止后台数据直接传送到前台而存在的潜在危险。 2. 可以时候要哪个springbot框架提供的转换器接口&#xff1a; org.springframework.core.convert.con…

带有Kafka和ZeroMQ的分布式类星体演员

因此&#xff0c;您已经有了使用actor的精美设计&#xff0c;选择了JVM和Quasar在该主题上的强大而忠实的观点。 所有明智的决定&#xff0c;但是在集群上进行分配时您有什么选择呢&#xff1f; 星系 Galaxy是一个非常酷的选择&#xff1a;快速的内存中数据网格&#xff0c;针…

JAVA中断线程的方法

JAVA中断线程的方法 Thread.stop, Thread.suspend, Thread.resume 和Runtime.runFinalizersOnExit 这些终止线程运行的方法已经被废弃&#xff0c;使用它们是极端不安全的&#xff01; 现在&#xff0c;如果你要安全有效地终止一个线程&#xff0c;应该采用以下这些方法&a…

最常见的Java异常及其对Java开发人员的评价

我知道我说在完成视频之前我不会张贴帖子&#xff0c;但这一直困扰着我。 至于视频的更新&#xff0c;我有些懒散&#xff0c;有些忙碌&#xff0c;但是我已经准备好记录第一集&#xff0c;这是我第一次有机会&#xff0c;而且我不需要太多的编辑。 无论如何&#xff0c;还是今…

日志系统设计

日志系统设计 2009-12-11 00:46:58| 分类&#xff1a; 技术 | 标签&#xff1a; |字号大中小 订阅 一、重要性日志系统在整个系统架构中的重要性可以称得上基础的基础&#xff0c;但是这一点&#xff0c;都容易被大多数人所忽视。因为日志在很多人看来只是printf。在系…

bzoj 1124 [POI2008]枪战Maf 贪心

[POI2008]枪战Maf Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 741 Solved: 295[Submit][Status][Discuss]Description 有n个人&#xff0c;每个人手里有一把手枪。一开始所有人都选定一个人瞄准&#xff08;有可能瞄准自己&#xff09;。然后他们按某个顺序开枪&#x…

核心API最佳实践——JDK日志分级

核心API最佳实践——JDK日志分级 时间:2005-10-29 08:00 来源:网管之家bitsCN.com 字体:[大 中 小]日志&#xff08;Log&#xff09;是什么&#xff1f;字典对其的解释是"对某种机器工作情况或某项任务进展情况的记载"。对于应用系统来说&#xff0c;日志就应该记录应…

20165234 《Java程序设计》第五周学习总结

第五周学习总结 教材学习内容总结 第七章 内部类与异常类 内部类内部类&#xff1a;在一个类中定义另一个类。 外嵌类&#xff1a;包含内部类的类&#xff0c;称为内部类的外嵌类。 内部类的类体中不能声明类变量和类方法。外嵌类的类体中可以用内部类声明对象&#xff0c;作为…

Java日志操作总结

Java日志操作总结 (2008-04-21 17:39:06)标签&#xff1a; 杂谈 . 使用Jakarta Commons Logging(JCL) 1.1. 概述 Apache的开源日志组件Jakarta CommonsLogging(JCL)提供的是一个日志(Log)接口(Interface)&#xff0c;同时兼顾轻量级和不依赖于具体的日志实现工具。它提供给中…

4-2日装饰器,带参数的装饰器

1&#xff0c;函数的有用信息 from functools import wraps#引用模块 def wrapper(f): # f func1wraps(f)def inner(*args,**kwargs): #聚合#args &#xff08;1,2,3&#xff09;执行函数之前的相关操作ret f(*args,**kwargs) # 打散 1,2,3执行函数之后的相关操作return re…

Apache Storm:如何使用Flux配置KafkaBolt

微型框架中的助焊剂可以帮助我们定义和部署Storm拓扑。 Flux有各种包装器&#xff0c;可帮助您定义所需的流并初始化Bolts和Spouts&#xff08;使用带有或不带有参数的构造函数&#xff0c;并通过反射自动调用自定义配置方法&#xff09;。 您只需要使用Flux就是将其作为依赖…

java 获取当前函数名

import java.text.SimpleDateFormat; import java.util.Date; /** * Java实现类似C/C中的__FILE__、__FUNC__、__LINE__等,主要用于日志等功能中。 * * version 1.0 2011-07-13 * */ public abstract class CommonFunction { /** * 打印日志时获取当前的程序文件名、行号、方法…

美国华尔街拥抱区块链是最大的威胁

Overstock的首席执行官帕特里克伯恩宣布证券交易委员会已批准其计划在区块链上发行股票&#xff0c;该区块链是推动比特币数字货币的巨大在线分类账。 这是一个重要的时刻。至少在理论上&#xff0c;区块链可以更有效&#xff0c;准确和公开地跟踪股票&#xff0c;债券和其他金…

java枚举和枚举类_Java枚举:您拥有优雅,优雅和力量,这就是我所爱!

java枚举和枚举类当Java 8即将面世时&#xff0c;您确定您对Java 5中引入的枚举很熟悉吗&#xff1f; Java枚举仍然被低估了&#xff0c;很可惜&#xff0c;因为它们比您想象的要有用&#xff0c;它们不仅仅用于通常的枚举常量&#xff01; Java枚举是多态的 Java枚举是可以包…

Java关键字final、static使用总结

Java关键字final、static使用总结 一、final 根据程序上下文环境&#xff0c;Java关键字final有“这是无法改变的”或者“终态的”含义&#xff0c;它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变&#xff1a;设计或效率。 final类不能被继承…

【SpringCloud】第五篇: 路由网关(zuul)

前言: 必需学会SpringBoot基础知识 简介: spring cloud 为开发人员提供了快速构建分布式系统的一些工具&#xff0c;包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单&#xff0c;可以在开发人员的电脑上跑。 工具:…

ubuntu shell简介

ubuntu shell简介 (2012-03-13 19:48:09) 标签&#xff1a; 杂谈 分类&#xff1a; 虚拟机下的ubuntu8.04 1.什么是shell&#xff1f; shell是接受用户或应用层的命令&#xff0c;并将这些命令解释给底层的系统内核层&#xff0c;由这些内核完成相应的工作&#xff0c;并将结果…

如何更新Jenkins作业发布config.xml

最近&#xff0c;我想更新Cloudbees中的一些作业&#xff08;未使用DSL定义&#xff09;&#xff0c;为每个作业添加一些属性。 好吧&#xff0c;我在使其工作时遇到了一些麻烦&#xff0c;这是我的注意事项&#xff08;我使用的是Jenkins 1.651.2.1&#xff0c;但有可能它应与…