Filter过滤器(拦截器)实现AOP思想
Filter过滤器(拦截器)的使用是声明试的。即只需在web.xml配置文件中做简单的声明就Filter就能发挥作用。
实现过滤器简单的三个步骤就能实现:
(1)写一个类实现Filter接口(javax.servlet.Filter);
(2)覆写doFilter()方法;
(3)在web.xml中配置,过滤器的作用范围。
关键代码:第(1)、(2)步在java类中进行:
package com.bjpowernode.drp.util.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestFilter implements Filter {
/**
* 初始化时执行此方法
*/
@Override
public void init(FilterConfig arg0) throws ServletException {
/**
* 初始化加载时执行:—————可不实现
* 可通过传入的参数(FilterConfig的对象)获取web.xml中约定俗成的配置内容。
* 所谓约定俗成是指,读取的内容,是在web.xml特定标签【是按规范来的】中的内容。
*/
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
/**
* 因为需要用到 扩展类————HttpServletRequest的一些扩展方法;
* 同样地,也会用到 扩展类————HttpServletResponse的一些扩展方法。
* 因而,需要做如下转化:
*/
// 将 父类ServletRequest强制转化为子类HttpServletRequest
HttpServletRequest request = (HttpServletRequest)arg0;
// 将 父类ServletResponse强制转化为子类HttpServletResponse
HttpServletResponse response = (HttpServletResponse)arg1;
// 执行目标内容前执行
System.out.println("TestFilter------>>begin");
/**
* 在这个位置,可以添加,该过滤器想要实现的过滤效果。比如:设置字符编码、错误转接等
*/
// 执行目标方法
arg2.doFilter(request, response);
// 执行完目标后,回来执行
System.out.println("TestFilter------>end");
// 按request中指定的url,转发
request.getRequestDispatcher(request.getContextPath()).forward(request, response);
}
@Override
public void destroy() {
// 销毁时(退出时)执行————可不实现
}
}
实现步骤(3),web.xml做如下配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name></display-name>
<!-- filter过滤器 -->
<filter>
<filter-name>TestFilter</filter-name>
<filter-class>com.bjpowernode.drp.util.filter.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>TestFilter</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
</web-app>
仅仅只需如此,过滤器的功能就能实现了,就是如此简单。
下面是一个完整的实例:本实例完成了url路径的编码、字符编码
dofilter实现类:
package com.bjpowernode.drp.util.filter;
import java.io.IOException;
import java.net.URLDecoder;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
public class CharsetEncodingFilter implements Filter {
// 在程序中,预留一个默认的编码方式GB18030
public final static String DEFAULT_URI_ENCODE = "GB18030";
private FilterConfig filterConfig = null;
private String encoding;
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
// 设置字符集
// 将读出的 参数 设置到过滤器
request.setCharacterEncoding(encoding);
String uri = ((HttpServletRequest) request).getRequestURI();
// 对uri进行 编码
String ch = URLDecoder.decode(uri, encoding);
// 继续执行
// chain.doFilter(req, resp);
if(uri.equals(ch)) {
chain.doFilter(req, resp);
return;
}
// 读取request中的链接地址
ch = ch.substring(request.getContextPath().length());
// 按request中指定的url,转发
filterConfig.getServletContext().getRequestDispatcher(ch).forward(req, resp);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
// 读取web.xml配置文件中 设置的过滤器参数
this.encoding = filterConfig.getInitParameter("set_encoding");
if(this.encoding == null) {
this.encoding = DEFAULT_URI_ENCODE;
}
}
@Override
public void destroy() {
// 销毁————可不实现
}
}
web.xml中的配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name></display-name>
<!-- 默认主页列表
* 地址栏输入“http://localhost/”,访问自动添加<welcome-file>标签内指定的页面,
根据配置时的顺序查找相应的文件,找到即去到该页面
-->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.htm</welcome-file>
</welcome-file-list>
<!-- filter过滤器
* filter-name:过滤器的名称(一般以过滤器类名充当,任意名称皆可)
* fliter-class:过滤类的路径
* init-param:参数
· param-name:参数名
· param-value:参数值
-->
<filter>
<filter-name>CharsetEncodingFilter</filter-name>
<filter-class>com.bjpowernode.drp.util.filter.CharsetEncodingFilter</filter-class>
<init-param>
<param-name>set_encoding</param-name>
<param-value>GB18030</param-value>
</init-param>
</filter>
</web-app>
完美结束!