我正在使用Struts 2 + Tiles + Spring Security 3应用程序,但无法加载任何CSS,图像和脚本。他们的资源全部部署到“发布”文件夹中。该应用程序运行正常,但不加载任何这些程序。

这是我的Spring Security映射。资源位于/ static / images和/ static / css等之下,而jsp页面位于/ WEB-INF / pages /中。WEB-INF和static位于同一层次结构中。

<property name="securityMetadataSource">
        <security:filter-security-metadata-source>

            <security:intercept-url pattern="/admin/**"
                access="ROLE_ADMIN" />
            <security:intercept-url pattern="**/"
                access="ROLE_ANONYMOUS,ROLE_ADMIN" />

        </security:filter-security-metadata-source>
    </property>


在struts.xml或tile.xml中都没有对这些文件夹的引用,因为它们不是通过动作调用呈现的。

Web.xml看起来像这样:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
    /WEB-INF/classes/app-context.xml
    /WEB-INF/classes/security-context.xml
    </param-value>
</context-param>
<context-param>
    <param-name>org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG</param-name>
    <param-value>/WEB-INF/classes/tiles/tiles.xml</param-value>
</context-param>

<!-- =======================================================  -->
<!-- FILTER.                                                  -->
<!-- =======================================================  -->
<!--Spring Security filter -->
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>


<filter>
    <description>struts2</description>
    <display-name>struts2</display-name>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>

<filter>
    <description>action2-cleanup</description>
    <display-name>action2-cleanup</display-name>
    <filter-name>action2-cleanup</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
</filter>

 <filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<filter-mapping>
    <filter-name>action2-cleanup</filter-name>
    <url-pattern>/action2-cleanup</url-pattern>
</filter-mapping>

<filter-mapping>
    <filter-name>action2-cleanup</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<!-- =======================================================  -->
<!-- Listeners                                                -->
<!-- =======================================================  -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- <listener>
    <listener-class>org.apache.struts2.tiles.StrutsTilesListener</listener-class>

</listener> -->

<servlet>
<servlet-name>tiles</servlet-name>
<servlet-class>org.apache.tiles.web.startup.TilesServlet</servlet-class>

<load-on-startup>2</load-on-startup>


我正在尝试通过以下任意一种来加载图像,只是看它们是否加载:

<img src="<s:url value='./static/images/btn_add.gif' />"  />
<img src="<s:url value='/static/images/btn_add.gif' />"  />
<img src="../static/images/btn_add.gif"  />
<img src="../../static/images/btn_add.gif" />

<s:submit action="item_add" type="image"                src="./static/images/btn_add.gif" />


这些都不起作用。我尝试通过使用Firebug调试来尝试其他各种url,但仍然没有。

有人可以向我解释我所缺少的吗?我使用spring 3.0.5.Release版本,然后尝试使用3.0.3.Release版本。两者都不起作用。

没有错误。它只是不显示。是的,我确实清除了浏览器缓存,甚至尝试使用其他浏览器。

反馈之后::编辑1

嗯..那个stll没有做到。

我在输出中看到了这些:

2012-09-12 11:39:59,268 DEBUG [DefaultFilterInvocationSecurityMetadataSource.java:173] : Converted URL to lowercase, from: '/static/images/btn_add.gif'; to: '/static/images/btn_add.gif'


2012-09-12 11:39:59,270 DEBUG [DefaultFilterInvocationSecurityMetadataSource.java:200]:候选人为:“ / static / images / btn_add.gif”;模式是/ static / **;匹配=真
2012-09-12 11:39:59,271调试[AbstractSecurityInterceptor.java:191]:安全对象:FilterInvocation:URL:/static/images/btn_add.gif;属性:[ROLE_ANONYMOUS,ROLE_ADMIN]
2012-09-12 11:39:59,271调试[AbstractSecurityInterceptor.java:292]:先前已认证:org.springframework.security.authentication.AnonymousAuthenticationToken@52a05099:委托人:匿名;凭证:[受保护];已验证:true;详细信息:org.springframework.security.web.authentication.WebAuthenticationDetails@380f4:RemoteIpAddress:0:0:0:0:0:0:0:1;会话编号:978365092A5784AEBC711B8F588029A3;授予的权限:ROLE_ANONYMOUS
2012-09-12 11:39:59,272调试[AffirmativeBased.java:53]:选民:org.springframework.security.access.vote.RoleVoter@8efd67,返回:1
2012-09-12 11:39:59,272调试[AbstractSecurityInterceptor.java:213]:授权成功

什么是http名称空间? <security:http pattern="/static/**" security="none" />

这是我的安全XML名称空间:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/security
        http://www.springframework.org/schema/security/spring-security-3.0.xsd">


安全性不允许使用“ http”属性。

最佳答案

由于您使用的是Spring Security,因此应确保为静态资产禁用安全性

<security:http pattern="/static/**" security="none" />


然后,您应该能够使用

<img src="<s:url value='/static/images/btn_add.gif' />"  />


第一次编辑时的备注:

http不是名称空间,security是。使用<http>元素(<security:http>)配置Web安全服务。
security是用于在spring xml配置文件中配置spring-security的命名空间,它引用http://www.springframework.org/schema/security和特定的xsd http://www.springframework.org/schema/security/spring-security-3.1.xsd(对于Spring 3.1)。

正如我们在您的日志中看到的那样,已正确考虑了过滤器,并且图像已由模式/static/**正确匹配,并且已授予访问权限,因此应进行渲染。

您可能要在spring 3.0.x的filters="none"元素上尝试使用http-intercept属性,因为在我阅读文档时,我不确定`是否对Spring 3.0.x有效,但仅对3.1+有效。

尝试使用(有关详细信息,请参见this page):

<http ...>
    <intercept-url pattern="/static/**" filters="none" />
</http>


如果这不起作用,是否可以使用Web开发工具在浏览器(例如Chrome)上检查加载给定图像的错误? 404未找到? 403未经授权?还有吗

10-05 21:20
查看更多