功能描述
用于检查用户是否登录了系统,如果未登录,则重定向到指的登录页面。
使用方法
在 java web 项目的 web.xml 文件中添加如下代码,对每个参数都进行了详细的说明。
<!—检查用户是否登录了系统的过滤器配置 开始 --> < filter >
< filter-name >SessionFilter</ filter-name >
< filter-class >com.hmw.filter.SessionFilter</ filter-class >
< init-param >
< description >将当前登录的用户的信息保存在 session 中时使用的key,如果没有配置此参数,则该过滤器不起作用</ description >
< param-name >sessionKey</ param-name >
< param-value >userInfo</ param-value >
</ init-param >
< init-param >
< description >
如果用户未登录(即在 session 中 key 为 sessionKey 的属性不存在或为空),则将请求重定向到该 url。
该 url 不包含web应用的 ContextPath。
如果不配置此参数,则在用户未登录系统的情况下,直接重定向到web应用的根路径(/)
</ description >
< param-name >redirectUrl</ param-name >
< param-value >/login.jsp</ param-value >
</ init-param >
< init-param >
< description >
不需要进行拦截的 url 的正则表达式,即:如果当前请求的 url 的 servletPath 能匹配该正则表达式,则直接放行(即使未登录系统)。
此参数的值一般为 loginServlet 和 registServlet 等。
另外,参数 redirectUrl 的值不用包含在该正则表达式中,因为 redirectUrl 对应的 url 会被自动放行。
还有一点需要说明的是,该参数的值不包含web应用的 ContextPath。
</ description >
< param-name >excepUrlRegex</ param-name >
<!-- 不拦截 /servlets/loginServlet 和 /servlets/registServlet -->
< param-value >/servlets/(login|regist)Servlet</ param-value >
</ init-param >
</ filter >
< filter-mapping >
< filter-name >SessionFilter</ filter-name >
< url-pattern >/servlets/*</ url-pattern >
</ filter-mapping >
< filter-mapping >
< filter-name >SessionFilter</ filter-name >
< url-pattern >/jsp/*</ url-pattern >
</ filter-mapping >
<!—检查用户是否登录了系统的过滤器配置 结束 --> |
过滤器源码
package com.hmw.filter;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.regex.Pattern;
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 org.apache.commons.lang.StringUtils;
/** * 用于检查用户是否登录了系统的过滤器<br>
* 创建日期:2012-01-09
*/
public class SessionFilter implements Filter {
/** 要检查的 session 的名称 */
private String sessionKey;
/** 需要排除(不拦截)的URL的正则表达式 */
private Pattern excepUrlPattern;
/** 检查不通过时,转发的URL */
private String forwardUrl;
@Override
public void init(FilterConfig cfg) throws ServletException {
sessionKey = cfg.getInitParameter( "sessionKey" );
String excepUrlRegex = cfg.getInitParameter( "excepUrlRegex" );
if (!StringUtils.isBlank(excepUrlRegex)) {
excepUrlPattern = Pattern.compile(excepUrlRegex);
}
forwardUrl = cfg.getInitParameter( "forwardUrl" );
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
// 如果 sessionKey 为空,则直接放行
if (StringUtils.isBlank(sessionKey)) {
chain.doFilter(req, res);
return ;
}
// * request.getRequestURL(): http://127.0.0.1:8080/webApp/home.jsp // * request.getContextPath(): /webApp // * request.getServletPath():/home.jsp // * request.getRequestURI(): /webApp/home.jsp // * request.getQueryString():a=1&b=2 HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
String servletPath = request.getServletPath();
// 如果请求的路径与forwardUrl相同,或请求的路径是排除的URL时,则直接放行
if (servletPath.equals(forwardUrl) || excepUrlPattern.matcher(servletPath).matches()) {
chain.doFilter(req, res);
return ;
}
Object sessionObj = request.getSession().getAttribute(sessionKey);
// 如果Session为空,则跳转到指定页面
if (sessionObj == null ) {
String contextPath = request.getContextPath();
String redirect = servletPath + "?" + StringUtils.defaultString(request.getQueryString());
/*
* login.jsp 的 <form> 表单中新增一个隐藏表单域:
* <input type="hidden" name="redirect" value="${param.redirect }">
*
* LoginServlet.java 的 service 的方法中新增如下代码:
* String redirect = request.getParamter("redirect");
* if(loginSuccess){
* if(redirect == null || redirect.length() == 0){
* // 跳转到项目主页(home.jsp)
* }else{
* // 跳转到登录前访问的页面(java.net.URLDecoder.decode(s, "UTF-8"))
* }
* }
*/
response.sendRedirect(contextPath + StringUtils.defaultIfEmpty(forwardUrl, "/" )
+ "?redirect=" + URLEncoder.encode(redirect, "UTF-8" ));
} else {
chain.doFilter(req, res);
}
}
@Override
public void destroy() {
}
} |
相关推荐
易语言通用对话框设置过滤器方法 易语言是一门以中文作为程序代码编程语言,以“易”著称。创始人为吴涛。早期版本的名字为E语言。易语言最早的版本的发布可追溯至2000年9月11日。创造易语言的初衷是进行用中文来...
在本项目中,过滤器可能与拦截器协同工作,同样负责验证用户登录状态。通常,过滤器通过实现`javax.servlet.Filter`接口并重写`doFilter()`方法来实现。过滤器可以全局应用,对所有请求或特定URL模式生效。 **非法...
接下来,我们讨论第二个过滤器:检测用户是否登录的过滤器。这个过滤器通常用于保护某些需要登录才能访问的资源。如果用户未登录,过滤器会将其重定向到登录页面。以下是一个简单的实现: ```java public class ...
总的来说,`JSP`中的过滤器是一个强大的工具,它能够帮助我们处理请求和响应,实现跨页面的通用功能,提升应用程序的安全性和用户体验。在实际开发中,熟练掌握过滤器的使用,将大大提升我们的开发效率和代码质量。
它们被分门别类,如视频过滤器、音频过滤器和通用过滤器等。每一个过滤器都有其特定的用途和参数设置。 在使用FFmpeg过滤器时,首先要确保FFmpeg环境已正确安装,并且libavfilter库已经包含在内。接下来,我们可以...
ASP-ISAPI通用防注入过滤器 是一个基于IIS系统的组件,其拥有强大的防ASP注入功能.能在ASP程序本身存在注入漏洞的情况下防御注入攻击。同时它还具备防数据库下载、防止数据库扩展名被修改为asp后插入ASP语句攻击等...
通过使用过滤器,可以简化应用开发,并将一些通用功能(如登录验证、权限控制、编码转换等)从业务逻辑中分离出来。 #### 知识点二:过滤器的生命周期方法 过滤器具有以下三个主要方法: 1. **init(FilterConfig ...
1. **过滤器接口(Filter Interface)**:定义了每个过滤器必须实现的通用方法,如`execute()`,该方法接收请求并决定如何处理。 2. **具体过滤器(Concrete Filters)**:实现了过滤器接口,每个过滤器负责执行...
在本文中,我们将深入探讨如何使用C++语言创建一个具有通用性和灵活性的过滤器系统,同时结合了Qt库。这个过滤器系统允许我们对各种容器中的元素进行筛选,支持多种过滤条件,使得代码更具可复用性和可扩展性。下面...
CK(Cookie)是浏览器用来存储用户登录状态的小型文本文件,此工具能够读取、保存和应用这些CK,使得用户无需手动登录各个账号,大大简化了操作流程。 在电商运营中,CK采集和管理是非常重要的一环。CK登录器的核心...
ASP-ISAPI通用防注入过滤器 1.0 S_CXV 一个基于IIS系统的组件,其拥有强大的防ASP注入功能.能在ASP程序本身存在注入漏洞的情况下防御注入攻击。同时它还具备防数据库下载、防止数据库扩展名被修改为asp后插入ASP...
在具体实现上,通用过滤器通常会检查请求URL、请求头、请求参数等,如果满足特定条件(比如非法登录),则可以重定向到错误页面或者阻止请求继续执行。在提供的Word文档中,可能详细解释了如何配置和使用这个过滤器...
过滤器和验证码是Java Web开发中的重要组成部分,主要用于提高应用程序的安全性和用户体验。下面将详细讲解这两个概念。 2.1.1 过滤器简介 ...3. 创建一个过滤器链,实现权限控制,只允许已登录用户访问特定页面。
1. **Filter接口**:定义了过滤器的通用行为,如`Apply`方法,它接受输入并返回过滤后的结果。 2. **多种实现**:针对不同场景(如文件、数据结构、HTTP请求)的过滤器实现。 3. **配置**:可能提供了配置过滤器条件...
而过滤器则是基于函数回调,它是Servlet规范的一部分,适用于对HTTP请求的通用处理,如字符编码转换、登录验证等。 其次,拦截器不依赖于Servlet容器,因此具有更强的灵活性和可扩展性,而过滤器则必须依赖于...
ASP.NET MVC Filters 是一种...总之,ASP.NET MVC 过滤器提供了一种优雅的方式来处理应用程序中的通用行为,如授权、缓存和错误处理。通过合理利用这些过滤器,开发者可以创建更加安全、高效且易于维护的Web应用程序。
在Linux系统中,GDI(Graphics Device Interface)打印机驱动程序设计和过滤器实现是一个复杂的任务,涉及到操作系统内核、图形接口、打印系统以及文件格式转换等多个领域的知识。下面将详细阐述这一主题的主要内容...
1. **用户登录验证**:过滤器可以用来检查用户是否已经登录,如果没有登录,则重定向到登录页面。 2. **非法内容过滤**:对于在线社区、论坛等应用,可以使用过滤器来检测并替换掉用户提交的敏感词汇。 3. **统一...
2. **资源过滤器(Action Filters)**:资源过滤器在操作方法执行前后被调用,可用于执行通用的数据处理或缓存逻辑。比如,`[OutputCache]`用于缓存操作的结果,提高性能。 3. **响应过滤器(Response Filters)**...
用vb编写的用户登录与用户管理通用模板 包括验证码