[align=center][size=large][color=red][b]web.xml之过滤器详解[/b][/color][/size][/align]
[color=darkred][b]一、过滤器介绍(是个什么东西)[/b][/color]
[b][color=darkblue]filter功能.它使用户可以改变一个request和修改一个 response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.换种说法,filter其实是一个”servlet chaining”(servlet 链).一个filter 包括:[/color][/b]
[b][color=darkblue]1. 在servlet被调用之前截获;
2. 在servlet被调用之前检查servlet request;
3. 根据需要修改request头和request数据;
4. 根据需要修改response头和response数据;
5. 在servlet被调用之后截获.[/color][/b]
[color=darkred][b]二、执行步骤[/b][/color]
[color=darkblue][b]①项目启动实例化
②调用init方法初始化(为执行过滤做准备)
③调用dofilter执行过滤方法(用户在前后端交互操作时)
④调用destory方法销毁(在线程退出、超时或者停止项目时)[/b][/color]
[color=darkred][b]三、过滤器配置[/b][/color]
[color=darkblue][b]①在xml注册声明以及映射等操作
②在过滤器实现类中实现filter接口[/b][/color]
[color=darkred][b]四、过滤器接口介绍[/b][/color]
[b][color=darkblue]1、init(用来初始化)[/color]
[color=darkblue]2、dofilter(用来执行具体的操作)[/color]
[color=indigo]此方法是由Servlet容器提供给开发者的,用于对资源请求过滤链的依次调用,通过FilterChain调用过滤链中的下一个过滤 器,如果是最后一个过滤器,则下一个就调用目标资源。[/color]
[color=darkblue]3、destory(用来销毁)[/color][/b]
[b][color=black]重要备注:::
在web.xml中你能够配置一个filter 到一个或多个servlet;单个servlet或servlet组能够被多个filter 使用.
本次例子会附上:
1、字符集编码格式过滤
2、sql防注入过滤
3、不缓存页面的过滤器
[/color][/b]
[color=red][b]具体的代码案例[/b][/color]
[color=red][b]一、配置[/b][/color]
//过滤器实现,以及地址
patronliFilter//定义名字
com..servlet.FwpFilter//实现类
//映射过滤器拦截规则
patronliFilter
/*
REQUEST
FORWARD
//如果想要配置多个拦截器,可以依次向下写
[color=red][b]二、具体的实现类以及实现的拦截功能(字符集编码格式过滤)[/b][/color]
package com.patronli.servlet;
import java.io.IOException;
import java.util.Map;
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;
import org.apache.commons.lang.StringEscapeUtils;
public class patronliFilter implements Filter {
@Override
public void destroy() {
System.out.println("执行了初始化方法......");
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) arg0;
HttpServletResponse response = (HttpServletResponse) arg1;
// 设置字符集编码
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
// HttpSession session = request.getSession();
// String url = request.getServletPath();
Map map = request.getParameterMap();
// 一下方法可以打印出来用户请求和返回的参数以及响应请求地址
// 生产测试遇到问题查起来很方便
System.out.println("请求或响应的地址为:::" + request.getRequestURI());
for (Map.Entry entry : map.entrySet()) {
for (String str : entry.getValue()) {
System.out.println("请求或响应的参数有:::" + entry.getKey() + ":" + str);
str = StringEscapeUtils.escapeHtml(str);
}
}
// 会去顺序执行当前过滤器下面的过滤
arg2.doFilter(arg0, arg1);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
System.out.println("执行了销毁的方法...");
}
}
[color=red][b](sql防注入过滤)[/b][/color]
package com.patronli.servlet;
import java.io.IOException;
import java.util.Enumeration;
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;
import com.fuiou.fwp.util.ConfigReader;
/**
* 过滤sql关键字的Filter
*
*/
public class PatronliFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
// throw new UnsupportedOperationException("Not supported yet.");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
String requestUri = req.getRequestURI();
// 获得所有请求参数名
Enumeration params = req.getParameterNames();
System.out.print(req.getRequestURL());
String str = "";
while (params.hasMoreElements()) {
String name = params.nextElement().toString();
String[] value = req.getParameterValues(name);
for (int i = 0; i < value.length; i++) {
str = str + value[i];
}
}
if (sqlValidate(str)) {
//返回错误页面
res.sendRedirect(req.getContextPath() + "/500.jsp");
} else {
chain.doFilter(req, res);
}
}
// 效验
protected static boolean sqlValidate(String str) {
// 统一转为小写
str = str.toLowerCase();
System.out.println("防sql注入过滤:"+str);
// 过滤掉的sql关键字,可以手动添加
String badStr = "'|and|exec|execute|insert|select|delete|update|count|drop|*|%|chr|mid|master|truncate|"
+ "char|declare|sitename|net user|xp_cmdshell|;|or|+|,|like'|and|exec|execute|insert|create|drop|"
+ "table|from|grant|use|group_concat|column_name|"
+ "information_schema.columns|table_schema|union|where|select|delete|update|order|by|count|*|"
+ "chr|mid|master|truncate|char|declare|or|;|-|--|+|,|like|//|/|%|#|=|(|scrip";
String[] badStrs = badStr.split("\\|");
for (int i = 0; i < badStrs.length; i++) {
if (str.indexOf(badStrs[i]) >= 0) {
System.out.println(str+" ====触犯sql注入规则==》"+badStrs[i]);
return true;
}
}
return false;
}
public void destroy() {
// throw new UnsupportedOperationException("Not supported yet.");
}
}
[color=red][b](不缓存页面的过滤器 -有借鉴)[/b][/color]
package com.patronli.servlet;
import java.io.IOException;
import java.util.Enumeration;
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;
import com.fuiou.fwp.util.ConfigReader;
/**
* 用于的使 Browser 不缓存页面的过滤器
*/
public class patronliFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException,ServletException {
((HttpServletResponse) response).setHeader("Cache-Control","no-cache");
((HttpServletResponse) response).setHeader("Pragma","no-cache");
((HttpServletResponse) response).setDateHeader ("Expires", -1);
filterChain.doFilter(request, response);
}
public void destroy() {
}
public void init(FilterConfig arg0) throws ServletException {
}
}