javaweb 过滤器 静态资源
时间: 2023-10-24 18:09:04 浏览: 203
JavaWeb 过滤器可以拦截所有请求,并对请求进行处理。但是,静态资源(如图片、CSS、JavaScript 文件等)一般不需要进行处理,因为它们本身就是静态的,不需要额外的操作。
为了避免过滤器对静态资源进行处理,可以在过滤器中设置一个路径过滤规则,只对需要处理的请求进行过滤,而对静态资源请求不进行处理。
例如,可以在过滤器中添加以下代码,对所有以“.css”、“.js”、“.png”等后缀结尾的请求不进行处理:
```
String[] staticExts = {".css", ".js", ".png", ".jpg", ".jpeg", ".gif", ".bmp", ".ico"};
String uri = req.getRequestURI();
for (String ext : staticExts) {
if (uri.endsWith(ext)) {
chain.doFilter(request, response);
return;
}
}
```
这样,在过滤器处理请求时,如果请求的 URI 以以上后缀结尾,就不会对其进行处理,直接交给下一个过滤器或 Servlet 进行处理。
相关问题
javaweb使用过滤器设置静态资源缓存
在Java Web中,可以通过使用过滤器来设置静态资源的缓存。具体步骤如下:
1. 创建一个过滤器类,实现javax.servlet.Filter接口。在该类中,可以重写Filter接口的init()、doFilter()和destroy()方法。
2. 在doFilter()方法中,判断请求的资源是否为静态资源,如果是,则设置缓存。
3. 设置缓存的方法是通过设置响应头信息来实现的。在响应头中,可以设置Cache-Control、Expires和Last-Modified等属性,具体含义如下:
- Cache-Control:设置缓存的控制策略,可以设置为max-age=n(缓存时间)或no-cache(不缓存)等。
- Expires:设置缓存的过期时间,可以设置为一个具体的日期时间,如“Sat, 01 Jan 2022 00:00:00 GMT”。
- Last-Modified:设置资源的最后修改时间,可以设置为一个具体的日期时间,如“Thu, 01 Jan 1970 00:00:00 GMT”。
例如,设置缓存时间为1小时,可以使用如下代码:
```
response.setHeader("Cache-Control", "max-age=" + 60 * 60);
response.setDateHeader("Expires", System.currentTimeMillis() + 60 * 60 * 1000);
```
4. 在web.xml文件中配置过滤器,并指定需要拦截的资源。
```
<filter>
<filter-name>CacheFilter</filter-name>
<filter-class>com.example.CacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CacheFilter</filter-name>
<url-pattern>*.css</url-pattern>
<url-pattern>*.js</url-pattern>
<url-pattern>*.jpg</url-pattern>
<url-pattern>*.png</url-pattern>
</filter-mapping>
```
通过以上步骤,就可以使用过滤器来设置静态资源的缓存了。
黑马程序员javaweb过滤器
### JavaWeb 过滤器详解
#### 过滤器的概念与作用
过滤器(Filter)是在Servlet技术中实现的一种拦截机制,用于在请求到达Servlet之前处理客户端发送的数据。通过定义一系列的过滤规则,可以在请求被处理前或响应返回客户机之前执行特定的操作。
#### 过滤器的工作流程
当Web容器启动后会依据`web.xml`配置文件来创建并初始化过滤器对象[^2]。具体来说:
- **实例化**:每当服务器重启时都会重新加载应用程序,并按照部署描述符中的声明顺序依次创建各个过滤器类的对象。
- **初始化 (`init()` 方法)**:一旦完成上述操作,则立即调用该方法来进行必要的准备工作;此时还可以访问来自`<filter>`标签下的参数设置以便于自定义行为逻辑。
```java
@Override
public void init(FilterConfig filterConfig) throws ServletException {
String paramValue = filterConfig.getInitParameter("paramName");
System.out.println("Initialization parameter value is " + paramValue);
}
```
- **核心业务逻辑(`doFilter()` 方法)** :这是最为重要的部分之一,它决定了如何以及何时继续传递控制权给链路下游组件或是终止当前事务流。此过程中允许开发者插入任意数量中间件服务以增强应用功能特性。
```java
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain chain) throws ServletException, IOException {
// Pre-processing logic here
chain.doFilter(request,response); // Passes the request/response along to next element in chain.
// Post-processing logic here (if needed)
}
```
- **销毁 (`destroy()` 方法)** : 当不再需要某个过滤器实例时会被自动回收内存空间,通常在此处清理静态变量或其他外部依赖关系。
---
#### 配置过滤器
为了使过滤器生效,必须将其注册到项目的部署描述符 `WEB-INF/web.xml` 文件内,如下所示:
```xml
<!-- Define a new filter -->
<filter>
<filter-name>MyCustomFilter</filter-name>
<filter-class>mypackage.MyCustomFilter</filter-class>
<!-- Optional initialization parameters can be added below -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<!-- Map this filter to specific URL patterns or servlet names -->
<filter-mapping>
<filter-name>MyCustomFilter</filter-name>
<url-pattern>/secure/*</url-pattern>
</filter-mapping>
```
也可以采用基于注解的方式简化配置过程,只需简单地添加相应的元数据即可让框架自动识别和管理这些组件。
```java
@WebServlet("/example")
@javax.servlet.annotation.WebFilter(urlPatterns={"/secure/*"})
public class MyCustomFilter implements javax.servlet.Filter { ... }
```
阅读全文