第一:概念
1.过滤器:放在客户端和服务器之间,客户端发送的请求先通过过滤器,当然在服务器响应给客户端的时候也需要先通过过滤器到达客户端。
因此,过滤器可以获取请求数据和响应的数据。在过滤器里还可以做中文乱码处理等(只需要做一次,因为所有的请求和响应都要通过过滤器)
2.由于情求和响应都要由过滤器处理,因此过滤器里有request对象和response对象
2.过滤器的作用(拦截请求,并判断,通过的之后把请求向下传递):
---1.可以做中文乱码处理,2,可以做访问控制。3,响应数据的压缩
3.在comm中创建一个类,并继承Filter接口。要想用它里面的request和response就要向下转型,因为Filter是抽象类,因此要用他的实现类。
chain是过滤器链,chain.dofilter()方法用于把请求向下传递。
filterConfing是过滤器的配置,用于在init方法中接收web.xml中配置的参数值。
4.写完过滤器类之后,就在配置文件里配置过滤器。在配置文件中写servlet是配置一个路径,在配置文件中配置filter是配置很多路径
5.过滤器的实例化和初始化的方法是在启动服务器的时候就开始执行的。
6.步骤:1.把不需要过滤的路径放在集合中,首先进行判断是不是不需要过滤的路径。如果该路径不需要过滤,就使用chain链向下传递请求
2.如果是需要过滤的路径,就使用session判断(session的访问控制)
7.注意:如果不使用集合进行封装不需要过滤的路径,那就表示所有路径都要过滤,因此重定向的之后客户端再次发送请求的路径又会进入过滤器方法,导致死循环。
第二:相关代码
package com.comm;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
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 javax.servlet.http.HttpSession;
public class RequestFilter implements Filter {
String charset=null;
public RequestFilter()
{
System.out.println("============RequestFilter");
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest request=(HttpServletRequest)req;
HttpServletResponse response=(HttpServletResponse)resp;
//中文乱码处理
request.setCharacterEncoding(charset);
HttpSession session = request.getSession();
Object obj = session.getAttribute("u");
System.out.println("----------请求传递之前");
//不用进行访问控制的路径
List<String> path=new ArrayList<String>();
path.add("/userLogin.html");
path.add("/userServlet");
String p=request.getServletPath();
System.out.println(p);
if(path.contains(p))
{
//将请求向下传递
chain.doFilter(request, response);
}
else
{
//判断用户是否登录
if(obj!=null)
{
//将请求向下传递
chain.doFilter(request, response);
}
else
{
response.sendRedirect("userLogin.html");
}
}
System.out.println("----------请求传递之后");
}
@Override
public void init(FilterConfig fc) throws ServletException {
// TODO Auto-generated method stub
charset=fc.getInitParameter("charset");
System.out.println("============ init(FilterConfig fc) "+charset);
}
}