1、第四次课(Filter) 一. 什么是Filter 过滤器是用于过滤Servlet的请求和响应,过滤器是在客户端和Servlet之间。当客户端请求某一个Servlet 的时候,请求会先进入Filter的doFilter(),开始处理,处理完成以后,调用chain.doFilter(request, response) 把request,response继续传递,让请求继续往下走,进入Servlet,在Servlet处理完成以后,又重回Filter的 doFilter(),执行chain.doFilter(request, response)下面的语句,完成以后,响应给客
2、户端. 注意:Filter不会产生request和response对象,只是对request和response的值进行修改,起到一个过滤的 request 作用 原理图: 客户端 service() servlet doFilter() filter doFilter() response 二. 测试Filter和servlet的生命周期 (1)写一个MyServlet(实现Servlet接口),实现destroy() ,init(),service()和构造方法
3、 (2)写一个MyFilter(实现Filte接口),实现destroy() ,init(),doFilter()和构造方法 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException{ System.out.println("过滤之前"); //进到过滤,开始处理,处理完成以后,让请求继续往下走,进入Servlet chain.doFilter
4、request, response);
//在Servlet完成以后,又重回过滤器响应给客户端
System.out.println("过滤之后");
}
(3) web.xml配置
5、et
6、e>
7、者关闭,servlet先死,filter后死 二. Filter应用 (1).解决中文乱码问题(request和response) public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest)req; HttpServletResponse response = (HttpServ
8、letResponse)res; if(request.getMethod().equalsIgnoreCase("post")){ request.setCharacterEncoding("gb18030"); }else{ Enumeration enum = request.getParameterNames(); while(enum.hasMoreElements()){ String key = (String)enum.nextElement(); String[] values = request.getPara
9、meterValues(key);
for(int i=0;i 10、d doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)resp;
//得到session的值
String role = (String)request.get 11、Session().getAttribute("role");
//拿到项目的路径,相当于"/项目名"
System.out.println("-------------"+request.getContextPath());
if(role==null || !role.equals("admin")){
response.sendRedirect(request.getContextPath()+"/error.jsp");
}
chain.doFilter(request, response);
}
12、 13、tr.properties文件,把要过滤掉的字符,准备在里面
\u738b\u516b=***
\u65e5\u672c=****
\u6740\u624b=*****
注意这里要转码
\u738b\u516b-->王八
\u65e5\u672c-->日本
\u6740\u624b-->杀手
b.过滤器代码
Properties ps = null;
publ 14、ic void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)resp;
//注意中文乱码的设置
reque 15、st.setCharacterEncoding("gb18030");
Enumeration enum = request.getParameterNames();
while(enum.hasMoreElements()){
String key = (String)enum.nextElement();
String[] values = request.getParameterValues(key);
for (int i = 0; i < values.length; i++) {
16、 //根据key,从properties中拿到值,如果不为空,则证明一定有非法字符
//然后替换掉
if(ps.get(values[i])!=null){
values[i] = ps.getProperty(values[i]);
}
}
}
chain.doFilter(request, response);
}
//初始化中读取str.properties文件
public void init(FilterConfig filterConfig) throws Servl 17、etException {
try {
//读取str.properties文件
InputStream in = filterConfig.getServletContext().getResourceAsStream("/WEB-INF/str.properties");
ps = new Properties();
ps.load(in);//加载配置文件
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}






