`
Aether
  • 浏览: 13878 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

JSP拾遗(七)——Filter

    博客分类:
  • Java
阅读更多

一个过滤器必须要实现javax.servlet.Filter,并在web.xml里面正确地配置。过滤器可以用来对客户端对资源(servlet或静态资源如html、图片、影音等)的请求、服务端对请求资源的响应进行分别过滤,或者同时过滤。

 

Filter接口定义了三个方法:

doFilter(ServletRequest request, ServletResponse response, FilterChain chain):处理过滤信息;

init(FilterConfig filterConfig):初始化filter。在web容器加载filter时执行。

destroy():销毁占用资源。在web容器销毁filter时执行。

 

以下情形是Filter的应用示例:

1、权限

2、日志及核查

3、图像转换

4、数据压缩

5、加密

6、语义解析

7、触发资源访问事件

8、XSL/T应用

9、 数据类型解析(Mime-type chain Filter)

 

下面举例说明Filter在语义解析方面的应用。在这个示例中,给出了一种伪静态化的实现方法。这里的伪静态化的含义就是,在客户端表现为静态化的页面链接,但服务端并没有对应的静态html页面,仍然是动态地从数据库读取数据。这需要在Filter里面对静态html资源的请求转化为对servletjsp的动态调用。

 

假设我们做一个小说网站。小说的内容通过后台编辑来发布。一篇小说包括基本信息和章节信息来组成,它们之间是一对多的关系。小说的基本信息用小说名称来唯一标识,章节名称用数字123等来标识,我们通过传入小说名称和章节号到viewBook.jsp来显示小说的章节内容,在访问地址会是这样的格式: http://127.0.0.1/books/viewBook.jsp?name=guichuideng&article=1

但这种格式对应客户端来说是没有意义的,你可能需要提供一个更友好的访问地址如:

http://127.0.0.1/books/guichuiden/1.html

 

我们通过BookFilter来实现伪静态化的过程。

 

 

web.xml里面配置:

<filter>
	<filter-name>BookFilter</filter-name>
	<filter-class>com.hx.servlet.BookFilter</filter-class>
	<init-param>
		<param-name>BOOK_URI</param-name>
		<param-value>books/</param-value>
	</init-param>
	<init-param>
		<param-name>BOOK_SERVLET</param-name>
		<param-value>/books/viewBook.jsp</param-value>
	</init-param>
</filter>
<filter-mapping>
	<filter-name>BookFilter</filter-name>
	<url-pattern>/books/*</url-pattern>
</filter-mapping>

 

Java代码:

 

package com.hx.servlet;

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 BookFilter implements Filter {

    /** 小说放置目录 */
    private static String bookURI = "";
    
    /** 小说查看Servlet */
    private static String bookServlet = "";

    public void init(FilterConfig filterConfig) throws ServletException {
        bookURI = filterConfig.getInitParameter("BOOK_URI");
        bookServlet = filterConfig.getInitParameter("BOOK_SERVLET");
    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        String contextPath = request.getContextPath();
        String uri = request.getRequestURI();
        String resource = uri.substring(contextPath.length() + 1, uri.length());
        resource = resource.substring(bookURI.length());
        String[] tmp = resource.split("/");
        if (tmp.length != 2 || tmp[1].indexOf(".htm") <= 0) {
            filterChain.doFilter(servletRequest, servletResponse);
        }
        else {
            String bookName = tmp[0];
            String article = tmp[1].substring(0, tmp[1].indexOf(".htm"));
            request.setAttribute("name", bookName);
            request.setAttribute("article", article);
	    //分发请求
	    //bookServlet里面根据request.getAttribute("name")和request.getAttribute("article")
	    //分别获取小说名和章节编号
            request.getRequestDispatcher(bookServlet).forward(request, response);
        }
    }

    public void destroy() {
    }

}

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics