首先过滤器,顾名思义,他的作用就是阻挡某些事件的发生。在Web应用程序中,过滤器介于Servlet之前,既可以拦截,过滤器浏览器的请求,也乐意改变对浏览器的响应。在中间起到了一个中间组件的作用,对二者的信息进行过滤。
实现功能
1.对用户请求进行身份验证
2.对用户发送的数据进行过滤或者替换
3.转换图像的数据格式
4.数据压缩
5.数据加密
6.XML数据的转换
7.修改请求数据的字符集
8.日志记录和审核
实现与设置过滤器
首先要实现Filter接口可使用注入的方式或者在Web.xml中进行配置,并设置要求过滤的内容。
<filter>
<filter-name>testfilter</filter-name>
<filter-class>until7test1.testFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>testfilter</filter-name>
<url-pattern>/until7test1/*
Filter接口实现的方法
default void init(FilterConfig filterConfig)
初始化过滤器,filterConfig该对象可得到过滤器中初始化配置的参数信息
在服务器启动时创建。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain Chain)
在过滤器中主要实现过滤的方法。客户端去请求目标资源时,Web应用程序会调用与此目标资源相关的doFilter()方法。实现对请求和响应的数据处理。可调用 Chain. doFilter(request,response)放行,若无下一个过滤器执行目标资源,若无则执行下一个过滤器。
*default void destory() *释放过滤器中使用的资源。
过滤器四种拦截
请求,转发,包含,错误
<dispatcher>REQUEST</dispatcher> 默认为request
设置多个过滤器的执行顺序,则只需设置
<filter-mapping> </filter-mapping>//前后顺序
FilterConfig接口
该接口用于在过滤器初始化时由Web容器向过滤器传送初始化配置参数,传入到过滤器对象的init()方法中。
*public String getFilterName();*用于得到过滤器的名字
public String getInitParameter(String name) 得到过滤器中初始化的参数值
*public ServletContext getServletContext()*得到Servlet上下文文件对象。
案例
这里使用过滤器对GET和POST请求的编码设置
//testrequest类
public class testrequest extends HttpServletRequestWrapper {
private HttpServletRequest req;
public testrequest(HttpServletRequest request) {
super(request);
this.req = request;
}
public String getParameter(String usename){
String value = req.getParameter(usename);
try {
value = new String(value.trim().getBytes("ISO-8859-1"),"utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return value;
}
}
对于GET方法参数存放在URL字段中servletRequest.setCharacterEncoding(“utf-8”);只对消息中的数据启作用。这里我们将去重写getParameter()方法,将字符编码转换的操作,放到该方法中。这里继承HttpServletRequestWrapper类,提供HttpServletRequest接口的便捷实现,希望将请求调整为Servlet的开发人员可以将其子类化。此类实现Wrapper或Decorator模式。方法默认情况下是调用包装的请求对象。
//testFilter
public class testFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");
HttpServletRequest req = (HttpServletRequest) servletRequest;
if (req.getMethod().equals("GET")){
testrequest re = new testrequest(req);
filterChain.doFilter(re,servletResponse);
}else if(req.getMethod().equals("POST")){
filterChain.doFilter(servletRequest,servletResponse);
}
}
@Override
public void destroy() {
}
}
这里则是对于响应的请求方式进行逻辑判断,去放行过滤器对目标资源进行请求。这里将HttpServletRequest的对象 调给继承HttpServletRequestWrapper的类,获取该类的对象,并实现重写的方法。
//Servlet
public class testServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{
response.setContentType("text/html;charset = utf-8");
String use = request.getParameter("usename");
PrintWriter out = response.getWriter();
out.println("");
out.println("");
out.println("test ");
out.println(use);
out.println("");
out.println("