过滤器实现判断用户是否登录未登录则跳转登录页面———java笔记

该文章介绍如何创建一个过滤器类,实现Filter接口,用于检查用户是否登录。如果用户未登录,系统将重定向到登录页面。过滤器在每次请求时运行,通过AntPathMatcher匹配请求URI,决定是否允许访问特定路径。文章提供了具体的Java代码示例和在web.xml中的配置方法。

需求

为了不让没有登录的用户来访问我们的网站,希望在每次请求的时候检查用户是否登录,如果没有登录则跳转到登录界面。

思路:

1.新建过滤器类实现Filter接口并在dofilter方法中写下判断逻辑
2.使用web.xml配置或者使用注解进行配置

实例代码:

1.新建过滤器类实现Filter接口并在dofilter方法中写下判断逻辑,我这里的登录界面是index.jsp。另外这里的limitStr 是根据自己的去求来设置的,你也可以只是限制固定的访问地址,或者直接在web.xml的配置中来设置要限制的地址格式。

package ssm.filter;

import org.springframework.util.AntPathMatcher;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @Description: 过滤器检查是否登录,如果没有登录则自动跳转到登录页面
 * 过滤器在服务器启动的时候就就会初始化,每次访问只会调用dofilter方法
 */

public class LoginCheckFilter implements Filter {
    //路径匹配器,支持通配符
    public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request1 = (HttpServletRequest) request;
        HttpServletResponse response1 = (HttpServletResponse) response;

        //1、获取本次请求的URI
        String requestURI1 = request1.getRequestURI();// /backend/index.html
        String requestURI = request1.getServletPath();
        System.out.println("拦截到请求:{}"+requestURI);

        //定义需要处理的请求路径
        String[] limitStr = new String[]{
                "/jsp/system/**",
                "/muban1Action/qusrTpl.do/**"
        };

        //定义已经在limitStr中但是又不想处理的地址
        String[] urls = new String[]{
                "/jsp/system/index.jsp",
                "/jsp/system/AdminLogin.jsp"
        };

        //2、判断本次请求是否需要处理
        boolean check = check(limitStr,urls, requestURI);

        //3、如果不需要处理,则直接放行
        if(check){
            //System.out.println("本次请求{}不需要处理"+requestURI);
            chain.doFilter(request,response);
            return;
        }

        //4-1、判断登录状态,如果已登录,则直接放行
        if(request1.getSession().getAttribute("user") != null){
            System.out.println("用户已登录,用户id为:{}"+request1.getSession().getAttribute("user"));
            chain.doFilter(request,response);
            return;
        }

        System.out.println("用户未登录");
        //5、如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据
        //response1.getWriter().write(JSON.toJSONString(""));
        String basePath = request.getScheme() + "://" + request.getServerName() + ":" +
                request.getServerPort() +((HttpServletRequest) request).getContextPath()+"/jsp/system/index.jsp";//绝对地址
       // request.getRequestDispatcher(basePath).forward(request,response);
        response1.sendRedirect(basePath);
        return;
    }

    @Override
    public void destroy() {

    }

    /**
     * 路径匹配,检查本次请求是否需要放行
     * @param urls
     * @param requestURI
     * @return
     */
    public boolean check(String[] limitStr,String[] urls,String requestURI){
        boolean isOk = true;
        for (String url : limitStr) {//是否在限制目录中
            boolean match = PATH_MATCHER.match(url, requestURI);
            if(match){
                isOk= false;//false表示需要处理
            }
        }
        for (String url : urls) {//是否在放行目录中
            boolean match = PATH_MATCHER.match(url, requestURI);
            if(match){
                isOk= true;//true表示放行
            }
        }
        System.out.println("==============="+requestURI);
        return isOk;
    }
}

2.使用web.xml配置或者使用注解进行配置
这里的url-pattern可以自己设置,我这里是设置过滤所有的请求

    <!--登录检查过滤器-->
    <filter>
        <filter-name>LoginCheckFilter</filter-name>
        <filter-class>ssm.filter.LoginCheckFilter</filter-class><!--src下的 路径-->
    </filter>
    <filter-mapping>
        <filter-name>LoginCheckFilter</filter-name>
        <url-pattern>/*</url-pattern><!--过滤所有的请求-->
    </filter-mapping>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我这头发越来越多呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值