Servlet用于处理用户请求,Filter(过滤器)用于拦截request、response,对request、response对象进行修改,在Servlet处理请求前后实现某些功能。
Filter接口
Filter是一个实现了javax.servlet.Filter接口的类。
Filter接口中的方法:
init(FilterConfig filterFonfig) //初始化FilterdoFilter(ServletRequest request, ServletResponse response, FilterChain chain) //拦截、过滤。chain对象表示Filter链。此方法是Filter的关键方法。destroy() //在web服务器移除Filter对象之前调用,释放Filter对象占用的资源
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
//...... //去的时候拦截,做一些处理
chain.doFilter(req, resp);
//放行
//...... //回来的时候拦截,做一些处理
}
Filter示例 统一全站编码
1 @WebFilter("/*"
)
2 public class HandlerFilter
implements Filter {
3 public void init(FilterConfig config){
4 }
5
6 public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
7 req.setCharacterEncoding("utf-8"
);
8 resp.setContentType("text/html;charset=utf-8"
);
9 chain.doFilter(req, resp);
10 }
11
12 public void destroy() {
13 }
14
15 }
Filter的配置
Filter的配置方式和Servlet的配置方式差不多。
(1)xml配置
<filter>
<filter-name>handlerFilter</filter-name>
<filter-
class>filter.HandlerFilter</filter-
class>
</filter>
<filter-mapping>
<filter-name>handlerFilter</filter-name>
<url-pattern>
/*</url-pattern>
</filter-mapping>
如果有多个Filter同时拦截某个请求,这些Filter会组成一个FilterChain,拦截时,在xml配置中位置靠前的Filter先拦截。
(2)注解配置
@WebFilter("/*")
@WebFilter(filterName = "handlerFilter",urlPatterns = "/*")
Filter初始参数
在xml中配置Filter的初始参数:
<filter>
<filter-name>handlerFilter</filter-name>
<filter-
class>filter.HandlerFilter</filter-
class>
<init-param>
<param-name>name</param-name>
<param-value>张三</param-value>
</init-param>
<init-param>
<param-name>age</param-name>
<param-value>20</param-value>
</init-param>
</filter>
或者在注解中配置:
@WebFilter(
filterName = "handlerFilter"
,
urlPatterns = "/*"
,
initParams = {@WebInitParam(name = "name", value = "张三"),@WebInitParam(name="age",value = "12"
)}
)
我们注意到Filter的init(FilterConfig config)有参数FilterConfig,Web服务器创建此Filter的实例时,会自动把xml或注解中这个Filter的初始参数以FilterConfig对象的形式注入。
在Filter中获取初始参数:
1 public class HandlerFilter
implements Filter {
2 private FilterConfig filterConfig;
//需要创建一个成员变量
3 public void init(FilterConfig config){
4 this.filterConfig = config;
//需要我们手动初始化
5 }
6
7 public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws ServletException, IOException {
8 //获取单个初始参数的值
9 String name = filterConfig.getInitParameter("name");
//返回值是String,不存在该参数时返回null
10 String age = filterConfig.getInitParameter("age"
);
11 System.out.println(name);
12 System.out.println(age);
13
14 //遍历
15 Enumeration<String> initParameterNames =
filterConfig.getInitParameterNames();
16 while (initParameterNames.hasMoreElements()){
17 String paramName =
initParameterNames.nextElement();
18 String paramValue =
filterConfig.getInitParameter(paramName);
19 System.out.println(paramValue);
20 }
21
22 chain.doFilter(req, resp);
23 }
24
25 public void destroy() {
26 }
27
28 }
使用Filter检查用户权限
用户要访问、下载某些资源,我们常常要检查用户权限是否足够,有的是检查用户是否已登录。
我们可以在在session域中放入用户权限|状态,比如session.setAttrbute("group", "vip") ,使用Filter检查用户权限 | 是否已登录,如果权限够了,不做处理,放行。如果权限不够,使用request转发或response重定向转到提示页面,也可以response直接输出提示信息。
Filter做前后增强,Servlet负责处理核心业务,业务逻辑不杂糅在一起,类似于Spring AOP。
有时候需要获取所请求的URL,根据URL来判断,比如...../resource/vip/........,普通用户不能访问里面的资源。
1 String requestURI =
request.getRequestURI();
2 /*
3 String类型,所请求资源的相对地址,/项目名/页面
4 比如 /StudentManagerSystem/handlerServlet
5 */
6
7
8 StringBuffer requestURL =
request.getRequestURL();
9 /*
10 StringBuffer类型,所请求资源的绝对地址
11 比如 http://localhost:8080/StudentManagerSystem/handlerServlet
12 */
这2种方式获取的地址均不带请求参数?......&.......。既然是统一资源定位符,是标识互联网上的资源的,资源本身自然不带请求参数。
转载于:https://www.cnblogs.com/chy18883701161/p/11415960.html