`

登录验证过滤器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);  
            } 

相关推荐

    jsp+servlet登录验证过滤器

    在这个项目中,“jsp+servlet登录验证过滤器”涉及了用户登录验证的过程,以及使用过滤器(Filter)来实现这一功能。下面将详细介绍这个主题中的相关知识点。 1. **JSP**:JSP是一种服务器端的技术,允许开发者在...

    过滤器(Filter)

    过滤器可以用来实现诸如登录验证、数据转换、日志记录等功能,为Web应用程序提供了强大的扩展性。 首先,我们需要理解过滤器的基本工作原理。当用户向服务器发送一个请求时,过滤器会按照在web.xml中的配置顺序被...

    使用过滤器实现判断用户是否登录验证.

    在这个场景下,我们讨论的是如何使用过滤器来实现用户登录验证的功能。下面将详细解释这一过程。 首先,我们需要了解过滤器的基本概念。在Java Web应用中,过滤器是实现了javax.servlet.Filter接口的类。它们通过在...

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

    在"使用过滤器完成用户登录验证"的场景中,我们将创建一个过滤器类,该类实现了Filter接口并重写了doFilter()方法。在这个方法里,我们可以检查请求中是否有有效的登录信息,例如通过检查请求头中的session或cookie...

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

    在本例中,要实现一个简单的登录验证过滤器,可以阻止未登录用户访问除了登录页面以外的其他后台管理页面。通过实现javax.servlet.Filter接口,我们创建了一个LoginFilter类。这个过滤器会在每个请求到达目标页面...

    servlet 过滤器做的简单登陆demo

    在这个例子中,过滤器的主要任务是对每个请求进行登录验证。如果用户未登录,过滤器将拦截请求并重定向到登录页面。一旦用户成功登录,通常会将用户信息(如用户名或ID)存储在会话(session)中。 3. **Session和...

    jsp filter 过滤器判断用户是否登录

    通过使用过滤器(Filter),可以在请求到达目标资源(如Servlet或JSP页面)之前进行处理,例如实现登录状态检查、权限验证等功能。下面我们就通过分析一个具体的示例代码来详细了解如何使用JSP Filter过滤器来判断...

    Filter(过滤器)简介和工作原理

    * 认证和授权:可以使用 Filter 来实现认证和授权功能,例如检查用户的登录状态和权限。 * 日志记录:可以使用 Filter 来记录客户端的请求和响应信息,以便进行日志记录和分析。 * 缓存处理:可以使用 Filter 来实现...

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

    在这个场景中,我们将探讨如何利用授权过滤器来验证用户的登录状态。 首先,了解.NET MVC过滤器的基本概念。过滤器在.NET MVC中扮演着拦截器的角色,可以应用于控制器或特定的动作,执行预处理和后处理任务。主要有...

    过滤器(filter) 例子源码

    过滤器可以用于执行诸如数据校验、身份验证、字符编码转换、日志记录等多种任务,提高了代码的可复用性和模块化。 ### 二、过滤器的工作原理 过滤器的工作流程遵循以下步骤: 1. 用户发起HTTP请求。 2. 服务器...

    servlet过滤器验证用户登录

    在IT领域,特别是Java Web开发中,Servlet过滤器(Filter)是实现用户权限管理、登录状态验证等关键功能的重要机制之一。本文将深入探讨如何利用Servlet过滤器来验证用户是否已登录,以及如何配置过滤器以针对特定的...

    jsp登录验证(含过滤器)

    本项目"jsp登录验证(含过滤器)"主要关注如何利用过滤器实现用户登录验证,并在会话(Session)中设置全局变量以跟踪用户的登录状态。以下将详细讲解这个知识点。 1. **JSP基础** JSP是基于Java的服务器端脚本...

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

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

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

    本项目主要关注的是如何使用过滤器(Filter)和拦截器(Interceptor)来实现登录页面的控制与跳转。以下是对这些知识点的详细说明: 1. **SpringBoot**: SpringBoot是Spring框架的一个子项目,旨在简化Spring应用...

    过滤器验证用户登录.rar

    在这个"过滤器验证用户登录"项目中,我们关注的是如何利用过滤器来实现用户身份的验证,确保只有已登录的用户才能访问特定的Web资源。这个项目结合了IntelliJ IDEA这一强大的Java开发工具,为开发者提供了高效且专业...

    Struts2编写的通用(拦截器,过滤器)Filter

    这个名为"Struts2编写的通用(拦截器,过滤器)Filter"的项目,主要目标是防止用户非法访问未授权的页面,确保只有登录用户才能访问特定的资源。 **拦截器(Interceptor)** 拦截器是Struts2框架的核心特性之一,它...

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

    通过这个简单的登录示例,你可以学习到如何利用Servlet过滤器检查用户登录状态,确保只有已登录的用户才能访问特定的受保护资源。过滤器提供了一种灵活的方式来增强应用程序的功能,无需修改原有的Servlet代码,对于...

    filter过滤器防止恶意注入

    在Java Web开发中,`Filter`过滤器是一个关键的安全组件,用于拦截并处理HTTP请求和响应。本示例中的`URLfilter`类就是一个简单的过滤器,它的主要目的是防止SQL注入攻击,这是一种常见的恶意攻击手段,攻击者试图...

    过滤器验证用户是否已经登录

    过滤器验证用户是否已经登录 在基于 JSP 页面系统设计开发中,经常有一批页面需要对用户的身份进行验证,只有合法的用户才可以访问这些页面。为了解决 JSP 页面用户身份验证的问题,可以使用 Servlet 过滤器对 JSP ...

    过滤器filter和监听器listener的应用总结

    **过滤器Filter** 过滤器是在Servlet规范中定义的一种机制,允许开发者在请求到达目标Servlet或者JSP之前对请求进行拦截处理,也可以在响应发送回客户端之前对响应进行修改。Filter的主要作用包括数据校验、字符...

Global site tag (gtag.js) - Google Analytics