过滤器

来源:互联网 发布:电脑选股软件 编辑:程序博客网 时间:2024/06/10 01:20

如何实现一个过滤器呢?
1.所在的类实现Filter接口
public interface Filter
public void init(FilterConfig filterConfig)throws ServletException
过滤器初始化是在容器启动时自动初始化
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws IOException,ServletExcepton
在标准Servlet中的doGet或doPost 方法中,传递参数为:HttpServletRequest、HttpServletResponse
过滤器销毁
public void destroy()
package cn.mldn.lxh.filter
import java.io.*;
import javax.servlet.*;
public class FirstFilter implements Filter
{
        public void init(FilterConfig config)throws ServletException
        {
      System.out.println("过滤器初始化");
        }
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,ServletException
{
System.out.println(过滤doFilter);
}
      public void destroy()
{
System.out.println(过滤器销毁);
}
}
web.xml文件配置

first
cn.mldn.lxh.filter.FirstFilter


first
与servlet中的url-pattern不一样,此处表示对那个页面进行过滤,如果全部都过滤,则"/*"
/*

如果过滤器要将内容传递到目的地,则需要FilterChain,将请求继续向下转发
过滤器也会执行两次:FilterChain这前执行一次,之后再执行一次

1.过滤非法文字:
package cn.mldn.lxh.filter;
import java.io.*;
import javax.servlet.*;
public class CharFilter implements Filter
{
    public void init(FilterConfig filterConfig)throws ServletException
    {
    //System.out.println("init");
    }
    public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws IOException,ServletException
{
String content=request.getParameter("content");
//如果indexOf返回-1则表示没有查到所要的内容
if(content!=null)
if(content.indexOf("AAA")==-1)
{
chain.doFilter(request,response);
}
esle
{
System.out.println("有非法文字");
//如果需要的话,此处依然可以使用RequestDispatcher进行跳转
}
}
else
{
chain.doFilter(request,response);
}
}
public void destroy()
{
//System.out.println("过滤器销毁");
}

char
cn.mldn.lxh.filter.CharFilter


char
/*

2.对内容进行统一的编码
setCharacterEncoding("GB2312");
package cn.mldn.lxh.filter;
import java.io.*;
import javax.servlet.*;
public class EncodingFilter implements Filter
{
public void init(FilterConfig filterConfig)throws ServletException
{
//System.out.println("过滤器初始化");
}
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws IOException,ServletException
{
try{
request.setCharacterEncoding("GB2312");
}
catch(Exception e)
{}
chain.doFilter(request,response);
}
public void destroy()
{
//System.out.println("销毁");
}
}

encoding



encoding
/*

3.登陆验证
package cn.mldn.lxh.filter;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class LoginFilter implements Filter
{
public void init(FilterCoinfig filterConfig)throws ServletException
{
//System.out.println("过滤器初始化");
}
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws IOException,ServletException
{
//Session属于http范畴,把以ServletRequest对象需要先转换成HttpServletRequest对象
HttpServletRequest req=(HttpServletRequest)request;
HttpSession session =req.getSession();
//如果session不为空,则可以浏览其它页面
if(session.getAttribute("uname")!=null)
{
chain.doFilter(request,response);
}
else
{
//通过requestDispatcher跳转到登陆面
request.getRequestDispatcher("login.jsp").forward(request,response);
}
}
public void destroy()
{
//System,out.println("销毁");
}
}

login
cn.mldn.lxh.filter.LoginFilter

      参数名称
      参数值
   



login
/*

读取web.xml中的参数的方法:
public void init(FilterConfig arg0) throws ServletException {
String 参数值= arg0.getInitParameter("参数名称");
}

我们都知道Filter是做过虑用的,有些黑客想直接通过你的网站URL进入你的后台,我们只要用Filter就可以阻止。

第一步:写一个类并实现Filter接口,并在该类中判断,如果没登录就返回指定页面,即登录页面。

package com.livechance.tools;

import java.io.IOException;

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;

public class LoginFilter implements Filter {

protected FilterConfig filterConfig;

public void destroy() {

// TODO Auto-generated method stub

this.filterConfig = null;

}

public void doFilter(ServletRequest req, ServletResponse res,

FilterChain chain) throws IOException, ServletException {

// TODO Auto-generated method stub

HttpServletRequest hreq = (HttpServletRequest) req;

HttpServletResponse hres = (HttpServletResponse) res;

String isLog = (String) hreq.getSession().getAttribute("isLog");

//System.out.println("isLog = " + isLog);

if ((isLog != null) && ((isLog.equals("true")) || (isLog == "true"))) { // 检查是否登录

chain.doFilter(req, res);

return;

} else {

hres.sendRedirect("../Login.jsp");// 如果没有登录,把视图派发到登录页面

}

}

public void init(FilterConfig arg0) throws ServletException {

// TODO Auto-generated method stub

this.filterConfig = arg0;

}

public void setFilterConfig(final FilterConfig filterConfig) {

this.filterConfig = filterConfig;

}

}

第二步:配置web.xml文件,指定我要过虑那些文件。

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

login

com.livechance.tools.LoginFilter

login

/manager/*

在这里我配置如下,过虑所有manager文件夹下的所有文件。

第三步:根据LoginFilter类知道需要在登录时传递一个isLog参数,而且是boolean型参数,如果是true说明我是通过登录访问manager目录下的文件,如果是null或者是false则说明没通过登录。

request.getSession().setAttribute("isLog", "true");

在登录成功将要跳转时把这个存到session中。

好了,这就完成配置了一个Filter的使用。