Filter过滤器 过滤请求

Filter用法

一、过滤请求,没登录的情况(session不存),请求资源(没有安全框架的前提)

1.SessionFilter类

package com.huaxia.base.utils;

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;

/**
 * Session Filter,用来控制请求 其中参数logonPages,登陆页面 includePages,哪些页面需要过滤.
 * redirectPath,没有登陆时的转向页面 userAttributeName Session中“用户”对象的标示名
 * disabletestfilter,过滤器是否有效。
 * @author spring
 * @since 2006.1.12
 */
public class SessionFilter implements Filter {
    /**
     * 判断字符串里是否包含指定的字符模式.
     * @param container 要判断的字符串 .
     * @param regx 匹配的字符模式 .
     * @return boolean .
     */
    private static boolean isContains(String container, String[] regx) {
        boolean result = false;

        for (String item : regx) {
            if (container.indexOf(item) != -1) {
                return true;
            }
        }
        return result;
    }

    /**
     * sevelet Filter Config.
     */
    private FilterConfig config = null;

    /**
     * 本过滤器是否失效.
     */
    private boolean disableFilter = false;

    /**
     * 用来判断Sessoin 是否登陆过.
     */
    private String userAttributeName = null;

    /**
     * 系统的登陆页面.
     */
    private String[] loginPages = null;

    /**
     * 没有登陆时的重定向页面(一般同登陆页面).
     */
    private String redirectPath = null;

    /**
     * 设置完FilterConfig之后的逻辑.
     */
    public void afterSetFilterConfig() {
        disableFilter = "Y".equalsIgnoreCase(config
                .getInitParameter("disabletestfilter"));
        userAttributeName = config.getInitParameter("userAttributeName");
        String loginStrings = config.getInitParameter("loginPages");
        loginPages = loginStrings.split(";");
        redirectPath = config.getInitParameter("redirectPath");
    }

    /**
     * 进行request filter.
     * @param request http request
     * @param response http response
     * @param chain filer chain
     * @throws IOException io exception
     * @throws ServletException servlet exception
     */
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {

        HttpServletRequest httpreq = (HttpServletRequest) request;
        HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper(
                (HttpServletResponse) response);

        if (disableFilter) {
            chain.doFilter(request, response);
            return;
        }
        if (isContains(httpreq.getRequestURI(), loginPages)) {
            chain.doFilter(request, response);
            return;
        }
        Object user = httpreq.getSession().getAttribute(userAttributeName);
        if (user == null) {

            wrapper.sendRedirect(redirectPath);

        } else {
            chain.doFilter(request, response);
        }
    }

    /**
     * 初始化.
     * @param filterConfig servlet filter config
     * @throws ServletException sevlet exception when error
     */
    public void init(FilterConfig filterConfig) throws ServletException {
        this.config = filterConfig;
        this.afterSetFilterConfig();
    }

    /**
     * destroy.
     */
    public void destroy() {
        // nothing to do

    }
}

2.web.xml里面配置

<!-- 登陆Session控制过滤器 -->
	<filter>
		<filter-name>SessionFilter</filter-name>
		<filter-class>com.huaxia.base.utils.SessionFilter</filter-class>
		<init-param>
			<param-name>userAttributeName</param-name>
			<param-value>HUAXIA_CURRENT_USER</param-value>
		</init-param>
		<init-param>
			<param-name>loginPages</param-name>
			<param-value>login.jsp;Login.do;trade/personalOrderReq.do;query/prodList.do;query/personalProdList.do;query/orderResult.do;trade/orderReq.do;trade/orderReply.do;query/trafficQuery.do;trade/xinhuaTelcom/orderReply.do;trade/telcom/orderReply.do;trade/osai/orderReply.do;trade/tongyi/orderReply.do;/trade/xinhao/orderReply</param-value>
		</init-param>
		<init-param>
			<param-name>redirectPath</param-name>
			<param-value>login.jsp</param-value>
		</init-param>
		<init-param>
			<param-name>disabletestfilter</param-name>
			<param-value>N</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>SessionFilter</filter-name>
		<url-pattern>*.jsp</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>SessionFilter</filter-name>
		<url-pattern>*.do</url-pattern>
	</filter-mapping>


二、登录强制修改登录密码

1.RemindChangePasswordFilter 类


package com.huaxia.auth.utils;

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 RemindChangePasswordFilter implements Filter {
	
	 /**
     * 判断字符串里是否包含指定的字符模式.
     * @param container 要判断的字符串 .
     * @param regx 匹配的字符模式 .
     * @return boolean .
     */
    private static boolean isContains(String container, String[] regx) {
        boolean result = false;

        for (String item : regx) {
            if (container.indexOf(item) != -1) {
                return true;
            }
        }
        return result;
    }

    /**
     * sevelet Filter Config.
     */
    private FilterConfig config = null;

    /**
     * 本过滤器是否失效.
     */
    private boolean disableFilter = false;

    /**
     * 用来判断是否需要强制修改密码.
     */
    private String forcedToChangePassword = null;
    /**
     * 系统的登陆页面.
     */
    private String[] loginPages = null;
    /**
     * 没有完成密码修改时的重定向页面.
     */
    private String redirectPath = null;

    /**
     * 设置完FilterConfig之后的逻辑.
     */
    public void afterSetFilterConfig() {
        disableFilter = "Y".equalsIgnoreCase(config
                .getInitParameter("disabletestfilter"));
        String loginStrings = config.getInitParameter("loginPages");
        loginPages = loginStrings.split(";");
        forcedToChangePassword = config.getInitParameter("forcedToChangePassword");
        redirectPath = config.getInitParameter("redirectPath");
    }

    /**
     * 进行request filter.
     * @param request http request
     * @param response http response
     * @param chain filer chain
     * @throws IOException io exception
     * @throws ServletException servlet exception
     */
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {

        HttpServletRequest httpreq = (HttpServletRequest) request;
        HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper(
                (HttpServletResponse) response);

        if (disableFilter) {
            chain.doFilter(request, response);
            return;
        }
        if (isContains(httpreq.getRequestURI(), loginPages)) {
            chain.doFilter(request, response);
            return;
        }
        Object forcedToChangePasswordFlag = httpreq.getSession().getAttribute(forcedToChangePassword);
        if (forcedToChangePasswordFlag != null) {

            wrapper.sendRedirect(redirectPath);

        } else {
            chain.doFilter(request, response);
        }
    }

    /**
     * 初始化.
     * @param filterConfig servlet filter config
     * @throws ServletException sevlet exception when error
     */
    public void init(FilterConfig filterConfig) throws ServletException {
        this.config = filterConfig;
        this.afterSetFilterConfig();
    }

    /**
     * destroy.
     */
    public void destroy() {
        // nothing to do

    }

}


2.web.xml配置

	<!-- 强制修改密码的过滤器-->
	<filter>
        <filter-name>RemindChangePasswordFilter</filter-name>
        <filter-class>com.huaxia.auth.utils.RemindChangePasswordFilter</filter-class>
        <init-param>
            <param-name>loginPages</param-name>
            <param-value>login.jsp;Login.do;Logout.do;DisplayForced2ChangePWAction.do;Forced2ChangePWAction.do</param-value>
        </init-param>
        <init-param>
            <param-name>forcedToChangePassword</param-name>
            <param-value>FORCED_TO_CHANGE_PASSWORD</param-value>
        </init-param>
        <init-param>
            <param-name>redirectPath</param-name>
            <param-value>DisplayForced2ChangePWAction.do</param-value>
        </init-param>
        <init-param>
            <param-name>disabletestfilter</param-name>
            <param-value>N</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>RemindChangePasswordFilter</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>RemindChangePasswordFilter</filter-name>
        <url-pattern>*.do</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>RemindChangePasswordFilter</filter-name>
        <url-pattern>/</url-pattern>
    </filter-mapping>








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值