`

通用的用户登录过滤器(SessionFilter)

    博客分类:
  • java
阅读更多

功能描述

        用于检查用户是否登录了系统,如果未登录,则重定向到指的登录页面。

使用方法

        在 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;
        }
 
//         * 请求 http://127.0.0.1:8080/webApp/home.jsp?&a=1&b=2
//          * 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日。创造易语言的初衷是进行用中文来...

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

    在本项目中,过滤器可能与拦截器协同工作,同样负责验证用户登录状态。通常,过滤器通过实现`javax.servlet.Filter`接口并重写`doFilter()`方法来实现。过滤器可以全局应用,对所有请求或特定URL模式生效。 **非法...

    JavaWeb开发几个常用的过滤器源码

    接下来,我们讨论第二个过滤器:检测用户是否登录的过滤器。这个过滤器通常用于保护某些需要登录才能访问的资源。如果用户未登录,过滤器会将其重定向到登录页面。以下是一个简单的实现: ```java public class ...

    jsp中的过滤器(含例子)

    总的来说,`JSP`中的过滤器是一个强大的工具,它能够帮助我们处理请求和响应,实现跨页面的通用功能,提升应用程序的安全性和用户体验。在实际开发中,熟练掌握过滤器的使用,将大大提升我们的开发效率和代码质量。

    ffmpeg filter过滤器基础实例以及全面解析

    它们被分门别类,如视频过滤器、音频过滤器和通用过滤器等。每一个过滤器都有其特定的用途和参数设置。 在使用FFmpeg过滤器时,首先要确保FFmpeg环境已正确安装,并且libavfilter库已经包含在内。接下来,我们可以...

    ASP-ISAPI通用防注入过滤器 v1.0

    ASP-ISAPI通用防注入过滤器 是一个基于IIS系统的组件,其拥有强大的防ASP注入功能.能在ASP程序本身存在注入漏洞的情况下防御注入攻击。同时它还具备防数据库下载、防止数据库扩展名被修改为asp后插入ASP语句攻击等...

    用过滤器验证

    通过使用过滤器,可以简化应用开发,并将一些通用功能(如登录验证、权限控制、编码转换等)从业务逻辑中分离出来。 #### 知识点二:过滤器的生命周期方法 过滤器具有以下三个主要方法: 1. **init(FilterConfig ...

    设计模式-拦截过滤器

    1. **过滤器接口(Filter Interface)**:定义了每个过滤器必须实现的通用方法,如`execute()`,该方法接收请求并决定如何处理。 2. **具体过滤器(Concrete Filters)**:实现了过滤器接口,每个过滤器负责执行...

    使用C++的一种很好通用性过滤器代码(带demo代码)

    在本文中,我们将深入探讨如何使用C++语言创建一个具有通用性和灵活性的过滤器系统,同时结合了Qt库。这个过滤器系统允许我们对各种容器中的元素进行筛选,支持多种过滤条件,使得代码更具可复用性和可扩展性。下面...

    通用浏览器多开CK登录器

    CK(Cookie)是浏览器用来存储用户登录状态的小型文本文件,此工具能够读取、保存和应用这些CK,使得用户无需手动登录各个账号,大大简化了操作流程。 在电商运营中,CK采集和管理是非常重要的一环。CK登录器的核心...

    ASP-ISAPI通用防注入过滤器 1.0 S_CXV

    ASP-ISAPI通用防注入过滤器 1.0 S_CXV 一个基于IIS系统的组件,其拥有强大的防ASP注入功能.能在ASP程序本身存在注入漏洞的情况下防御注入攻击。同时它还具备防数据库下载、防止数据库扩展名被修改为asp后插入ASP...

    结合struts2编写的通用过滤器filter

    在具体实现上,通用过滤器通常会检查请求URL、请求头、请求参数等,如果满足特定条件(比如非法登录),则可以重定向到错误页面或者阻止请求继续执行。在提供的Word文档中,可能详细解释了如何配置和使用这个过滤器...

    java过滤器和验证码

    过滤器和验证码是Java Web开发中的重要组成部分,主要用于提高应用程序的安全性和用户体验。下面将详细讲解这两个概念。 2.1.1 过滤器简介 ...3. 创建一个过滤器链,实现权限控制,只允许已登录用户访问特定页面。

    Go-Golang的过滤器包

    1. **Filter接口**:定义了过滤器的通用行为,如`Apply`方法,它接受输入并返回过滤后的结果。 2. **多种实现**:针对不同场景(如文件、数据结构、HTTP请求)的过滤器实现。 3. **配置**:可能提供了配置过滤器条件...

    过滤器与拦截器的区别

    而过滤器则是基于函数回调,它是Servlet规范的一部分,适用于对HTTP请求的通用处理,如字符编码转换、登录验证等。 其次,拦截器不依赖于Servlet容器,因此具有更强的灵活性和可扩展性,而过滤器则必须依赖于...

    ASP.NET MVC Filters 4种默认过滤器的使用

    ASP.NET MVC Filters 是一种...总之,ASP.NET MVC 过滤器提供了一种优雅的方式来处理应用程序中的通用行为,如授权、缓存和错误处理。通过合理利用这些过滤器,开发者可以创建更加安全、高效且易于维护的Web应用程序。

    Linux下GDI打印机驱动程序设计及其过滤器实现

    在Linux系统中,GDI(Graphics Device Interface)打印机驱动程序设计和过滤器实现是一个复杂的任务,涉及到操作系统内核、图形接口、打印系统以及文件格式转换等多个领域的知识。下面将详细阐述这一主题的主要内容...

    servlet过滤器详解

    1. **用户登录验证**:过滤器可以用来检查用户是否已经登录,如果没有登录,则重定向到登录页面。 2. **非法内容过滤**:对于在线社区、论坛等应用,可以使用过滤器来检测并替换掉用户提交的敏感词汇。 3. **统一...

    MVCFilter过滤器.rar

    2. **资源过滤器(Action Filters)**:资源过滤器在操作方法执行前后被调用,可用于执行通用的数据处理或缓存逻辑。比如,`[OutputCache]`用于缓存操作的结果,提高性能。 3. **响应过滤器(Response Filters)**...

    用户登录与用户管理通用模板vb

    用vb编写的用户登录与用户管理通用模板 包括验证码

Global site tag (gtag.js) - Google Analytics