`

过滤器

    博客分类:
  • java
阅读更多
http://www.javaresearch.org/article/174920.htm

一、字符编码的过滤器
import javax.servlet.*;
import java.io.IOException;

/**
 * 用于设置 HTTP 请求字符编码的过滤器,通过过滤器参数encoding指明使用何种字符编码,
 * 用于处理Html Form请求参数的中文问题
 */
public class CharacterEncodingFilter implements Filter {
    protected FilterConfig filterConfig = null;

    protected String encoding = "";

    public void doFilter(ServletRequest servletRequest,
            ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        if (encoding != null)
            servletRequest.setCharacterEncoding(encoding);
        filterChain.doFilter(servletRequest, servletResponse);
    }

    public void destroy() {
        filterConfig = null;
        encoding = null;
    }

    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
        this.encoding = filterConfig.getInitParameter("encoding");

    }
}


二、使浏览器不缓存页面的过滤器 
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 用于的使 Browser 不缓存页面的过滤器
 */
public class ForceNoCacheFilter implements Filter {

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain filterChain) throws IOException, ServletException {
        ((HttpServletResponse) response).setHeader("Cache-Control", "no-cache");
        ((HttpServletResponse) response).setHeader("Pragma", "no-cache");
        ((HttpServletResponse) response).setDateHeader("Expires", -1);
        filterChain.doFilter(request, response);
    }

    public void destroy() {
    }

    public void init(FilterConfig filterConfig) throws ServletException {
    }
}


三、检测用户是否登陆的过滤器
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.List;
import java.util.ArrayList;
import java.util.StringTokenizer;
import java.io.IOException;

/**
 * 用于检测用户是否登陆的过滤器,如果未登录,则重定向到指的登录页面
 * 
 * 配置参数
 * checkSessionKey 需检查的在 Session 中保存的关键字
 * redirectURL 如果用户未登录,则重定向到指定的页面,URL不包括 ContextPath
 * notCheckURLList 不做检查的URL列表,以分号分开,并且 URL 中不包括 ContextPath
 * 
 */
public class LoginFilter implements Filter {
    protected FilterConfig filterConfig = null;

    private String redirectURL = null;

    private List notCheckURLList = new ArrayList();

    private String sessionKey = null;

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

        HttpSession session = request.getSession();
        if (sessionKey == null) {
            filterChain.doFilter(request, response);
            return;
        }
        if ((!checkRequestURIIntNotFilterList(request))
                && session.getAttribute(sessionKey) == null) {
            response.sendRedirect(request.getContextPath() + redirectURL);
            return;
        }
        filterChain.doFilter(servletRequest, servletResponse);
    }

    public void destroy() {
        notCheckURLList.clear();
    }

    private boolean checkRequestURIIntNotFilterList(HttpServletRequest request) {
        String uri = request.getServletPath()
                + (request.getPathInfo() == null ? "" : request.getPathInfo());
        return notCheckURLList.contains(uri);
    }

    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
        redirectURL = filterConfig.getInitParameter("redirectURL");
        sessionKey = filterConfig.getInitParameter("checkSessionKey");

        String notCheckURLListStr = filterConfig
                .getInitParameter("notCheckURLList");

        if (notCheckURLListStr != null) {
            StringTokenizer st = new StringTokenizer(notCheckURLListStr, ";");
            notCheckURLList.clear();
            while (st.hasMoreTokens()) {
                notCheckURLList.add(st.nextToken());
            }
        }
    }
}


四、资源保护过滤器
import javax.servlet.Filter;
import javax.servlet.FilterConfig;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Iterator;
import java.util.Set;
import java.util.HashSet; 
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * This Filter class handle the security of the application.
 * 
 * It should be configured inside the web.xml.
 * 
 * @author Derek Y. Shen
 */
public class SecurityFilter implements Filter {
    // the login page uri
    private static final String LOGIN_PAGE_URI = "login.jsf";

    // the logger object
    private Log logger = LogFactory.getLog(this.getClass());

    // a set of restricted resources
    private Set restrictedResources;

    /** */
    /**
     * Initializes the Filter.
     */
    public void init(FilterConfig filterConfig) throws ServletException {
        this.restrictedResources = new HashSet();
        this.restrictedResources.add("/createProduct.jsf");
        this.restrictedResources.add("/editProduct.jsf");
        this.restrictedResources.add("/productList.jsf");
    }

    /** */
    /**
     * Standard doFilter object.
     */
    public void doFilter(ServletRequest req, ServletResponse res,
            FilterChain chain) throws IOException, ServletException {
        this.logger.debug("doFilter");

        String contextPath = ((HttpServletRequest) req).getContextPath();
        String requestUri = ((HttpServletRequest) req).getRequestURI();

        this.logger.debug("contextPath = " + contextPath);
        this.logger.debug("requestUri = " + requestUri);

        if (this.contains(requestUri, contextPath)
                && !this.authorize((HttpServletRequest) req)) {
            this.logger.debug("authorization failed");
            ((HttpServletRequest) req).getRequestDispatcher(LOGIN_PAGE_URI)
                    .forward(req, res);
        } else {
            this.logger.debug("authorization succeeded");
            chain.doFilter(req, res);
        }
    }

    public void destroy() {
    }

    private boolean contains(String value, String contextPath) {
        Iterator ite = this.restrictedResources.iterator();

        while (ite.hasNext()) {
            String restrictedResource = (String) ite.next();

            if ((contextPath + restrictedResource).equalsIgnoreCase(value)) {
                return true;
            }
        }

        return false;
    }

    private boolean authorize(HttpServletRequest req) {

        // 处理用户登录
        /*
         * UserBean user =
         * (UserBean)req.getSession().getAttribute(BeanNames.USER_BEAN);
         * 
         * if (user != null && user.getLoggedIn()) { //user logged in return
         * true; } else { return false; }
         */
    }
}



五 利用Filter限制用户浏览权限
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;

/**
 * 在一个系统中通常有多个权限的用户。不同权限用户的可以浏览不同的页面。
 * 使用Filter进行判断不仅省下了代码量,而且如果要更改的话只需要在Filter文件里动下就可以。 以下是Filter文件代码:
 */

public class RoleFilter implements Filter {

    public void destroy() {

    }

    public void doFilter(ServletRequest sreq, ServletResponse sres,
            FilterChain arg2) throws IOException, ServletException {
        // 获取uri地址
        HttpServletRequest request = (HttpServletRequest) sreq;
        String uri = request.getRequestURI();
        String ctx = request.getContextPath();
        uri = uri.substring(ctx.length());
        // 判断admin级别网页的浏览权限
        if (uri.startsWith("/admin")) {
            if (request.getSession().getAttribute("admin") == null) {
                request.setAttribute("message", "您没有这个权限");
                request.getRequestDispatcher("/login.jsp").forward(sreq, sres);
                return;
            }
        }
        // 判断manage级别网页的浏览权限
        if (uri.startsWith("/manage")) {
            // 这里省去
        }
        // 下面还可以添加其他的用户权限,省去。
    }

    public void init(FilterConfig arg0) throws ServletException {

    }

}


<!-- 判断页面的访问权限 -->
<filter>
    <filter-name>RightFilter</filter-name>
    <filter-class>cn.itkui.filter.RightFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>RightFilter</filter-name>
    <url-pattern>/admin/**//*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>RightFilter</filter-name>
    <url-pattern>/manage/*</url-pattern>
</filter-mapping>




在web.xml中加入Filter的配置,如下:
<filter>
    <filter-name>EncodingAndCacheflush</filter-name>
    <filter-class>EncodingAndCacheflush</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>EncodingAndCacheflush</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>



要传递参数的时候最好使用form进行传参,如果使用链接的话当中文字符的时候过滤器转码是不会起作用的,还有就是页面上form的method也要设置为post,不然过滤器也起不了作用。

分享到:
评论

相关推荐

    STM32的CAN过滤器详解.pdf

    每组过滤器可以是1个、2个或4个过滤器,这些过滤器并联工作,只要报文通过任意一个过滤器,就会被视为有效并进入相应的FIFO。 过滤器的工作模式主要有两种:标识符列表模式和标识符屏蔽位模式。在标识符列表模式下...

    过滤器图形符号(标准图形)

    ### 过滤器图形符号(标准图形) #### 知识点概述 在设计与工程技术领域,标准化图形符号的使用能够确保信息的有效传达与统一理解。《过滤器图形符号(标准图形)》一文介绍了几种常用的过滤器图形符号,这些符号...

    管道过滤器(软件体系结构)

    ### 管道过滤器(软件体系结构) #### 概述 随着软件系统规模和复杂性的不断增长,软件体系结构的设计变得尤为重要。良好的体系结构能够确保软件系统的成功部署与维护,而管道过滤器模式作为软件体系结构的一种...

    Servlet过滤器的简单使用源码+文档

    在标题"Servlet过滤器的简单使用源码+文档"中,我们可以理解为这个压缩包包含了一个关于Servlet过滤器的基础应用示例,以及相关的源代码和文档资料。描述中提到的"实现一个登陆界面",表明了过滤器可能被用作验证...

    多介质过滤器设计规范

    多介质过滤器设计规范主要涉及了工业水处理领域中一种重要的设备——多介质过滤器,其主要用于去除水中的悬浮物、胶体、微生物、有机物和油等杂质,以提升水质,确保供水满足使用需求。以下是对规范书中关键知识点的...

    servlet过滤器实例经典过滤器

    Servlet过滤器是Java Web开发中的一个重要组件,它允许开发者在请求到达Servlet之前或者响应离开Servlet之后进行拦截处理。本教程将深入讲解如何配置和使用Servlet过滤器,以及介绍五个经典的过滤器实例。 首先,让...

    JAVA过滤器标准代码

    ### JAVA过滤器标准代码解析与应用 在Java Web开发中,过滤器(Filter)是一种用于拦截请求和响应的重要机制,可以实现对用户请求的预处理和后处理,以及对响应的处理。本文将深入解析“JAVA过滤器标准代码”,探讨...

    管道过滤器程序,主要用java实现

    管道过滤器模式是一种设计模式,它在软件工程中被广泛应用于数据处理,特别是在Java编程语言中。这种模式通过连接一系列的处理组件(过滤器),每个组件执行特定的任务,来实现复杂的数据转换。在这个场景中,"管道...

    STM32 CAN过滤器滤波器配置详解

    STM32 CAN 过滤器滤波器配置详解 在嵌入式系统中,CAN(Controller Area Network)总线是常见的通信协议之一。STM32 微控制器也支持 CAN 通信协议。为了正确地实现 CAN 通信,需要了解 CAN 总线上的节点接收或发送...

    拦截器和过滤器的区别

    ### 拦截器与过滤器的区别 #### 一、概念简介 在现代软件开发过程中,特别是Web应用程序中,为了实现灵活高效的业务逻辑处理及控制流管理,常常会使用到两种设计模式:拦截器(Interceptor)与过滤器(Filter)。...

    Java过滤器,字符过滤,标签过滤

    首先,让我们了解一下Java过滤器的基础知识。在Java Servlet规范中,Filter接口定义了过滤器的行为。一个过滤器可以通过实现`doFilter()`方法来拦截请求和响应,并对其进行处理。通过在web.xml配置文件中定义过滤器...

    用户登陆过滤器

    在这个过滤器中,我们可以看到它主要由两部分组成:一部分是web.xml中的配置,另一部分是Java代码中的实现。 首先,在web.xml中,我们可以看到filter的配置,包括filter-name和filter-class两个参数。filter-name是...

    GridControl的过滤器的自定义

    "GridControl 的过滤器自定义查询" DevExpress 的 GridControl 提供了强大的过滤器功能,允许开发者自定义查询条件以满足复杂的数据检索需求。在本文中,我们将探讨如何自定义 GridControl 的过滤器以实现复杂的...

    servlet+jsp实现过滤器 防止用户未登录访问

    使用servlet和jsp技术时,我们可以通过过滤器(Filter)来实现这样的安全防护机制。过滤器是一种服务器端的组件,它能够对请求和响应进行拦截,执行一些预处理或者后处理操作。它常用于进行登录验证、权限检查、字符...

    过滤器文档过滤器使用中的方法过滤器.pdf

    本文档将深入探讨过滤器的使用及其功能。 **过滤器概述** 过滤器(Filter)的主要作用是对客户端发起的HTTP请求进行预处理,也可以在响应返回给客户端之前进行后处理。例如,过滤器可以用于以下用途: 1. **敏感...

    过滤器(java编写的过滤器)

    在Java Web开发中,过滤器(Filter)是一种非常重要的技术组件,它可以在请求到达目标资源(如Servlet或JSP页面)之前或之后执行某些操作。过滤器可以用来实现各种功能,如用户认证、权限检查、编码转换、日志记录等。...

    vue 内置过滤器的使用总结(附加自定义过滤器)

    Vue不仅内置了一些过滤器,还允许开发者自定义过滤器以满足特定需求。 首先,我们来看看Vue内置过滤器的使用。 Vue内置过滤器非常丰富,包括但不限于: - `capitalize`:将字符串首字母大写。 - `uppercase`:将...

    jsp中的过滤器(含例子)

    这里,我们定义了一个名为`CharacterEncodingFilter`的过滤器,并将其映射到所有URL(`/*`),意味着任何请求都会经过这个过滤器。 3. 最后,部署应用并测试。现在,无论用户发送什么请求,服务器都会自动将字符...

    带过滤器的登录系统jsp+myeclipse+mysql

    标题中的“带过滤器的登录系统jsp+myeclipse+mysql”表明这是一个使用Java服务器页面(JSP)、MyEclipse集成开发环境以及MySQL数据库构建的登录系统,其中整合了过滤器(Filter)技术。这样的系统通常用于实现用户...

    WAS 6.0.2.9 部署应用使用过滤器问题解决办法

    在WAS 6.0.2.9中,可能遇到的问题可能涉及到过滤器配置、过滤器链执行顺序、过滤器异常处理或过滤器与应用程序其他组件的交互等。 首先,让我们了解过滤器的基本概念。在web.xml配置文件中,我们定义过滤器,包括...

Global site tag (gtag.js) - Google Analytics