我有一个包含大量文本输入的表单,其中10个我想使用带有Bloodhound的typeahead.js.我有两个工作 - 它们都包括预取和远程数据源.但是对于typeahead/Bloodhound的每个实例都有相当数量的jQuery代码,我很好奇是否有人试图"泛化"typeahead/Bloodhound来处理多个不同的输入元素,每个元素都有不同的数据源?它可能比它的价值更麻烦,但我有点担心页面必须加载的代码量.
我的环境是Spring/MVC,Hibernate(Oracle db),Bootstrap.
这是一个typeahead/Bloodhound实例的示例.它在函数中,因为我正在动态添加行的输入,所以我必须在添加新行后调用此函数以在该行的文本输入上启用typeahead.
function initIngredientsTA() {
//set the options
var ingredBH = new Bloodhound({
limit: 20,
datumTokenizer: function(datum) {
return Bloodhound.tokenizers.whitespace(datum.name);
},
queryTokenizer: Bloodhound.tokenizers.whitespace,
prefetch: {
url: '/myapp/resources/ingredients.json',
cache: false,
filter: function(data) {
console.log("data: " + data.ingredients);
return $.map(data.ingredients, function (ingredient) {
return {
id : ingredient.id,
name : ingredient.name
};
});
}
},
remote: {
url: '/myapp/recipe/addRecipe/getIngredients?searchStr=%QUERY',
cache: false,
wildcard: '%QUERY',
filter: function(data) {
console.log("data: " + data);
return $.map(data, function (data) {
return {
id …Run Code Online (Sandbox Code Playgroud) 我想为文本字段自定义错误消息,以包括输入的实际字符数。我已经能够使它起作用,但是对我的解决方案不满意,所以我想知道其他人为实现此目的做了什么。
字段注释(出于测试目的,限制为10-实际大小为150)
@Column(name = "NAME", nullable = false)
@Size(max=10)
private String name;
Run Code Online (Sandbox Code Playgroud)
message.properties
Size.person.name=Maximum is {1} characters
Run Code Online (Sandbox Code Playgroud)
JSP代码
<spring:bind path="person.name">
<c:set var="nameError">${status.errorMessage}</c:set>
<c:set var="nameDisplayValue">${status.displayValue}</c:set>
<c:set var="nameCode">${status.errorCode}</c:set>
</spring:bind>
<c:if test="${fn:contains(nameCode,'Size')}">
<c:set var="nameLen">${fn:length(nameDisplayValue)}</c:set>
<c:if test="${nameLen gt 0}">
<c:set var="nameError">${nameError += " (you entered " += nameLen += ")"}</c:set>
</c:if>
</c:if>
<div class="form-group col-sm-9 <c:if test="${not empty nameError}">has-error</c:if>">
<label class="control-label" id="nameLabel" for="inputName">Name:<c:if test="${not empty nameError}"> ${nameError}</c:if></label>
<form:input type="text" size="10" class="form-control" id="inputName" placeholder="Name" path="name" autocomplete="off"/>
</div>
Run Code Online (Sandbox Code Playgroud)
输出量
这对于一个字段是可以的,但是我正在处理的表单有10多个具有大小验证的字段。另外,form:input的size =“ 10”设置似乎并没有执行任何操作,即,您仍然可以输入10个以上的字符。
我知道一种选择是编写一个自定义验证器,但这似乎对我想做的事来说太过分了。另一个方法是在发布表单之前捕获错误,但是我试图保留所有验证服务器端。任何建议将不胜感激。
我花了最近3-4天的时间与Spring Security(4.0.2)一起工作,并且由于倾注了Spring Security样本,SO和其他博客上的大量帖子,我已经能够使用它.
然而,正如我一直在尝试不同的选项,我已经被困扰了几个小时,将sessionManagement添加到HttpSecurity.似乎选项的顺序很重要,我真的很好奇为什么会这样,以及为什么它似乎没有在Spring Security文档中的任何地方提及,或者我能找到的任何其他地方?
例如,如果先放置sessionManagement,那么下一个配置(本例中为authorizeRequests,但下一个配置无关紧要)会在下面的代码示例中注明语法错误
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.sessionManagement()
.invalidSessionUrl("/login?invalid=1")
.maximumSessions(1)
.expiredUrl("/login?time=1")
.maxSessionsPreventsLogin(true);
.authorizeRequests() //<<< The method authorizeRequests() is undefined for the type SecurityConfig
.antMatchers("/", "/home", "/login**", "/thankyou").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.failureUrl("/login?err=1")
.permitAll()
.and()
.logout()
.logoutSuccessUrl("/thankyou")
.deleteCookies( "JSESSIONID" )
.invalidateHttpSession(false);
}
Run Code Online (Sandbox Code Playgroud)
似乎sessionManagement必须是最后一个配置.为什么?
此外,一旦我将sessionManagement放在最后,它就会使invalidSessionUrl方法的位置不同.我最初使用语法错误,如下所示:
.sessionManagement()
.maximumSessions(1)
.expiredUrl("/login?time=1")
.maxSessionsPreventsLogin(true)
.invalidSessionUrl("/login?invalid=1");
//<<< The method invalidSessionUrl(String) is undefined for the type SessionManagementConfigurer<HttpSecurity>.ConcurrencyControlConfigurer
Run Code Online (Sandbox Code Playgroud)
几个小时后,我发现invalidSessionUrl和maximumSessions是SessionManagementConfigurer的方法,expiredUrl和maxSessionsPreventsLogin属于SessionManagementConfigurer.ConcurrencyControlConfigurer,代码编译的唯一方法是在 SessionManagementConfigurer方法之后放置ConcurrencyControlConfigurer 方法.
再一次,我真的很想知道为什么所以我可以警惕这种事情,因为我学习了其他的Spring接口.换句话说,我真的想知道这里是否涉及到一个建筑设计或编程约定,我还没有意识到它是Spring的新手.
顺便说一下,Rob Winch的网络研讨会非常有帮助!如果有人有兴趣,这里是链接:网络研讨会重播:Spring Security …
我真的想了解Spring Security是如何工作的,但此刻我有点失落.这是一个简单的场景:
SecurityContextPersistenceFilter 记录没有SecurityContext可用,将创建一个新的AnonymousAuthenticationFilter 使用匿名标记填充SecurityContextHolderSecurityContextPersistenceFilter 再次记录没有SecurityContext可用,并将创建一个新的AnonymousAuthenticationFilter 再次使用匿名标记填充SecurityContextHolderSessionManagementFilter 请求会话ID为C2A35ED5A41E29865FF53162B0024D52的日志无效SessionManagementFilter 记录它正在开始一个新会话并重定向到/ invalidsession这些页面配置为.authorizeRequests().antMatchers("/","/home","/about").permitAll(). 我打开了无效会话选项以处理经过身份验证的用户:.sessionManagement().invalidSessionUrl("/errors/invalidSession").如果我注释掉该选项,那么上面描述的所有内容都与步骤#10完全相同 - SessionManagementFilter看到所请求的会话ID无效(#9)但不启动新会话并执行重定向(#10).
为什么?如何保持无效会话选项但正确处理匿名用户,即不重定向?或者这是不可能的,我将不得不单独处理经过身份验证的用户?如果有人能帮助我理解这里发生的事情并指出我解决这个问题的方向,我将非常感激.如果您需要查看我的完整http配置,请告诉我.
编辑
我与匿名和注册(经过身份验证)的用户进行了一系列测试.如果 .sessionManagement().invalidSessionUrl("/errors/invalidSession")启用,则两种类型的用户最终都会到达错误页面.未选中RememberMe的经过身份验证的用户与匿名用户相同.如果选中了RememberMe,则在RememberMe超时后会出现错误页面.
如果我禁用无效会话选项,则没有用户获得错误页面(这是有意义的).两种类型的用户都可以浏览公共页面,只要他们想要,并且会话或RememberMe过期后将要求经过身份验证的用户登录.
如果您对此处涉及的代码感兴趣,请参阅 SessionManagementFilter
if (invalidSessionStrategy != null) {
invalidSessionStrategy
.onInvalidSessionDetected(request, response);
return;
}
Run Code Online (Sandbox Code Playgroud)
如果.sessionManagement().invalidSessionUrl启用,SimpleRedirectInvalidSessionStrategy则调用默认方法,该方法执行以下代码:
if (createNewSession) {
request.getSession();
}
redirectStrategy.sendRedirect(request, response, destinationUrl);
Run Code Online (Sandbox Code Playgroud)
的createNewSession布尔可设置通过setCreateNewSession(boolean createNewSession),其被描述为:
确定是否应在重定向之前创建新会话(以避免可能的循环问题,其中使用重定向的请求发送相同的会话ID).或者,确保配置的URL不通过
SessionManagementFilter.
所以,在我看来,它.sessionManagement().invalidSessionUrl最适合所有页面都经过身份验证的网站.我正在查看的选项是在SessionManagementFilter检查页面访问权限之前放置的自定义过滤器,并根据需要打开/关闭"createNewSession"或关闭无效会话选项并在其他地方处理经过身份验证的页面(?).我也偶然发现<%@ page session=“false” %>了这个问题 - …
我想在系统关闭前5分钟在特定页面上显示警告消息。我没有手动将其添加到这些页面中,而是使用@ModelAttribute方法创建了一个@ControllerAdvice类,该方法将消息添加到Model参数中,但是据我了解的阅读文档和SO以及对该模型属性的一些初步测试,我们将其添加到每个带有@RequestMapping的方法。
我意识到我可以重构代码,以使目标方法都集中在一个控制器中,并将@ControllerAdvice限制在该控制器中,但是最后我在该控制器中得到了其他不相关方法的集合,这使整个结构变得混乱我的控制器。
那么,有没有办法指出@ModelAttribute应用于多个控制器中的哪个特定方法?自定义注释是否可以解决(不确定如何工作)?如果可能的话,我想通过注释来做到这一点。
编辑:
@ControllerAdvice代码非常基本:
@ControllerAdvice
public class GlobalModelController {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private MaintenanceInterceptor maintInterceptor;
@ModelAttribute()
public void globalAttributes(Model model, Locale locale) {
if (maintInterceptor.isMaintenanceWindowSet() && !maintInterceptor.isMaintenanceInEffect()) {
String msg = maintInterceptor.getImminentMaint(locale);
model.addAttribute("warningMaint", msg);
logger.debug("maint msg= " + msg);
}
}
}
Run Code Online (Sandbox Code Playgroud) 有没有人想出一种方法来替换Datatable的bootstrap css样式使用的glyphicon排序箭头与原始的上/下三角形而不会破坏dataTable.bootstrap.css文件?对于基本相同的问题,jquery DataTables:奇怪的排序箭头,接受的答案是完全丢弃引导样式.
到目前为止,我能够做到这一点的唯一方法是注释掉dataTable.bootstrap.css的相关部分,并将dataTables.foundation.css中的原始样式添加到我自己的样式表中.这显然不是一个很好的解决方案,绝对不是最佳实践!
两年前在这里讨论了这个主题,将箭头改为三角形 - 表#5209,但没有同意将它们改回来,所以我们留下了glyphicon,我个人认为这些不是视觉上的在DataTable标题的上下文中吸引人.
有什么建议?
css ×1
datatables ×1
hibernate ×1
jquery ×1
spring ×1
spring-4 ×1
spring-mvc ×1
typeahead.js ×1
validation ×1