Tomcat中给静态资源添加缓存失效时间

本文介绍了如何在Tomcat服务器中为静态资源,如图片、JavaScript和CSS,设置缓存失效时间。通过修改conf/web.xml文件,添加ExpiresFilter并配置不同类型的资源过期策略,可以实现提高网站性能并控制资源更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

打开tomcat的conf目录下的web.xml文件

在</web-app>中加入以下代码

<filter>
     <filter-name>ExpiresFilter</filter-name>
     <filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class>
     <init-param>
        <param-name>ExpiresByType image</param-name>
        <param-value>access plus 10 minutes</param-value>
     </init-param>
  </filter>
  
  
  <filter-mapping>
     <filter-name>ExpiresFilter</filter-name>
     <url-pattern>/*</url-pattern>
     <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

即可

 

以上是给图片添加

如果需要给js和css添加,只需要在filter下写

 <init-param>
    <param-name>ExpiresByType text/css</param-name>
    <param-value>access plus 10 minutes</param-value>
 </init-param>
 <init-param>
    <param-name>ExpiresByType application/javascript</param-name>
    <param-value>access plus 10 minutes</param-value>
 </init-param>

 

<think>我们面对的问题是在Nginx与SpringShiro集成的项目中,为静态资源的跳转实现基于JSP的权限验证。我们需要结合Nginx的配置和SpringShiro的权限控制来实现这一目标。分析:1.通常,静态资源(如图片、CSS、JS文件)不需要经过权限验证,因为它们是公开的。但有时,我们可能希望对某些静态资源进行保护,例如只有特定权限的用户才能访问。2.在SpringShiro中,我们通常通过配置ShiroFilter来拦截URL,进行权限验证。但是,静态资源通常由Nginx直接处理,不会经过Spring应用服务器,因此Shiro无法拦截。解决方案思路:1.改变静态资源的访问方式,使其经过Spring应用服务器,这样Shiro就可以进行拦截。2.或者,在Nginx层实现权限验证,但这通常需要与后端进行交互来验证权限,实现起来相对复杂。我们这里采用第一种思路:将静态资源的访问通过Nginx转发给Spring应用服务器(例如Tomcat),然后在SpringShiro中配置对这些静态资源的拦截规则。步骤:一、Nginx配置调整:原本Nginx可能直接配置了静态资源的根目录,现在我们需要将需要权限验证的静态资源的请求转发给应用服务器。例如,假设我们要保护/download/目录下的静态资源,Nginx配置可能如下:原始配置(直接提供静态资源):location/download/{alias/path/to/static/files/;}修改后配置(将请求转发给应用服务器):location/download/{proxy_passhttp://tomcat-app;#将请求转发给Tomcat服务器proxy_set_headerHost$host;proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;}注意:这样配置后,所有/download/路径的请求都会转发给应用服务器,包括静态资源请求。二、SpringShiro配置:在SpringShiro的配置中,我们需要为/download/**的URL配置权限验证规则。例如,在Shiro的过滤器中添加:[urls]/download/**=authc,perms[download]#表示需要认证并拥有download权限这样,当用户请求/download/下的资源时,Shiro会要求用户登录并验证用户是否具有download权限。三、应用服务器处理静态资源:由于静态资源请求被转发到了应用服务器,我们需要在应用服务器中提供静态资源的访问。在Spring中,可以通过配置资源映射来实现。例如,在SpringMVC配置中(如果使用SpringBoot):@ConfigurationpublicclassWebConfigimplementsWebMvcConfigurer{@OverridepublicvoidaddResourceHandlers(ResourceHandlerRegistryregistry){registry.addResourceHandler("/download/**").addResourceLocations("file:/path/to/static/files/");}}这样,SpringMVC会处理/download/**的请求,并将其映射到本地文件系统的静态文件。四、JSP页面中的权限验证:在JSP页面中,我们可以使用Shiro标签库来控制显示内容。例如,只有具有download权限的用户才显示下载链接。首先,在JSP中引入Shiro标签库:<%@taglibprefix="shiro"uri="http://shiro.apache.org/tags"%>然后,使用标签控制:<shiro:hasPermissionname="download"><ahref="/download/somefile.pdf">下载文件</a></shiro:hasPermission><shiro:lacksPermissionname="download">您没有下载权限</shiro:lacksPermission>五、权限验证过程:当用户点击下载链接时,请求被转发到应用服务器,Shiro会进行拦截,验证用户是否登录以及是否拥有download权限。如果验证通过,则SpringMVC会将静态资源返回;否则,Shiro会重定向到登录页面或显示未授权页面。六、性能考虑:这样配置后,静态资源不再由Nginx直接处理,而需要经过应用服务器,可能会增加应用服务器的负担。因此,对于不需要权限验证的静态资源,仍然应该由Nginx直接处理。只需将需要保护的静态资源通过上述方式处理。总结:通过将需要权限验证的静态资源请求转发到应用服务器,然后通过Shiro进行权限控制,我们可以实现对静态资源的访问权限控制。同时,在JSP页面中,我们可以根据用户的权限来决定是否显示资源的下载链接。注意:由于静态资源文件可能会比较大,使用应用服务器传输可能会影响性能。因此,建议只对需要权限的小型静态文件采用这种方式。对于大文件,可以考虑使用Nginx的auth_request模块,但配置更为复杂。相关问题:1.如果我想在Nginx层实现权限验证,应该怎么做?2.如何优化上述方案中的静态资源传输性能?3.Shiro的权限标签在JSP中还有哪些用法?</think> ### 解决方案:在Nginx与Spring Shiro集成中为静态资源添加JSP权限验证 #### 1. **核心思路** - **问题关键**:Nginx默认直接处理静态资源请求,绕过Spring Shiro权限验证 - **解决方案**:修改Nginx配置,将静态资源请求转发给Spring应用服务器,通过Shiro的AOP代理进行权限拦截 - **技术路线**: ```mermaid graph TD A[用户请求] --> B[Nginx反向代理] B -->|静态资源请求| C[Spring应用服务器] C --> D[Shiro代理拦截] D -->|权限验证通过| E[返回静态资源] D -->|权限拒绝| F[跳转JSP错误页] ``` #### 2. **具体实现步骤** ##### 2.1 Nginx配置改造 ```nginx location ~* \.(jpg|css|js)$ { # 转发静态资源请求到Spring应用 proxy_pass http://spring_app_server; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; # 重要:携带session ID用于Shiro验证 proxy_cookie_path / /; } ``` ##### 2.2 Spring Shiro配置 ```java @Bean public ShiroFilterFactoryBean shiroFilter() { ShiroFilterFactoryBean filter = new ShiroFilterFactoryBean(); // 设置静态资源需权限验证 LinkedHashMap<String, String> filterChain = new LinkedHashMap<>(); filterChain.put("/static/**", "authc, perms[static_resource]"); filter.setFilterChainDefinitionMap(filterChain); return filter; } ``` ##### 2.3 JSP权限验证实现 ```jsp <%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> <shiro:hasPermission name="static_resource"> <!-- 显示受保护资源 --> <link href="/static/css/protected.css"> </shiro:hasPermission> <shiro:lacksPermission name="static_resource"> <!-- 无权限时显示错误页 --> <jsp:include page="/error/no_permission.jsp"/> </shiro:lacksPermission> ``` ##### 2.4 权限拦截优化(AOP代理实现) ```java @Aspect @Component public class StaticResourceAspect { @Around("@annotation(RequireStaticAccess)") public Object checkAccess(ProceedingJoinPoint pjp) throws Throwable { Subject subject = SecurityUtils.getSubject(); if(subject.isPermitted("static_resource")) { return pjp.proceed(); // 放行资源访问 } else { return "redirect:/error/no_permission.jsp"; // 跳转错误页 } } } ``` #### 3. **关键注意事项** 1. **会话一致性** Nginx需透传 `JSESSIONID` 到后端,确保Shiro能识别用户会话: ```nginx proxy_cookie_path / "/; HTTPOnly; SameSite=Lax"; ``` 2. **性能优化** - 静态资源缓存控制: ```java response.setHeader("Cache-Control", "max-age=86400"); ``` - 避免大文件经Spring代理,特殊资源采用独立域名直连 3. **细粒度控制** 在权限配置中支持正则表达式匹配: ```java filterChain.put("/static/confidential/*.pdf", "perms[confidential_access]"); ``` #### 4. **常见问题解决** - **静态资源403错误** 检查Shiro的URL匹配规则是否过于宽泛,调整过滤链顺序: ```java filterChain.put("/static/public/**", "anon"); // 公共资源放行 filterChain.put("/static/private/**", "authc"); // 私有资源验证 ``` - **权限不生效** 确保Spring的`@Transactional`方法被代理对象调用(需通过注入的Bean调用而非this调用)[^2] --- ### 相关问题 1. 如何处理Nginx直接缓存静态资源导致的权限失效问题? 2. 如何在Shiro中实现动态的静态资源权限规则? 3. 如何通过JSP标签控制不同用户看到的静态资源内容? 4. 大文件资源传输时如何避免Spring代理的性能瓶颈? 5. Shiro与Nginx集成时如何防止会话固定攻击?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值