如何将<security:authentication>标签嵌入form:input的value属性中?
解决Spring表单输入框嵌入认证用户名的问题
这个问题很常见——因为JSP标签不能直接嵌套在另一个标签的属性值里,所以你直接把<security:authentication>放在<form:input>外面才会导致用户名显示在输入框下方。下面给你两种可行的解决办法:
方法一:直接使用EL表达式获取用户名
Spring Security会将当前认证用户的信息暴露给EL上下文,你可以直接在value属性中引用对应的EL表达式:
<form:input path="contactName" cssClass="form-control" placeholder="Enter your Contact Name please." value="${authentication.principal.username}"/>
这种方式最简洁,前提是你的JSP页面已经正确引入了Spring Security的相关配置,并且EL表达式可以正常访问authentication对象。如果这个表达式不生效,你也可以试试${pageContext.request.userPrincipal.name},这是Servlet标准的获取当前登录用户名的方式。
方法二:先将用户名存入页面变量再引用
如果你更习惯使用Spring Security的标签库,也可以先通过<security:authentication>标签把用户名存入一个页面变量,再在<form:input>的value中引用这个变量:
<!-- 先把用户名存到currentUsername变量里 --> <security:authentication property="principal.username" var="currentUsername"/> <!-- 引用变量作为输入框的value --> <form:input path="contactName" cssClass="form-control" placeholder="Enter your Contact Name please." value="${currentUsername}"/>
注意事项
如果你的<form:input>绑定的表单对象(也就是path对应的contactName属性)已经有初始值,那么Spring会优先使用path绑定的值,而不是value属性的值。如果希望默认显示用户名,你可以在控制器中初始化表单对象时,把contactName设置为当前登录用户的用户名,这样即使不设置value属性,输入框也会显示用户名。
内容的提问来源于stack exchange,提问作者AskirNik
相关产品推荐
相关产品推荐

