JavaWeb 过滤器——验证登录 防止未登录进入界面

昨天刚刚完成老师布置的一个Web小项目,项目中用到了两个过滤器(编码过滤、登录过滤)

比如电商网页中有些不需要登录也能访问(首页、商品详细信息...),其他都需要过滤在会话作用域(session)中是否含有个人信息对象

示例代码:

package com.star.miniShop.Filter;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

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;

@WebFilter("/*")
public class LoginFiter implements Filter{
  //实例化一个静态的集合(这里可以改用map集合,提高性能,每次过滤可以不用for匹配)
    private static List<String> urls = new ArrayList<>();
    //静态代码块中向集合中存放所有可以放行的请求或网页地址(不用账号密码即可访问)
    static {
        urls.add("/logining");
        urls.add("/shopLogin.html");
        urls.add("/css");
        urls.add("/js");
        urls.add("/images");
        urls.add("/shopHome.html");
        urls.add("/HomeShop");
        urls.add("/Searchs");
        urls.add("/regist");
        urls.add("/shopRegist.html");
    }
    
    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        
    }
    

/**
* 拦截请求,看看用户是否登陆,如果没有登陆,
* 则跳转回登录页面,否则就放行
*/


    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
      //注意:ServletRequest是HttpServletRequest父接口,因此需要强转
      //同样,ServletResponse是HttpServletResponse父接口,因此需要强转

        HttpServletRequest req=(HttpServletRequest)request;
        HttpServletResponse res=(HttpServletResponse)response; 
      //得到当前页面所在目录下全名称
        String urlPattern=req.getServletPath();
      //得到页面所在服务器的绝对路径
        String path = req.getRequestURI();
        //System.out.println(urlPattern);
        for (String url : urls) {
            if(url.equals(urlPattern) || path.contains(url)) {
        //        System.out.println("reaource do chain...");
                chain.doFilter(request, response);
                //防止重复响应
                return;
            }
        }
        //如果person为null,表示没有登录
        if(req.getSession().getAttribute("person")==null) {
            res.sendRedirect("shopLogin.html");
        }else { 
            //放行
            chain.doFilter(request, response);
        }
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
        
    }

}
原文地址:https://www.cnblogs.com/hhmm99/p/9368162.html