SSH2——filter过滤器

概述:

过滤器是Servlet2.3以上新增加的一个功能,其技术也是非常强大的。通过Filter技术可以对WEB服务器的文件进行拦截,从而实现一些特殊的功能。在JSP开发应用中也是必备的技能之一。Filter可以改变一个request(请求)和修改一个response(响应)。Filter不是一个Servlet,它不能产生一个response,它能够在一个requsst到达Servlet之前预处理request,也可以在离开Servlet时处理response。

原理:

当Web容器接受到一个对资源的请求时,它将判断是否有过滤器与这个资源关联,如果有的话容器把请求交给过滤器处理,在过滤器中,可以改变请求的内容,或者重新设置请求的信息,然后再将请求发送给目标资源,当目标资源对请求做出响应后,容器同样将响应先转发给过滤器,过滤器可以对响应的内容进行转换,然后再将响应发送到客户端

在一个Web应用中,是可以部署多个过滤器的,组成一个过滤器链。过滤器链中的每个过滤器负责特定的操作和任务,客户端的请求在这些过滤器之间传递,直到目标资源。WEB服务器根据Filter在web.xml文件中的注册顺序决定先调用哪一个Filter,当地一个Filter的doFilter方法被调用时,WEB服务器会创建一个Filter链的FilterChain对象传递给该方法。

说明:FIlter不是一个标准的Servlet,不能处理用户请求,也不能对客户端生成响应。主要用于对HttpServletRequest进行预处理,也可以对HttpServletResponse进行后处理。

HttpServletRequest和HttpServletResponse工作流程

首先,在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest,然后根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据,当HttpServletResponse到达客户端之前,拦截HttpServletResponse,根据需要检查HttpServletResponse,也可以修改HttpServletResponse的头和数据。比如说当对用户发送的数据进行过滤,替换时就使用到这一点。

Filter使用基础

1.一个Filter必须实现javax.servlet,Filter接口并定义以下三个方法:

<!--Filter实例化后进行初始化的回调方法-->

public void init(FilterConfig config)

<!--处理过滤器的方法-->

public void doFilter(ServletRequest  request,ServletResponse response,FilterChain)

<!--在释放时回调的方法-->

public void destory()

2.FilterConfig接口

在配置filter时,可以使用<init-parm>为filter配置一些初始化参数,当web容器实例化Filter对象时,调用init方法时,会把封装了filter初始化参数的filterConfig对象传递进来,因此在编写filter时,通过filterConfig对象的方法,就可以通过getFilterName()获得filter的名字,使用String
getInitParamerter(String name)获得在部署描述中指定名称的初始化参数的值等

3.在web.xml文件中使用<filter>和<filter-mapping>元素对编写的filter类进行注册,并设置它所能拦截的资源。下面通过介绍登陆的时加上过滤器这个例子介绍web.xml怎么配置

Web.xml

<filter>
    <filter-name>SessionFilter</filter-name>
    <filter-class>com.action.login.SessionFilter</filter-class>
    <init-param>
        <param-name>logonStrings</param-name><!-- 对登录页面不进行过滤 -->
        <param-value>/project/index.jsp;login.do</param-value>
    </init-param>
    <init-param>
        <param-name>includeStrings</param-name><!-- 只对指定过滤参数后缀进行过滤 -->
        <param-value>.do;.jsp</param-value>
    </init-param>
    <init-param>
        <param-name>redirectPath</param-name><!-- 未通过跳转到登录界面 -->
        <param-value>/index.jsp</param-value>
    </init-param>
    <init-param>
        <param-name>disabletestfilter</param-name><!-- Y:过滤无效 -->
        <param-value>N</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>SessionFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

FilterServlet

package com.action.login;

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;
import javax.servlet.http.HttpServletResponseWrapper;

  <!-- 判断用户是否登录,未登录则退出系统返回登陆页-->
public class SessionFilter implements Filter {

    public FilterConfig config;

    public void destroy() {
        this.config = null;
    }

    public static boolean isContains(String container, String[] regx) {
        boolean result = false;

        for (int i = 0; i < regx.length; i++) {
            if (container.indexOf(regx[i]) != -1) {
                return true;
            }
        }
        return result;
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest hrequest = (HttpServletRequest)request;
        HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper((HttpServletResponse) response);

        String logonStrings = config.getInitParameter("logonStrings");        <!--登录登陆页面-->
        String includeStrings = config.getInitParameter("includeStrings");    <!--过滤资源后缀参数-->
        String redirectPath = hrequest.getContextPath() + config.getInitParameter("redirectPath");<!--没有登陆转向页面-->
        String disabletestfilter = config.getInitParameter("disabletestfilter");<!-- 过滤器是否有效-->

        if (disabletestfilter.toUpperCase().equals("Y")) {    <!--过滤无效-->
            chain.doFilter(request, response);
            return;
        }
        String[] logonList = logonStrings.split(";");
        String[] includeList = includeStrings.split(";");

        if (!this.isContains(hrequest.getRequestURI(), includeList)) {<!--只对指定过滤参数后缀进行过滤-->
            chain.doFilter(request, response);
            return;
        }

        if (this.isContains(hrequest.getRequestURI(), logonList)) {<!--对登录页面不进行过滤-->
            chain.doFilter(request, response);
            return;
        }

        String user = ( String ) hrequest.getSession().getAttribute("useronly");<!--判断用户是否登录-->
        if (user == null) {
            wrapper.sendRedirect(redirectPath);
            return;
        }else {
            chain.doFilter(request, response);
            return;
        }
    }

    public void init(FilterConfig filterConfig) throws ServletException {
        config = filterConfig;
    }
}

这样FIlter就可以帮你过滤了。

总结:上篇文章简单对拦截器有一个了解,今天 又学习了FIlter这个过滤器,除了使用方法不一样以外它们还有很多不同的地方,如:filter基于回调函数,我们需要实现的filter接口中doFilter方法就是回调函数,而interceptor则基于java本身的反射机制,这是两者最本质的区别,filter是依赖于servlet容器的,即只能在servlet容器中执行,很显然没有servlet容器就无法来回调doFilter方法。而interceptor与servlet容器无关,还有就是拦截器由spring管理,只对action起作用,不能拦截jsp页面、图片等其他资源。拦截器截获用户对action的访问,如需要跳转,只需如action一样返回一个result,spring根据result的配置执行跳转。如无需跳转,可调用invocation.invoke();方法来执行用户请求的action。拦截器在action之前开始,在action完成后结束。肯定还有很多不同的地方,学习到这里只体会到了这些,欢迎大家一起分享。

SSH2——filter过滤器,布布扣,bubuko.com

时间: 2024-10-20 03:45:39

SSH2——filter过滤器的相关文章

estore商城案例(三)------Filter过滤器:自动登录&amp;权限管理

前面写好了用户登录\注册\添加商品的功能模块.下面写一下对于这些功能模块的相关过滤器---自动登录与权限管理: 一.自动登录: 业务逻辑是这样的:jsp登录页面有个“自动登录选项”,如果登录这勾选了,那么在serlvet程序中则会额外的生成一个保存用户名和密码的cookie,然后每次用户向服务器发送请求时,Filter过滤器都会先判断用户的登录状态(session),如果已经登录那么无需做出受任何操作直接放行,如果没有登录(无session),那么这时体现自动登录功能作用的时候到了,先获取自动登

Java Web总结十九Filter过滤器

一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,Web开发人员通过Filter技术,对Web服务器管理的所有Web资源:例如Jsp,Servlet,静态图片文件或静态HTML文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.自动登录.压缩响应信息等一些高级功能. Servlet API中提供了一个Filter接口,开发Web应用时,如果编写的Java类实现了这个接口,则把这个Java类称之为过滤器Filter.通过

filter 过滤器从数组中选择一个子集

输入过滤器可以通过一个管道字符和一个过滤器添加到指令中,该过滤器后面跟着一个冒号:冒号后面是一个模型名称. <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <meta http-equiv="X-UA-Compatible"content="

Filter过滤器简单应用( 接口访问控制 )

一.描述 在提供安卓.IOS客户端接口时,可以在登陆接口分配Session给客户端,用于判断其他接口是否是合法访问,以避免将所有的接口都暴露在web中可以由路径直接访问.但是最近的一个项目中的移动接口并没有给客户端分配Session,所以所有的接口都可以通过路径直接访问,这种方式会存在一定的风险性,只能通过接口对参数进行更精确的验证.一般情况下为方便管理会将所有接口单独放到WebRoot下单独一个文件夹目录下如WebRoot/appreq.改目录下的接口可直接被访问,如:http://local

Filter 过滤器

Filter 过滤器 原文链接:http://tianweili.github.io/blog/2015/01/26/java-filter/ 1.简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. 它主要用于对用户请求进行预处

Filter过滤器(1)

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

Filter(过滤器)

一.Filter过滤器(重要) Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作. 1.Filter快速入门 1.1.步骤: 1. 创建一个类实现Filter接口 2. 重写接口中方法 doFilter方法是真正过滤的. 3. 在web.xml文件中配置  注意:在Filter的doFilter方法内如果没有执行chain.doFilter(request,response) 那么资源是不会被访问到的. 1.2.FilterChain FilterChain 是 servlet

javaweb之Filter过滤器详解

快速入门 1.新建一个类,实现Filter接口 2.实现doFilter()方法,打印一句话,来证明能够进行拦截 3.在web.xml中进行配置(参照Servlet配置) 4.访问一个页面,看看能不能拦截 例子: import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.serv

Java防止SQL注入2(通过filter过滤器功能进行拦截)

首先说明一点,这个过滤器拦截其实是不靠谱的,比如说我的一篇文章是介绍sql注入的,或者评论的内容是有关sql的,那会过滤掉:且如果每个页面都经过这个过滤器,那么效率也是非常低的. 如果是要SQL注入拦截,可以在数据访问上层的业务层用方法的形式进行手动过滤还靠谱些. 或者使用SQL的参数形式进行,这个绝对是百分百搞得定. 关于SQL注入解释,参考:http://www.cnblogs.com/EasonJim/p/6223216.html 关于filter过滤器使用教程,参考:http://www