【问题标题】:Adding spring library for usage of JSP Taglibs for security in Freemarker在 Freemarker 中添加 spring 库以使用 JSP Taglibs 以实现安全性
【发布时间】:2012-08-22 09:00:36
【问题描述】:

我使用带有 freemarker 的 spring 作为模板引擎。 Freemarker 允许使用 Jsp Taglibs,例如,通过添加

    <#assign security=JspTaglibs["http://www.springframework.org/security/tags"] />

到模板,例如允许我使用什么

    <@security.authorize ifNotGranted="ROLE_ADMIN">
        whatever
    </@security.authorize>

但是,Spring/Freemarker 找不到标签库,除非它们被添加到类路径中,所以我添加了

    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-taglibs</artifactId>
        <version>${spring.version}</version>
    </dependency>

到我项目中的 pom.xml。

但无论如何,标签都找不到!我必须将 spring-security-taglibs.jar 添加到 WEB-INF/lib 文件夹中才能找到标签。

有人知道为什么必须将 jar 显式添加到 lib 文件夹中吗?就我而言,为什么它们没有被tomcat找到?

编辑@ddekany

谢谢。 stacktrace如下,如果spring-security-taglibs.jar没有复制到WEB-INF/lib目录下

    No mapping defined for http://www.springframework.org/security/tags 
    The problematic instruction: ---------- ==> assignment: 
            security=JspTaglibs["http://www.springframework.org/security/tags"] 
            [on line 12, column 1 in home.ftl] in user-directive content.main 
            [on line 8, column 9 in home.ftl] in user-directive layout.global 
            [on line 2, column 1 in home.ftl] 
    ---------- Java backtrace for programmers: ----------      
    freemarker.template.TemplateModelException: 
            No mapping defined for http://www.springframework.org/security/tags at         
    freemarker.ext.jsp.TaglibFactory.get(TaglibFactory.java:180) at 
    ...

【问题讨论】:

  • 我认为您应该在问题中包含确切的错误消息。另外,我不认为 JSP 规范说明它使用 current(?) 类加载器等来查找 taglibs (tld-s),但我可能错了在那。

标签: spring security jsp freemarker taglib


【解决方案1】:

万一其他人遇到这种情况...

您需要添加弹簧支持文件,如此处所述(只是一些剪切和粘贴)http://static.springsource.org/spring-webflow/docs/2.2.x/reference/html/ch13s09.html

然后添加一些依赖:

<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-taglibs</artifactId>
  <version>2.0.0</version>
</dependency>
<dependency>
  <groupId>org.springframework.webflow</groupId>
  <artifactId>spring-faces</artifactId>
  <version>2.3.1.RELEASE</version>
</dependency>

假设您已经完成了其他所有工作,您现在应该能够将 taglib 添加到您的页面中。例如:

xmlns:sec="http://www.springframework.org/security/tags"


用户您好


*必须添加一个空格 b/f 'sec' 才能发布它

【讨论】:

  • 具有spring-faces 的 Spring 的最后一个版本是 2.4.1。
【解决方案2】:

使用这个 Maven 依赖项:

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</artifactId>
    <version>3.2.5.RELEASE</version>
</dependency>

org.springframeworkorg.springframework.security 是不同的框架,版本号不同。

【讨论】:

    【解决方案3】:

    您是否按照herehere 的说明添加了JspSupportServlet

    [编辑] 在仔细阅读您的帖子后,我建议您阅读JSP specification 中的“JSP.7.3.2”(及以后)部分。

    【讨论】:

    • 是的,我已按照您的建议添加了JspSupportServlet,但错误仍然相同。查看JSP specification 中的“JSP.7.3.2”部分,我猜的基本部分是:“TLD 资源路径相对于 Web 应用程序的根进行解释,应该直接解析为 TLD 文件或 JAR在 META-INF/taglib.tld 位置具有 TLD 文件的文件”。这是tomcat找不到META-INF/*.tld文件的答案吗?因为它是我通过 maven 依赖包含它的?
    • META-INF/*.tld 文件是从 jar 文件中加载的。 jar 文件需要位于 WEB-INF/lib 的类路径中。如果没有找到,则没有 J2EE 容器将加载 tld。
    • 好的,我明白了,但是为什么将maven依赖添加到spring taglib库还不够呢?可以在thisthis 示例中看到类似的内容?
    • 这只能意味着您的 maven 项目设置错误。当我在 Maven 中创建一个“战争”项目时,它总是将库放在 web-inf/lib 文件夹中。
    猜你喜欢
    • 1970-01-01
    • 2019-01-12
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 2015-09-19
    • 2012-01-15
    相关资源
    最近更新 更多