`

检验用户登录信息(使有Filter,不过不完全方便)——2.0版

阅读更多

检测用户是否登陆的过滤器:

1). 情景: 系统中的某些页面只有在正常登陆后才可以使用,

                          用户请求这些页面时要检查 session 中有无该用户信息, 但在所有必要的页面加上session的判断相当麻烦的事情
                         
2). 解决方案:编写一个用于检测用户是否登陆的过滤器, 如果用户未登录, 则重定向到指的登录页面

3). 要求:需检查的在 Session 中保存的关键字; 如果用户未登录,需重定向到指定的页面(URL不包括 ContextPath);

                          不做检查的URL列表(以分号分开,并且 URL 中不包括 ContextPath)都要采取可配置的方式
                         
        <!-- 配置当前 web 应用的安全信息 -->

<!-- 配置用户正常登录后, 把用户信息保存在 Session 中的关键字 -->
<context-param>
<param-name>loginSessionKey</param-name>
<param-value>LOGIN-SESSION-KEY</param-value>
</context-param>

<!-- 配置用户的登录页面 -->
<context-param>
<param-name>loginPage</param-name>
<param-value>/login/login.jsp</param-value>
</context-param>

<!-- 配置不需要受保护的 url 列表 -->
<context-param>
<param-name>uncheckedPages</param-name>
<param-value>/login/login.jsp,/login/login-process.jsp,/login/articles.jsp,/login/logout.jsp</param-value>
</context-param>
                         
                         
4). 具体: article1.jsp, article2.jsp, article3.jsp, article4.jsp 必须登录之后才可以访问, 而 articles.jsp,

         login.jsp, login-process.jsp, logout.jsp 即使没有登录也可访问.   


login.jsp

<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Insert title here</title>
</head>
<body>
	
	<form action="login-process.jsp" method="post">
		name: <input type="text" name="name" />
		<input type="submit" value="Submit" />
	</form>
	
</body>
</html>




login-process.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<% 
	
	//处理用户登录的 JSP
	
	//1. 获取用户的登录信息, name
	String name = request.getParameter("name") ;
	
	//2. 把登录信息存储 Session 中. 
	//需要判断用户是否直接访问当前页面或在 login.jsp 页面没有输入任何信息就登录
	if(name != null && !name.trim().equals("")) {
		//OK, 在 Session 中保存用户信息, 转发到 /login/articles.jsp
		session.setAttribute(application.getInitParameter("loginSessionKey"), name) ;
		request.getRequestDispatcher("/login/articles.jsp").forward(request, response) ;
		
	}else {
	//直接登录或没有输入登录信息, 重定向到 /login/login.jsp
	response.sendRedirect(request.getContextPath() + "/login/login.jsp") ;
	}
	
%>   


articles.jsp

<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Insert title here</title>
</head>
<body>
	
	<a href="article1.jsp">Article111 Page</a>
	<br /><br />
	
	<a href="article2.jsp">Article222 Page</a>
	<br /><br />
	
	<a href="article3.jsp">Article333 Page</a>
	<br /><br />
	
	<a href="article4.jsp">Article444 Page</a>
	<br /><br />
	
	<a href="logout.jsp">Logout</a>
	
</body>
</html>


logout.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	Bye!
	
	<% 
		session.invalidate() ;
	%>
	
	<br><br>
	<a href="login.jsp">Login</a>
	
</body>
</html>



article1.jsp


	Article 111




article2.jsp

	Article 222



article3.jsp


	Article 333



article4.jsp

	Article 444



LoginFilter.java

package com.syh.filter;

import java.io.IOException;



import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
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;

public class LoginFilter implements Filter {

	private FilterConfig filterConfig ;
	
	@Override
	public void destroy() {

	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {
		//1. 验证访问的页面是否需要被拦截-->因为这个Filter是将/login/ 下的所有页面全部拦截了!
		ServletContext servletContext = filterConfig.getServletContext() ;
		
		//1.1. 获取请求的页面  request.getServletPath()
		HttpServletRequest request = (HttpServletRequest) req ;
		String servletPath = request.getServletPath() ;
		
		//1.2     获取 web.xml 中配置的 uncheckedPages 参数 --->不需要拦截的页面
		String uncheckedPages = servletContext.getInitParameter("uncheckedPages") ;
		
		//1.3  检验uncheckedPages 中是否包县servletPath
		//2. 若不需要被拦截(谁都可以直接访问的), 放行
		if(uncheckedPages.contains(servletPath)) {
			chain.doFilter(req, resp) ;
			return ;
		}

		//3. 若需要被拦截, 检查用户是否登陆  若登陆 允许访问; 若未登录, 重定向到 web.xml 文件中 loginPage 配置的页面 
		HttpSession session = request.getSession();
		String loginSessionKey = servletContext.getInitParameter("loginSessionKey") ;
		//获取 户信息保存在 Session 中的关键字
		Object obj = session.getAttribute(loginSessionKey) ;
		
		if(null == obj) {
			HttpServletResponse response = (HttpServletResponse) resp ;
			response.sendRedirect(request.getContextPath() + "/" + servletContext.getInitParameter("loginPage")) ;
		} else {
			chain.doFilter(req,resp) ;
		}

	}

	@Override
	public void init(FilterConfig config) throws ServletException {
		this.filterConfig = config ;
	}

}




web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	
		<filter>
			<filter-name>LoginFilter</filter-name>
			<filter-class>com.syh.filter.LoginFilter</filter-class>
		</filter>
	
		<filter-mapping>
			<filter-name>LoginFilter</filter-name>
			<!-- 要过滤的页面 -->
			<url-pattern>/login/*</url-pattern>
		</filter-mapping>
	
		<!-- 配置当前 web 应用的安全信息 -->
	
		<!-- 配置用户正常登录后, 把用户信息保存在 Session 中的关键字 -->
		<context-param>
			<param-name>loginSessionKey</param-name>
			<param-value>LOGIN-SESSION-KEY</param-value>
		</context-param>
		
		<!-- 配置用户的登录页面 -->
		<context-param>
			<param-name>loginPage</param-name>
			<param-value>/login/login.jsp</param-value>
		</context-param>
		
		<!-- 配置不需要受保护的 url 列表 -->
		<context-param>
			<param-name>uncheckedPages</param-name>
			<param-value>/login/login.jsp,/login/login-process.jsp,/login/articles.jsp,/login/logout.jsp</param-value>
		</context-param>

</web-app>


分享到:
评论

相关推荐

    精通windows server 2008 命令行与powershell 电子书PDF单文件完整版

    精通windows server 2008 命令行与powershell 电子书PDF单文件完整版 内容简介: 本书全面地介绍了Windows Server 2008命令行、PowerShell和脚本的使用,包括文件和文件夹的管理、磁盘管理、系统管理、活动目录...

    精通windows server 2008 命令行与powershell电子书PDF版(第一卷)

    6.6.3 finger——查看登录用户信息 320 6.6.4 query——终端服务查询 320 6.6.5 reset session——重置会话 323 第7章 系统诊断 324 7.1 relog——导出性能日志文件 324 7.2 typeperf——性能计数器 325 7.3 ...

    精通windows server 2008 命令行与powershell 电子书PDF版(第四卷)

    6.6.3 finger——查看登录用户信息 320 6.6.4 query——终端服务查询 320 6.6.5 reset session——重置会话 323 第7章 系统诊断 324 7.1 relog——导出性能日志文件 324 7.2 typeperf——性能计数器 325 7.3 ...

    精通windows server 2008 命令行与powershell电子书PDF版(第三卷)

    6.6.3 finger——查看登录用户信息 320 6.6.4 query——终端服务查询 320 6.6.5 reset session——重置会话 323 第7章 系统诊断 324 7.1 relog——导出性能日志文件 324 7.2 typeperf——性能计数器 325 7.3 ...

    精通windows server 2008 命令行与powershell电子书PDF版(第二卷)

    6.6.3 finger——查看登录用户信息 320 6.6.4 query——终端服务查询 320 6.6.5 reset session——重置会话 323 第7章 系统诊断 324 7.1 relog——导出性能日志文件 324 7.2 typeperf——性能计数器 325 7.3 ...

    通达信指标——杠上开花主图(主图).doc

    通达信指标——杠上开花主图(主图) 本文将对通达信指标——杠上开花主图(主图)进行详细的解释和分析,从而生成相关的知识点。 首先,让我们从标题“通达信指标——杠上开花主图(主图)”开始。通达信指标是一...

    asp.net知识库

    使用ASP.NET 2.0 Profile存储用户信息[翻译] Level 200 [ASP.NET 2.0]PageParser.GetCompiledPageInstance中存在一个Bug 如何在DotNet 2的登录组件中检索用户的锁定状态及解锁? ASP.NET 2.0, 想说爱你不容易 ...

    Excel公式与函数大辞典.宋翔(带书签高清文字版).pdf

    最后3 章还将公式与函数的应用扩展到了条件格式、数据验证及图表中,以便使它们发挥更强大的功能。本书采用理论与实践相结合的方式,提供了457 个案例,涉及多个行业,读者可以根据书中的案例举一反三,将其直接应用...

    OPhone平台2D游戏引擎实现——物理引擎

    OPhone平台2D游戏引擎实现——物理引擎(一) OPhone平台开发, 2010-10-19 17:27:20 标签 : Ophone平台 2D 游戏 引擎  上一篇文章我们介绍了常见的各种游戏特效的实现,你现在可以很轻松的实现各种游戏中所需要...

    自适应全变分图像去噪模型及其快速求解

    —————————————————————————————————— This paper combined shock filter with anisotropic diffusion to preprocess the noisy images, and used the edge detection filters to ...

    光纤通信技术课件 清华大学王建萍 共8章——课程总结 part1

    Multiplexer and Filter 3.6 光隔离器与环行器 3.7 光调制器Modulators 3.8 光开关Switches 3.9 光波长转换器 3.10 光交叉互连器 4 激光器及光发射机 4.1 半导体激光二极管LD 4.2 半导体激光器的工作特性 4.3 光...

    光纤通信技术课件 清华大学王建萍 共8章——课程总结 part2

    Multiplexer and Filter 3.6 光隔离器与环行器 3.7 光调制器Modulators 3.8 光开关Switches 3.9 光波长转换器 3.10 光交叉互连器 4 激光器及光发射机 4.1 半导体激光二极管LD 4.2 半导体激光器的工作特性 4.3 光...

    程控交换实验、用户模块电路 主要完成BORSCHT七种功能,它由下列电路组成:

    在任何时候或者系统出现不正常状态时都可按下此键重启系统(有用户通话时,会中断通话),所有设置均为默认值。 图1-5是显示电路工作示意说明图。 主叫号码显示 计时显示 被叫号码显示 图1-5 显示电路 开 ...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    3.9.2 学生管理系统中用户登录模块 3.10 疑难解惑 3.10.1 表单提交中文数据乱码 3.10.2 如何在超链接中传递多个参数 3.10.3 重定向后出现404错误 3.11 精彩回顾 第4章 体验面向对象 1IavaBean技术 4.1 本章学习任务...

    数字图像处理-平滑滤波处理

    MATLAB 数字图像处理——平滑滤波处理 数字图像处理中的平滑...平滑滤波在数字图像处理中有广泛的应用,例如图像降噪、模糊效果、边缘检测等。选择适当的平滑滤波方法和参数取决于具体的应用场景和要处理的图像特点。

    JAVA性能瓶颈和漏洞检测

    ——提高开发效率,改善JAVA应用性能 * 轻松发现和消除性能瓶颈 * 查找问题代码 * 节省后续硬件及开发投入 * 增加应用发布信心 * 与开发过程集成,改善应用性能 JProbe Suite是一种能节省开发时间、降低开发费用...

    挑战图像处理100问(13)——MAX-MIN滤波

    Max_Min Filter Author: Tian YJ 原图如下: MAX-MIN滤波器使用网格内像素的最大值和最小值的差值对网格内像素重新赋值。通常用于边缘检测。 边缘检测用于检测图像中的线。像这样提取图像中的信息的操作被称为特征...

    JAVA性能瓶颈和漏洞检测.JProbe.Suite.v7.0.part2

    ——提高开发效率,改善JAVA应用性能 * 轻松发现和消除性能瓶颈 * 查找问题代码 * 节省后续硬件及开发投入 * 增加应用发布信心 * 与开发过程集成,改善应用性能 JProbe Suite是一种能节省开发时间、降低开发费用...

    JAVA性能瓶颈和漏洞检测].JProbe.Suite.v7.0.part1

    ——提高开发效率,改善JAVA应用性能 * 轻松发现和消除性能瓶颈 * 查找问题代码 * 节省后续硬件及开发投入 * 增加应用发布信心 * 与开发过程集成,改善应用性能 JProbe Suite是一种能节省开发时间、降低开发费用...

    脱壳的艺术 加解密必备参考书的中文翻译版 CHM格式

    脱壳是门艺术——脱壳既是一种心理挑战,同时也是逆向领域最为激动人心的智力游戏之一。为了甄别或解决非常难的反逆向技巧,逆向分析人员有时不得不了解操作系统的一些底层知识,聪明和耐心也是成功脱壳的关键。这个...

Global site tag (gtag.js) - Google Analytics