【问题标题】:Upgrading Spring from 3.0.5 to 3.2.18 - Resources like images, CSS and JS are not accessible将 Spring 从 3.0.5 升级到 3.2.18 - 无法访问图像、CSS 和 JS 等资源
【发布时间】:2020-11-11 06:34:10
【问题描述】:

我是 Spring 新手并开始从 3.0.5 升级到 3.2.18,我尝试修改版本并将工件 ID 更改为新版本(例如 org.springframework.core 到 spring-core,等)并在声明中将 XSD 版本从 3.0 更新到 3.2。我在 applicationcontext-security.xml 中遇到了一个拦截 URL 问题

<http auto-config="false" entry-point-ref="authenticationProcessingFilterEntryPoint" use-expressions="true">
<custom-filter position="FORM_LOGIN_FILTER" ref="authenticationProcessingFilter"/>
<custom-filter position="LAST" ref="loadUserContextFilter"/>
<logout logout-url="/static/j_spring_security_logout" logout-success-url="/login" />

<!-- Configure these elements to secure URIs in your application -->
....
...
..

<intercept-url pattern="/admin/campus/buildings/new" access="hasAnyRole('ROLE_RES.APP.CAMPUS.ADMIN_DEV','ROLE_RES.APP.CAMPUS.ADMIN_FULL')"/>
<intercept-url pattern="/admin/campus/buildings/*/sitesofservice/new" access="hasAnyRole('ROLE_RES.APP.CAMPUS.ADMIN_DEV','ROLE_RES.APP.CAMPUS.ADMIN_FULL')"/>
.....

<intercept-url pattern="/admin/**" access="hasAnyRole('ROLE_RES.APP.CAMPUS.ADMIN_FULL','ROLE_RES.APP.CAMPUS.ADMIN_DEV','ROLE_RES.APP.CAMPUS.ADMIN_DIFF')"/>
<intercept-url pattern="/batch/**" access="hasRole('ROLE_RES.APP.CAMPUS.ADMIN_BATCH')"/>
<intercept-url pattern="/resources/**" filters="none" access="permitAll" />
<intercept-url pattern="/static/**" access="permitAll" />
<intercept-url pattern="/**" access="permitAll" />

在上述文件中,filters="none" access="permitAll" /> 应用程序抛出异常。

引起:org.springframework.beans.factory.parsing.BeanDefinitionParsingException:配置问题:不再支持使用“filters='none'”。请为要排除的模式定义一个单独的元素并使用属性“security='none'”。

我尝试了不同的方法,删除了 filters="none" 并使用 security=none 创建了一个新的 http 属性,但它们都不起作用。

我提到了以下选项 https://www.baeldung.com/security-none-filters-none-access-permitAll#security-none 并添加了一个新的 http 元素,但仍然没有运气。

经过上述修改后,文件如下所示

<http pattern="/resources/**" security="none"/>
<http auto-config="false" entry-point-ref="authenticationProcessingFilterEntryPoint" use-expressions="true">
   ...
   ...

应用程序正在成功构建和部署,但没有加载图像、CSS 和 JS。日志中没有出现任何错误(我通过创建新的本地 tomcat 服务器来使用 IntelliJ 来部署和测试应用程序)

感谢任何帮助!

【问题讨论】:

  • 请说明您是如何在 html 中引用 css 或图像
  • 附加web-app结构在header.jspx中添加如下图片
  • 这很有帮助,但我想看看你是如何在 html 中编写&lt;link href="../styles/main.css" rel="stylesheet"&gt; 行代码的。 html文件也在哪个文件夹中?
  • 下面是 default.jspx 和 login.jspx 中的代码(文件位于 src/main/webapp/WEB-INF/layouts/

标签: spring spring-security upgrade javabeans spring-3


【解决方案1】:

试试这个,这对我来说很好用。我使用的是 SPring-Security 3.2 版本。

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns:security="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
                        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
                        http://www.springframework.org/schema/security 
                        http://www.springframework.org/schema/security/spring-security-3.1.xsd">

  
    <security:http pattern="/css/**" security="none"/>
    <security:http pattern="/login.jsp*" security="none"/>


    <security:http auto-config="true" access-denied-page="/denied.jsp" servlet-api-provision="false">
        <security:intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
        <security:form-login login-page="/login.jsp" authentication-failure-url="/login.jsp" default-target-url="/dashboard"/>
        <security:logout delete-cookies="true" logout-success-url="/login.jsp" logout-url="/j_spring_security_logout" invalidate-session="true"/>
        <security:session-management invalid-session-url="/login.jsp" session-authentication-error-url="/login.jsp" session-fixation-protection="newSession" />
    </security:http>

</beans:beans>

要访问jsp上的css什么的,有几种方法,其中一种是这样的:

首先在 JSP 文件中添加这个:

<%@ page isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

第二个是这样引用它:

<link href="<c:url value="/style/campus.css" />" rel="stylesheet" type="text/css" />

【讨论】:

  • 感谢您提供的信息,但仍然无法正常工作。您是否在 servlet 映射中有资源/** 映射或创建了单独的配置并添加到 web.xml 中
  • 不,我有 css、js、iamge 文件夹并添加了我的回答中提到的那些路径。
  • @SudheerDonaboina 根据图片,您的 css 文件位于 webapp 下而不是资源文件夹下。请检查...您是否遗漏了什么。如果它们在 webapp 文件夹下,那么这应该可以工作:
  • @SudheerDonaboina ...修改了我的答案...请试试这个。
【解决方案2】:

尝试使用:

&lt;link rel="stylesheet" href="${pageContext.request.contextPath}/styles/campus.css" /&gt;

【讨论】:

  • 感谢您的更新,它对我不起作用。我正在尝试直接访问它们并获得 404。我尝试使用静态并且它工作正常,不知道为什么资源不起作用。这是静态CamusWeb/static/styles/campus.css的路径
  • 我在 Spring Security 方面遇到了类似的问题,我从绝对路径切换到相对路径,它对我有用。让我们试试&lt;link rel="stylesheet" href="../styles/campus.css" /&gt;
  • 不走运 :( 当我们添加 ../ 时,它正在检查应用程序上下文之外的路径。localhost:8443/styles/campus.css
  • ok 听起来像是个线索,那&lt;link rel="stylesheet" href="styles/campus.css" /&gt; 呢?
【解决方案3】:

我看到的是,在您的 XML spring 配置文件中,您编写了 &lt;http pattern="/resources/**" security="none"/&gt;,但在图像中您显示的 css 和 js 位于 stylesjs 下,所以我会尝试这个 XML 配置:

<http pattern="/styles/**" security="none"/>
<http pattern="/js/**" security="none"/>

否则,您应该将 JS 和 CSS 移动到名为 resources 的文件夹下,但这意味着修改您用来调用这些资源的每个 JSP 或任何前端技术;影响会更大,但也许解决方案会更清洁

【讨论】:

    【解决方案4】:

    从安全的角度来看,唯一的要求就是 permitAll 您需要的所有资源(js、图像和样式)。

    您可以使用以下配置:

    <intercept-url pattern="/js/**" access="permitAll"/>
    <intercept-url pattern="/images/**" access="permitAll"/>
    <intercept-url pattern="/styles/**" access="permitAll"/>
    

    也许你已经这样做了,但如果不是这样,你可以使用 Spring MVC 提供的资源映射机制来提供静态内容。

    你可以在你的 MVC 配置中这样配置它:

    <mvc:resources mapping="/js/**" location="/js/" />
    <mvc:resources mapping="/images/**" location="/images/" />
    <mvc:resources mapping="/styles/**" location="/styles/" />
    

    然后,您只需要指向页面中的特定资源:

    <link href="<c:url value="/style/main.css" />" rel="stylesheet" type="text/css" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-21
      • 2019-09-14
      • 2016-07-24
      • 1970-01-01
      • 2011-08-02
      • 2021-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多