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 感谢大佬分享!

  • 相关阅读:
    [转载]Linux 线程实现机制分析
    Linux命令学习总结:cp命令
    ORA-01012: not logged on
    TNS-12540: TNS:internal limit restriction exceeded
    ORACLE临时表空间总结
    ORACLE回收站机制介绍
    SQL Server 2008 R2 Service Pack 3 已经发布
    python中的单下划线和双下划线意义和作用
    redis基本命令的演示:
    redis百度百科和维基百科知识总结:
  • 原文地址:https://www.cnblogs.com/SI0301/p/11261107.html
Copyright © 2011-2022 走看看