Java Web过滤器:
定义:
是一个服务器端的组件,它可以截取用户端请求与响应信息,并对这些信息过滤
生命周期:
- 实例化: Web.xml 启动服务器阶段
- 初始化: init()
- 过滤: doFilter()
- 销毁: destory() web容器关闭时
步骤:
创建一个类实现java.servlet.Filter接口
在web.xml中注册过滤器
过滤方法:
init():初始化,Web容器创建过滤器实例后调用,可以读取web.xml过滤器参数
doFilter():当用户请求访问与过滤器关联的URL时,Web容器将调用过滤器的doFilter方法
destory():web容器关闭时,释放过滤器占用的资源
Web.xml配置:
<filter>
<filter-name>Filter名称</filter-name>
<filter-class>Filter的类名称</filter-class>
<init-param>
<description>描述信息(可以省略)</description>
<param-name>参数名称</param-name>
<param-value>参数值</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Filter名称(同Fileter配置下的名称)</filter-name>
<url-pattern>URL</url-pattern>
<dispatcher></dispatcher>//过滤类型[见后面]
<filter-mapping>
忽视过滤页面的方法:
- 在web.xml中配置FilterConfig,设置一个参数,参数值为要忽视过滤的页面,以某种符号隔开
- 在过滤器类init()方法中获取FilterConfig对象传递给该类的一个私有属性
- doFilter中获取该私有属性的过滤参数,对参数值分割处理
- 将ServletRequest对象强制转换成HttpServletRequest,判断request.getRequestURL()中是否包含该忽视地址,(可以使用String.indexOf(String)方法)
如果包含,则让过滤器链执行doFilter(request,response)并return空,放行
如下:过滤所有地址
<url-pattern>/*</url-pattern>
但是忽略访问login.jsp和LoginServlet的页面
public class MyFilter implements Filter {
private String toignore="";
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("initMyFilter");
toignore=filterConfig.getInitParameter("toignore");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("Start……MydoFilter");
String[] ignore=toignore.split(",");
HttpServletRequest request2=(HttpServletRequest)request;
String rString=request2.getRequestURI();
boolean isignore=false;
for (String string : ignore) {
if(rString.indexOf(string)!=-1){//如果url中包含
isignore=true;
break;
}
}
if(isignore){
System.out.println("忽略过滤");
chain.doFilter(request, response);//传递给下一个Filter
}else if(request2.getSession().getAttribute("username")!=null){
//过滤器具体功能是实现,省略……
chain.doFilter(request, response);
//对返回servlet执行返回的结果过滤,省略……
}else {
//如果Session中没有username,则重定向到login.jsp
HttpServletResponse response2=(HttpServletResponse)response;
response2.sendRedirect("login.jsp");
}
System.out.println("end……MydoFilter");
}
@Override
public void destroy() {
System.out.println("destory……MyFilter");
}
}
<filter>
<filter-name>myFilter</filter-name>
<filter-class>filter.MyFilter</filter-class>
<init-param>
<description>request的url中包含这些字符则忽略过滤</description>
<param-name>toignore</param-name>
<param-value>login.jsp,LoginServlet</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
过滤器链:
当请求的url匹配多个过滤器时,服务器会按照web.xml中过滤器定义的先后顺序组装成一条链
过滤类别
servlet 2.5版本过滤器分类:
Request(默认):用户直接访问页面时,Web容器将会调用过滤器
forword:目标资源是通过RequestDispatcher的forward访问时,该过滤器会被调用
include:目标资源是通过RequestDispatcher的include方法调用时,过滤器将被调用
error:目标资源通过声明式异常处理机制调用时,过滤器将会被调用
servlet 3.0版本增加分类:
async:支持异步处理
在过滤器类的上面添加注解:(或者在web.xml中配置)
@WebFilter(servletNames={“”},filterName=”“)
public class …… implements Filter{……}
在web.xml中配置error提示页面:
<error-page>
<error-code>错误代码</error-code>
<location>错误页面url</location>
</error-page>
Java Web监听器的基本创建http://blog.csdn.net/u014438534/article/details/54427329
完整示例:https://github.com/lazyboy20150303/Model2Demo/