我正在开发基于Spring和JSF 2.0的应用程序.需要记住特定IP地址的客户端在过去3分钟内尝试提交表单的次数.如果在3分钟内记录了超过3次提交尝试,则应显示验证码.
我正在考虑使用ConcurrentMap<String, ConcurrentLinkedQueue<Long>>存储ip地址(String)并在queue(ConcurrentLinkedQueue<Long>)中提交时间(milis ).Quartz将以3分钟的间隔清理队列(将删除3分钟以上的milis).要检查是否显示验证码,我将检查队列大小是否> 3.
这是正确的方法吗?你有更好的想法吗?
在我的JSF复合组件中有一个示例要实现:
<h:inputText id="name" value="#{cc.attrs.value.name}" styleClass="#{(component.valid) ? 'required' : 'required invalid'}" validatorMessage="bad name" requiredMessage="name required" immediate="true" required="true">
<f:validateRegex pattern="^[\p{L}' ]{2,19}$" />
<f:ajax event="blur" execute="name" render="name testPanel" immediate="true"/>
</h:inputText>
<h:inputText id="surname" value="#{cc.attrs.value.surname}" styleClass="#{(component.valid) ? 'required' : 'required invalid'}" validatorMessage="bad surname" requiredMessage="surname required" immediate="true" required="true">
<f:validateRegex pattern="^[\p{L}' ]{2,19}$" />
<f:ajax event="blur" execute="name" render="surname testPanel" immediate="true"/>
</h:inputText>
<h:panelGroup id="testPanel" styleClass="#{(!name.valid || !surname.valid) ? 'warning' : 'none'}">
<h:message id="msgName" for="name" showSummary="true" showDetail="false" />
<h:message id="msgSurname" for="surname" showSummary="true" showDetail="false" />
</h:panelGroup>
Run Code Online (Sandbox Code Playgroud)
问题是如何在“ testPanel”上评估名称或姓氏是否有效/无效。我希望消息“ msgName”和“ msgSurname”都用样式化的跨度(HTML输出)包装,如果没有“名称”或“姓氏”的错误消息,则不会出现。
任何帮助表示赞赏:)
我想在我的JSF 2应用程序中做的是根据浏览器版本设置正确的html样式,这里是示例代码:
<!--[if lt IE 7]> <html class="lt-ie9 lt-ie8 lt-ie7" lang="en"> <![endif]-->
<!--[if IE 7]> <html class="lt-ie9 lt-ie8" lang="en"> <![endif]-->
<!--[if IE 8]> <html class="lt-ie9" lang="en"> <![endif]-->
<!--[if gt IE 8]><!--> <!--<![endif]-->
Run Code Online (Sandbox Code Playgroud)
如何在JSF 2中做到这一点?什么是最好/最简单的方法?
我在Omnifaces(o:conditionalComment)中发现了一些有趣的东西,但它只允许有条件地加载整个css,这对我来说是无用的......