`

登录验证过滤器Filter

web 
阅读更多

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

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.HttpSession;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.csair.amp.web.webinf.common.model.LoginInfo;

/**
 * 用户登陆验证过滤器
 * 
 * @author ahomeeye
 * 
 *         2012-6-01
 * 
 */
public class SSOFilter implements Filter {

	private Log log = LogFactory.getLog(SSOFilter.class);
	private String loginUrl;//登录后跳转到的URL
	private String redirectPath;//登录URL
        //不过滤的URL
	private List<String> noFiltList = new ArrayList<String>();
        //不过滤的后缀
	private List<String> skipSuffixList = new ArrayList<String>();


	/**
	 * 创建一个用户登陆验证过滤器对象,一般由容器调用
	 */
	public SSOFilter() {
		super();
	}

	/**
	 * 过滤器销毁,由容器调用 空实现
	 */
	public void destroy() {
	}

	/**
	 * 用户登录过滤,由容器调用
	 */
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;
		HttpSession session = req.getSession();

		// 清除页面缓存
		res.setHeader("Pragma", "no-cache");
		res.setHeader("Cache-Control", "no-cache");
		res.setDateHeader("Expires", 0);

		// 获取根路径
		String path = req.getServletPath();
		if (isInNoFiltList(path, this.noFiltList)
				|| isInSkipList(path, this.skipSuffixList)) {
			chain.doFilter(request, response);
			return;
		}

		if (this.redirectPath.equalsIgnoreCase(path) || "/".equals(path)) {
			if (authentication(session)) {
				res.sendRedirect(this.loginUrl);
			} else {
				chain.doFilter(request, response);
				return;
			}
		} else {
			if (authentication(session) == false) {
				// 权限受限,返回提示信息页面
				String url = req.getContextPath() + this.redirectPath;
				res.sendRedirect(url);
			} else {
				chain.doFilter(req, res);
			}
		}

	}

	/**
	 * 初始化方法,容器调用
	 */
	public void init(FilterConfig filterConfig) throws ServletException {
		this.redirectPath = filterConfig.getInitParameter("redirectPath");
		this.loginUrl = filterConfig.getInitParameter("loginPath");

		String ignoreUrl = filterConfig.getInitParameter("ignoreUrl");
		if (ignoreUrl != null) {
			String[] no = ignoreUrl.split(",");
			if (no != null && no.length > 0) {
				for (String n : no) {
					noFiltList.add(n);
				}
			}
		}

		String skipSuffix = filterConfig.getInitParameter("skipSuffixes");
		if (skipSuffix != null) {
			skipSuffix = skipSuffix.toLowerCase();
			String[] skip = skipSuffix.split(",");
			if (skip != null && skip.length > 0) {
				for (String s : skip) {
					skipSuffixList.add(s);
				}
			}
		}
	}	

	/**
	 * 判断路径是否跳过验证
	 * @param path 请求的资源路径
	 * @param list 跳过验证的后缀列表
	 * @return
	 */
	private boolean isInSkipList(String path, List<String> list) {
		if (path == null || list == null) {
			return false;
		}

		path = path.toLowerCase();
		for (int i = 0; i < list.size(); i++) {
			if (path.endsWith("." + list.get(i))) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 判断特定的路径是否在跳过验证文件名列表中
	 * @param path 请求的资源路径
	 * @param list 跳过验证的文件名列表
	 * @return
	 */
	private boolean isInNoFiltList(String path, List<String> list) {
		if (path == null || list == null) {
			return false;
		}

		if (list.contains(path)) {
			return true;
		}
		return false;
	}

	/**
	 * 认证用户登陆信息
	 * 
	 * @param session
	 *            用户请求会话
	 * @return True/False 用户是否已经登录
	 */
	private boolean authentication(HttpSession session) {
		LoginInfo user = (LoginInfo) session.getAttribute("user");
		if (user != null) {
			if (user.getUsername() == null || user.getUsername().equals("")) {
				log.error("SSO invalid[Can not get username from session.]");
				return false;
			} else if (user.getPassword() == null
					|| user.getPassword().equals("")) {
				log.error("SSO invalid[Can not get password from session.]");
				return false;
			}

			if (user.getUsername() != null && !user.getUsername().equals("")
					&& user.getPassword() != null
					&& !user.getPassword().equals("")) {// 用户名和密码非空
				log.info("SSO success[User is valid.]");
				return true;
			}
		} else {
			log.error("SSO invalid[Can not get user from session.]");
		}
		return false;
	}

}




LoginInfo是用户信息JavaBean,包含username和password两个属性。

web.xml添加内容:
	<filter>
		<filter-name>ssoFilter</filter-name>
		<filter-class>com.csair.amp.web.webinf.fliters.SSOFilter</filter-class>
		<init-param>
			<param-name>ignoreUrl</param-name>
			<param-value>/error.html,/limited.html,/login/security.inf,/security/login.inf</param-value>
		</init-param>
		<init-param>
			<param-name>redirectPath</param-name>
			<param-value>/index.html</param-value>
		</init-param>
		<init-param>
			<param-name>loginPath</param-name>
			<param-value>/main.html</param-value>
		</init-param>
		<init-param>
			<param-name>skipSuffixes</param-name>
			<param-value>pdf,jpg,png,txt,css,gif,js</param-value>
		</init-param>
	</filter>

	<filter-mapping>
		<filter-name>ssoFilter</filter-name>
		<url-pattern>*.inf</url-pattern>
		<url-pattern>*.html</url-pattern>
		<url-pattern>/</url-pattern>
	</filter-mapping>


html5的缓存配置文件为cache.manifest,该文件web在项目根目录下,添加内容:

//需要缓存的资源
CACHE: 
views/index.html

//不要缓存的资源
NETWORK:
/index.html

分享到:
评论
2 楼 ahomeeye 2012-07-13  
yunye 写道
   认证通过后,怎么都跳转到同一个页面去了, 不是很理解。
private String loginUrl;//登录后跳转到的URL

if (authentication(session)) {  
                res.sendRedirect(this.loginUrl);  
            } 

意思是已经登录的情况下直接输入根目录或登录页面时直接跳转到主页面。
1 楼 yunye 2012-07-13  
   认证通过后,怎么都跳转到同一个页面去了, 不是很理解。
private String loginUrl;//登录后跳转到的URL

if (authentication(session)) {  
                res.sendRedirect(this.loginUrl);  
            } 

相关推荐

    .NET MVC授权过滤器验证登录

    .NET MVC授权过滤器验证登录,使用Filter过滤器 验证用户登录Authorization Filter

    使用过滤器完成用户登录验证

    使用过滤器完成用户登录验证 学习过滤器参考文件

    servlet 过滤器做的简单登陆demo

    servlet 过滤器做的简单登陆demo 初学者的简单例子。

    Java SpringBoot实现的过滤器(和拦截器)控制登录页面跳转

    该压缩包实现了利用过滤器或者拦截器对登录信息进行验证跳转登陆页的功能,利用的是SpringBoot和thymeleaf,使用前请先看使用说明

    jsp实现登录验证的过滤器

    本文实例为大家分享了jsp实现登录验证的过滤器,供大家参考,具体内容如下 1.新建一个Dynamic Web Project项目,里面新建1个filter文件、1个servlet文件和2个jsp文件,整体的框架如图所示: 2.LoginFilter.java里面...

    java自定义filter过滤特定请求并记录日志

    自定义过滤器,过滤请求接口的请求,认证用户并记录日志

    jsp中的过滤器(含例子)

    jsp中的过滤器,含例子,一看就会

    Servlet过滤器使用

    1、Filter接口:所有的Servlet过滤器类都必须实现javax.servlet.Filter接口 a、init(FilterConfig): 这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。在这个方法中可以读取...

    拦截过滤器模式

    拦截过滤器模式(Intercepting Filter Pattern)用于对应用程序的请求或响应做一些预处理/后处理。定义过滤器,并在把请求传给实际目标应用程序之前应用在请求上。过滤器可以做认证/授权/记录日志,或者跟踪请求,...

    PHP Filter过滤器全面解析

    PHP 过滤器用于验证和过滤来自非安全来源的数据,比如用户的输入。 什么是 PHP 过滤器? PHP 过滤器用于验证和过滤来自非安全来源的数据。 验证和过滤用户输入或自定义数据是任何 Web 应用程序的重要组成部分。 ...

    filterus-masterPHP过滤库.zip

    PHP 过滤器用于验证和过滤来自非安全来源的数据,比如用户的输入。什么是 PHP 过滤器?PHP 过滤器用于验证和过滤来自非安全来源的数据。验证和过滤用户输入或自定义数据是任何 Web 应用程序的重要组成部分。设计 ...

    undertow-cors-filter:一个过滤器,用于在基于Underwow的服务器(Wildfly,JBOSS EAP)中正确处理CORS标头

    Undertow-cors-filter 一个过滤器,用于在基于Underwow的服务器(Wildfly,JBOSS EAP)中正确处理CORS标头Java EE的过滤器处理似乎有所疏忽,因为当容器配置了容器管理的授权并且尚未(尚未)通过身份验证的用户尝试...

    YII Framework的filter过滤器用法分析

    本文实例讲述了YII Framework的filter过滤器用法。分享给大家供大家参考,具体如下: 首先看官方给出的说明文档,什么是过滤器,过滤器的作用,过滤器的规则,过滤器的定义方法等等。 然后对过滤器进行一个总结。 ...

    PHP内置过滤器FILTER使用实例

    主要介绍了PHP内置过滤器FILTER使用实例,列举了验证功能和纠错功能的代码例子来讲解如何使用FILTER,需要的朋友可以参考下

    如何使用java过滤器(filter)进行登陆验证?

    因为需要使用request方法中的getRequestURI()获取资源请求路径,Filter里的request是ServletRequest类型的而getRequsetURI()方法是HttpServletRequest类型的。所以首先需要强制转换。之后,就判断一下是否初始化页面...

    PHP的Yii框架中过滤器相关的使用总结

    例如, 访问控制过滤器将被执行以确保在执行请求的动作之前用户已通过身份验证;性能过滤器可用于测量控制器执行所用的时间。 一个动作可以有多个过滤器。过滤器执行顺序为它们出现在过滤器列表中的顺序。过滤器可以...

    shiroFilter权限验证

    -- authc:该过滤器下的页面必须验证后才能访问,它是Shiro内置的一个拦截器org.apache.shiro.web.filter.authc.FormAuthenticationFilter --&gt; &lt;property name="filterChainDefinitions"&gt; /statics/**=anon ...

    聊一聊Asp.net过滤器Filter那一些事

    最近在整理优化.net代码时,发现几个很不友好的处理现象:登录判断、权限认证、日志记录、异常处理等通用操作,在项目中的action中到处都是。在代码优化上,这一点是很重要着力点。这时.net中的过滤器、拦截器...

    Servlet之过滤器

    很有用的几个过滤器编程的例子,验证非法文字、验证登录和统一编码

    cas无过滤器 j2ee系统接入示例

    给使用某些没有filter框架java系统接入cas单点登录样例,导入工程到eclipse即可运行,查看main servlet 调用CasValidate类与cas服务器进行交互验证获取登录帐号

Global site tag (gtag.js) - Google Analytics