Java Web开发技术应用——过滤器

来源:互联网 发布:天元律师事务所 知乎 编辑:程序博客网 时间:2024/05/17 03:46

一、Filter简介

  Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
  Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。

二、Filter是如何实现拦截的?

实现了Filter接口的Servlet是过滤器,因为Filter接口有一个doFilter(ServletRequest request, ServletResponse response, FilterChain chain)方法,只要用户访问我们在web.xml中配置的映射目录,服务器便会调用过滤器的doFilter方法。我们在这里实现过虑功能代码,当我们调用chain.doFilter(request, response)方法时,将请求反给服务器服务器再去调用相当的Servlet。如果我们不调用此方法,说明拒绝了用户的请求。

三、过滤器的应用(登录和编码转换)

1.编写java类实现Filter接口,并实现其doFilter方法。LoginFilter.java如下:

package com.web.filterimport 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;import javax.servlet.http.HttpSession;public class LoginFilter implements Filter {    private FilterConfig config;    public void destroy() {        // TODO Auto-generated method stub    }    public void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2) throws IOException, ServletException {        // TODO Auto-generated method stub        HttpServletRequest request = (HttpServletRequest)arg0;        HttpSession session = request.getSession();        HttpServletResponse response = (HttpServletResponse)arg1;        String noLoginPaths = config.getInitParameter("noLoginPaths");        String charset =config.getInitParameter("charset");        if(charset==null){            charset="UTF-8";        }        request.setCharacterEncoding(charset);        if(noLoginPaths!=null)        {            String[] str = noLoginPaths.split(";");            for (int i = 0; i < str.length; i++) {                if(str[i]==null || "".equals(str[i])) continue;                if(request.getRequestURI().indexOf(str[i])!=-1 )                {                    arg2.doFilter(arg0, arg1);                    return;                }            }        }        if(session.getAttribute("username")==null){            response.sendRedirect("login.jsp");        }else{            arg2.doFilter(arg0, arg1);        }    }    public void init(FilterConfig arg0) throws ServletException {        // TODO Auto-generated method stub        config = arg0;    }}

2.在 web.xml 文件中使用和元素对编写的filter类进行注册,并设置它所能拦截的资源。web.xml如下:

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <filter>  <filter-name>LoginFilter</filter-name>  <filter-class>com.web.filter.LoginFilter</filter-class>  <init-param>   <param-name>noLoginPaths</param-name>   <param-value>login.jsp;fail.jsp;LoginServlet</param-value>  </init-param>  <init-param>   <param-name>charset</param-name>   <param-value>UTF-8</param-value>  </init-param> </filter> <filter-mapping>  <filter-name>LoginFilter</filter-name>  <url-pattern>/*</url-pattern> </filter-mapping> <servlet>  <description>This is the description of my J2EE component</description>  <display-name>This is the display name of my J2EE component</display-name>  <servlet-name>LoginServlet</servlet-name>  <servlet-class>com.web.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping>  <servlet-name>LoginServlet</servlet-name>  <url-pattern>/servlet/LoginServlet</url-pattern> </servlet-mapping> <welcome-file-list>  <welcome-file>index.jsp</welcome-file> </welcome-file-list> <login-config>  <auth-method>BASIC</auth-method> </login-config></web-app>

3.判断用户名和密码是否正确,LoginServlet.java如下:

package com.web.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class LoginServlet extends HttpServlet {    /**     * Constructor of the object.     */    public LoginServlet() {        super();    }    /**     * Destruction of the servlet. <br>     */    public void destroy() {        super.destroy(); // Just puts "destroy" string in log        // Put your code here    }    /**     * The doPost method of the servlet. <br>     *     * This method is called when a form has its tag value method equals to post.     *      * @param request the request send by the client to the server     * @param response the response send by the server to the client     * @throws ServletException if an error occurred     * @throws IOException if an error occurred     */    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        String username = request.getParameter("username");        String password = request.getParameter("password");        System.out.println("username:"+username);        if("admin".equals(username) && "admin".equals(password))        {            HttpSession session = request.getSession();            session.setAttribute("username", username);            response.sendRedirect(request.getContextPath()+"/success.jsp");        }else{            response.sendRedirect(request.getContextPath()+"/fail.jsp");        }    }    /**     * Initialization of the servlet. <br>     *     * @throws ServletException if an error occurs     */    public void init() throws ServletException {        // Put your code here    }}

4.jsp页面。login.jsp关键代码如下:(success.jsp,fail.jsp省略)

 <body>   <form action="<%=request.getContextPath() %>/servlet/LoginServlet" method="post">    用户名:<input type="text" name="username">    密码:<input type="password" name="password">    <input type="submit" value="提交">    </form>  </body>

四、Filter的生命周期

4.1、Filter的创建

  Filter的创建和销毁由WEB服务器负责。 web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作,filter对象只会创建一次,init方法也只会执行一次。通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。
  
4.2、Filter的销毁

  Web容器调用destroy方法销毁Filter。destroy方法在Filter的生命周期中仅执行一次。在destroy方法中,可以释放过滤器使用的资源。
  
4.3、FilterConfig接口

  用户在配置filter时,可以使用为filter配置一些初始化参数,当web容器实例化Filter对象,调用其init方法时,会把封装了filter初始化参数的filterConfig对象传递进来。因此开发人员在编写filter时,通过filterConfig对象的方法,就可获得:
  String getFilterName():得到filter的名称。
  String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
  Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
  public ServletContext getServletContext():返回Servlet上下文对象的引用。

1 0
原创粉丝点击