zoukankan      html  css  js  c++  java
  • ssm框架实现用户登录的拦截器和过滤器

    文章主要是实现用户登录过程的验证,用拦截器/过滤器可以拦截用户没有登录的情况下,不能进行访问系统页面

    一:拦截器

    以下是自定义拦截器工程目录实现的过程:

    1:新建一个 interceptor 拦截器包,创建一个 LoginInterceptor 拦截器类

    2:将这个类,继承 HandlerInterceptor 接口,并实现 HandlerInterceptor 这个接口的三个方法

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    public class LoginInterceptor implements HandlerInterceptor {
     
        @Override
        public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
                throws Exception {
            // 执行完毕,返回前拦截        
        }
     
        @Override
        public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
                throws Exception {
            // 在处理过程中,执行拦截        
        }
     
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
            // 在拦截点执行前拦截,如果返回true则不执行拦截点后的操作(拦截成功)
            // 返回false则不执行拦截
            HttpSession session = request.getSession();
            String url = request.getRequestURI(); // 获取登录的uri,这个是不进行拦截的    
            //if(session.getAttribute("_CURRENT_USER")!=null || url.indexOf("home.action")!=-1 || url.indexOf("login.action")!=-1) {
            if(session.getAttribute("_CURRENT_USER")!=null) {
                // 登录成功不拦截
                return true;
            }else {
                // 拦截后进入登录页面
                response.sendRedirect(request.getContextPath()+"/home.action");
                return false;
            }
        }
    }

    3:拦截器是要配置的,将这个类,配置在 spring-mvc.xml 的配置文件中,如下:

        <mvc:interceptors>
            <mvc:interceptor>
                <!-- 拦截所有mvc控制器 -->
                <mvc:mapping path="/**"/>
    <!--             mvc:exclude-mapping是另外一种拦截,它可以在你后来的测试中对某个页面进行不拦截,这样就不用在
                    LoginInterceptor的preHandler方法里面获取不拦截的请求uri地址了(优选) -->
                <mvc:exclude-mapping path="/home.action" />
                <mvc:exclude-mapping path="/login.action" />
                <bean class="cn.itcast.util.LoginInterceptor"></bean>            
            </mvc:interceptor>
        </mvc:interceptors>

    将登陆拦截器类 LoginInterceptor,配置到里面

    这个拦截器有2个知识要点:

    ①:

    <mvc:mapping path="/**"/> 是已经拦截了所有请求,包括登录,如果后来想不拦截某个页面,就在拦截配置里面配置 
    <mvc:exclude-mapping path="/login.action" />

    ②:也可以不在配置文件里拦截某个页面请求,在拦截类里面获取拦截路径,然后做个判断

    //String uri = request.getRequestURI(); // 获取登录的uri,这个是不进行拦截的
            //if(session.getAttribute("LOGIN_USER")!=null || uri.indexOf("/login.action")!=-1)

    二:过滤器

    过滤器就分两步:新建过滤器类,接着配置web.xml

    建一个LoginFilter 类,继承 Filter 类

    import java.io.IOException;
    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 javax.servlet.http.HttpSession;
    
    public class LoginFilter implements Filter {
     
        public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
                throws IOException, ServletException {
            // TODO Auto-generated method stub
            HttpServletRequest request = (HttpServletRequest)arg0;
            HttpServletResponse response = (HttpServletResponse)arg1;
            HttpSession session = request.getSession();
            
    /*        if(session.getAttribute("_CURRENT_USER") != null){
                arg2.doFilter(arg0, arg1);
                return;
            }
            if(request.getRequestURI().indexOf("home.action") != -1 || request.getRequestURI().indexOf("login.action") != -1){
                arg2.doFilter(arg0, arg1);
                return;
            }
            // 没有登录
            response.sendRedirect(request.getContextPath()+"/home.action");*/
    
            if(session.getAttribute("_CURRENT_USER")==null && request.getRequestURI().indexOf("/home.action") == -1
                        && request.getRequestURI().indexOf("/login.action") == -1 // -1表示不存在该url
                    ){
                // 没有登录
                response.sendRedirect(request.getContextPath()+"/home.action");
            }else{
                // 已经登录,继续请求下一级资源(继续访问)
                arg2.doFilter(arg0, arg1);
            }
        }
     
        public void init(FilterConfig arg0) throws ServletException {
            // TODO Auto-generated method stub
        }
         
        public void destroy() {
            // TODO Auto-generated method stub
        }
    }

    2:配置 web.xml ,在字符过滤器下面接着配置一个过滤器

        <!-- 5.使用filter实现登录控制 -->
        <filter>
            <filter-name>LoginFilter</filter-name>
            <filter-class>cn.itcast.util.LoginFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>LoginFilter</filter-name>
            <!-- 所有的管理页面需要登录后才能访问 -->
            <url-pattern>/*</url-pattern>
        </filter-mapping>

    将过滤器类  LoginFilter  配置到 过滤器配置文件中,即可完成

    过滤器也实现了

    内容大部分来自https://blog.csdn.net/chenxihua1/article/details/80779234 感谢大佬分享!

  • 相关阅读:
    printcap
    browser-ua
    PHP 开发 APP 接口 学习笔记与总结
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode70 爬楼梯
  • 原文地址:https://www.cnblogs.com/SI0301/p/11261107.html
Copyright © 2011-2022 走看看