在Web开发中,用户登录状态的验证是个绕不开的话题。你肯定遇到过这样的情况:用户没登录就想直接访问后台管理页面,系统脆弱得像纸糊的一样。所以,我们通常会在每个受保护的页面前加一道“门禁”,只有登录过的用户才能进入,否则就乖乖跳转到登录页。

实现这个“门禁”的方式有好几种,最直接的想法是在每个JSP页面里手动判断session是否存在。逻辑很简单:如果session里没有用户信息,就跳转登录页;否则正常渲染页面。但问题也很明显——如果项目里有几十个JSP页面,每个都要写一遍重复的判断代码,维护起来简直是一场噩梦。

更好的方案是使用过滤器(Filter)。它就像一道统一的安检闸机,所有请求在到达目标页面之前,都会先经过过滤器。你只需要在过滤器中验证session,如果通过就放行,否则直接重定向到登录页。这样,业务代码和权限验证就彻底解耦了。

下面给出一个具体的实现,关键逻辑都写在 LoginFilter 类里:

package com.test.filter;

import ja va.io.IOException;
import ja va.io.PrintWriter;
import ja vax.servlet.FilterConfig;
import ja vax.servlet.ServletException;
import ja vax.servlet.Filter;
import ja vax.servlet.FilterChain;
import ja vax.servlet.ServletRequest;
import ja vax.servlet.ServletResponse;
import ja vax.servlet.http.HttpServletRequest;
import ja vax.servlet.http.HttpServletResponse;
import ja vax.servlet.http.HttpSession;

public class LoginFilter implements Filter {

    public static final String login_page = "/test/admin/index.jsp";
    public static final String logout_page = "/test/admin/Public/login.jsp";

    public void destroy() {
    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
            FilterChain filterChain) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        String currentURL = request.getRequestURI();
        String ctxPath = request.getContextPath();
        // 除掉项目名称时访问页面当前路径
        String targetURL = currentURL.substring(ctxPath.length());
        HttpSession session = request.getSession(false);
        // 对当前页面进行判断,如果当前页面不为登录页面
        if (!("/admin/Public/login.jsp".equals(targetURL))) {
            System.out.println("1" + targetURL + "ctxPath:" + ctxPath + "currentURL:" + currentURL);
            // 在不为登陆页面时,再进行判断,如果不是登陆页面也没有session则跳转到登录页面
            if (session == null || session.getAttribute("admin") == null) {
                response.sendRedirect(logout_page);
                return;
            } else {
                // 这里表示正确,会去寻找下一个链,如果不存在,则进行正常的页面跳转
                filterChain.doFilter(request, response);
                return;
            }
        } else {
            // 这里表示如果当前页面是登陆页面,跳转到登陆页面
            filterChain.doFilter(request, response);
            return;
        }
    }

    public void init(FilterConfig filterConfig) throws ServletException {
    }
}

过滤器写好之后,别忘了在 web.xml 里注册它,并指定拦截规则。这里我们只对 *.jsp 后缀的请求生效,其他静态资源不受影响:


    LoginFilter
    com.test.filter.LoginFilter


    LoginFilter
    
    *.jsp

配置完成后,整个登录验证机制就自动生效了。以后每新增一个JSP页面,都无需再写重复的session判断,过滤器会统一拦截并处理。这个思路不仅适用于JSP项目,换成Spring MVC的Filter或者Shiro框架,原理也大同小异。

本文转载于:https://www.jb51.net/article/159909.htm 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。