检测用户是否登陆的过滤器:
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>
分享到:
相关推荐
当检测到未登录的用户尝试访问受保护的资源时,系统会重定向至登录页面。 5. **登录验证**:用户在任一应用登录后,需要在其他所有应用中更新登录状态。这通常通过调用一个中央验证服务完成,该服务会检查会话状态...
例如,它可以用来检测电子邮件中的垃圾邮件,或者在社交网络中检查用户是否已经添加了某个朋友,而无需存储完整的用户列表。 总结来说,Bloom Filter是一种在大数据处理中节省空间并提高查询效率的工具,尤其适合于...
《数字信号处理——基于计算机的方法(第四版)MATLAB源程序》是一本深入探讨数字信号处理理论与实践的教材,作者为余翔宇。这本书特别强调了计算机在信号处理中的应用,采用MATLAB这一强大的计算工具,使得读者能够...
精通windows server 2008 命令行与powershell 电子书PDF单文件完整版 内容简介: 本书全面地介绍了Windows Server 2008命令行、PowerShell和脚本的使用,包括文件和文件夹的管理、磁盘管理、系统管理、活动目录...
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 ...
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 ...
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 ...
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 ...
这份名为“安卓Android源码——网络连接状态检测.zip”的压缩包包含了一个AndroidDemo项目,用于演示如何在Android系统中检查网络连接状态。下面,我们将深入探讨这个主题。 首先,Android提供了...
SQL注入是一种攻击技术,攻击者通过在输入字段中插入恶意的SQL代码,以获取、修改、删除数据库中的敏感信息,甚至完全控制数据库服务器。 在这个靶场中,用户可以尝试模拟不同的SQL注入攻击,例如基于错误的注入、...
《滤波器设计软件——Nuhertz Filter Solutions v11详解》 在电子工程领域,滤波器设计是一项至关重要的任务,它涉及到信号处理、通信系统、音频工程等多个方面。滤波器的主要功能是筛选特定频率范围内的信号,对不...
例如,可能有`LowPassFilter`、`HighPassFilter`、`BandPassFilter`和`BandStopFilter`等类,每个类内部可能包含系数计算、滤波算法实现等方法。 总的来说,这个C#代码库为理解和应用数字信号处理中的FIR滤波器提供...
标题中的“过滤敏感词汇1.0版——仅仅是最简单的过滤”指的是一个初步的文本过滤系统,主要用于检测和移除或替换文本中的敏感词汇。在互联网环境中,为了维护网络秩序,防止不良信息传播,这类系统通常被用于论坛、...
- **内存的检测**: 检测并记录可用的物理内存。 - **设置键盘属性**: 配置键盘的初始状态。 - **填充系统环境配置表**: 配置各种系统环境参数。 - **填充IST信息**: IST(Interrupt Stack Table)用于保存中断...
通达信指标——杠上开花主图(主图) 本文将对通达信指标——杠上开花主图(主图)进行详细的解释和分析,从而生成相关的知识点。 首先,让我们从标题“通达信指标——杠上开花主图(主图)”开始。通达信指标是一...
Matlab的图像滤波功能非常强大,能够通过编程实现各种复杂的图像处理算法,包括但不限于图像增强、图像降噪、边缘检测等。 图像滤波程序通常用于改善图像质量,去除图像中的噪声,或者为了突出图像的特定特征而进行...
总之,"Java笔试题——精华中的精华"这份资料包含了Java开发的广泛领域,无论是初学者还是有经验的开发者,都可以通过这些题目来检验和提升自己的技术水平。掌握这些知识点,将有助于你在Java编程的世界中游刃有余。
2. 生命周期:Filter有三个关键的生命周期方法——`init()`, `doFilter()`, 和 `destroy()`。`init()`在Filter实例化时调用,用于初始化;`doFilter()`是核心方法,用于处理每个请求;`destroy()`在Filter被销毁前...
《多用户检测匹配滤波器仿真——MATLAB实现》 在无线通信系统中,多用户检测(Multi-User Detection, MUD)是一项关键技术,尤其是在频谱资源紧张、多个用户共享同一信道的情况下。多用户检测的目标是提高系统性能...