现在的位置: 首页 > 综合 > 正文

Filter的一些功能

2013年09月04日 ⁄ 综合 ⁄ 共 4811字 ⁄ 字号 评论关闭

Filter的功能主要有:

1、对用户请求进行过滤,Filter将通过doFilter方法来设置request编码的字符集,从而避免每个JSP 、Servlet都需要设置;

2、验证用户是否登录,如果用户没有登录,系统直接跳转到登录页面。

3、权限控制

4、记录日志

。。。。。。。。。。。。。。。。。。。。。。。。。。

mport javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;

import java.io.*;

@WebFilter(filterName="authority"
    , urlPatterns={"/*"}
    , initParams={
        @WebInitParam(name="encoding", value="GBK"),
        @WebInitParam(name="loginPage", value="/login.jsp"),
        @WebInitParam(name="proLogin", value="/proLogin.jsp")})
public class AuthorityFilter implements Filter
{
    //FilterConfig可用于访问Filter的配置信息
    private FilterConfig config;
    //实现初始化方法
    public void init(FilterConfig config)
    {
        this.config = config;
    }
    //实现销毁方法
    public void destroy()
    {
        this.config = null;
    }
    //执行过滤的核心方法
    public void doFilter(ServletRequest request,
        ServletResponse response, FilterChain chain)
        throws IOException,ServletException
    {
        //获取该Filter的配置参数
        String encoding = config.getInitParameter("encoding");
        String loginPage = config.getInitParameter("loginPage");
        String proLogin = config.getInitParameter("proLogin");
        //设置request编码用的字符集
        request.setCharacterEncoding(encoding);            //①
        HttpServletRequest requ = (HttpServletRequest)request;
        HttpSession session = requ.getSession(true);
        //获取客户请求的页面
        String requestPath = requ.getServletPath();
        //如果session范围的user为null,即表明没有登录
        //且用户请求的既不是登录页面,也不是处理登录的页面
        if( session.getAttribute("user") == null
            && !requestPath.endsWith(loginPage)
            && !requestPath.endsWith(proLogin))
        {
            //forward到登录页面
            request.setAttribute("tip" , "您还没有登录");
            request.getRequestDispatcher(loginPage)
                .forward(request, response);
        }
        //"放行"请求
        else
        {
            chain.doFilter(request, response);
        }
    }
}

web.xml

<?xml version="1.0" encoding="GBK"?>
<web-app 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_3_0.xsd"
    version="3.0">
    <!-- 定义Filter -->
    <filter>
        <!-- Filter的名字,相当于指定@WebFilter
            的filterName属性 -->
        <filter-name>log</filter-name>
        <!-- Filter的实现类 -->
        <filter-class>lee.LogFilter</filter-class>
    </filter>
    <!-- 定义Filter拦截的URL地址 -->
    <filter-mapping>
        <!-- Filter的名字 -->
        <filter-name>log</filter-name>
        <!-- Filter负责拦截的URL,相当于指定@WebFilter
            的urlPatterns属性 -->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 定义Filter -->
    <filter>
        <!-- Filter的名字 -->
        <filter-name>authority</filter-name>
        <!-- Filter的实现类 -->
        <filter-class>lee.AuthorityFilter</filter-class>
        <!-- 下面三个init-param元素配置了三个参数 -->
        <init-param>
            <param-name>encoding</param-name>
            <param-value>GBK</param-value>
        </init-param>
        <init-param>
            <param-name>loginPage</param-name>
            <param-value>/login.jsp</param-value>
        </init-param>
        <init-param>
            <param-name>proLogin</param-name>
            <param-value>/proLogin.jsp</param-value>
        </init-param>
    </filter>
    <!-- 定义Filter拦截的URL地址 -->
    <filter-mapping>
        <!-- Filter的名字 -->
        <filter-name>authority</filter-name>
        <!-- Filter负责拦截的URL -->
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

DFBOSS: 实现统一编码设置

WEB.XML

    <filter>
        <filter-name>encodingfilter</filter-name>
        <filter-class>com.XXX.oss.commons.filter.EncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>encodingfilter</filter-name>
        <url-pattern>*.jsp</url-pattern>

package com.XXX.oss.commons.filter;

import java.io.IOException;
import java.util.Map;

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

public class EncodingFilter extends HttpServlet implements Filter {
    /**
     *
     */
    private static final long serialVersionUID = 7257643104061201994L;

    private FilterConfig filterConfig;

    private String targetEncoding = "GBK";

    // Handle the passed-in FilterConfig
    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
    }

    // Process the request/response pair
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain filterChain) {
        try {
            request.setCharacterEncoding(targetEncoding);
            filterChain.doFilter(request, response);
        } catch (ServletException sx) {
            filterConfig.getServletContext().log(sx.getMessage());
        } catch (IOException iox) {
            filterConfig.getServletContext().log(iox.getMessage());
        }
    }

    // Clean up resources
    public void destroy() {
        filterConfig = null;
        targetEncoding = null;
    }
}

抱歉!评论已关闭.