• SpringMVC——拦截器,过滤器实现登录拦截


    一、拦截器与过滤器的区别

      1、过滤器

      依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等

      2、拦截器

      依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上基于java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是能对controller请求进行拦截,可以拦截静态资源,但是拦截不了jsp页面

    二、登陆拦截的实现思路

      思路:即将请求的url地址进行解析,除了登录外的请求都要进行拦截或者过滤,这些请求在通过登录的判断,来决定最后的结果

      2.1拦截器实现登陆拦截

        2.1.1创建拦截器

    public class LoginInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("进行拦截");
            //获取请求的RUi:去除http:localhost:8080这部分剩下的
            String uri = request.getRequestURI();
            System.out.println(uri);
           //UTL:除了login.jsp是可以公开访问的,其他的URL都进行拦截控制
            if (uri.indexOf("/login") >= 0) {
                System.out.println("这是登录页面");
                  return true;
            }
            //获取session
            HttpSession session = request.getSession();
            Users user = (Users) session.getAttribute("user");
            //判断session中是否有用户数据,如果有,则返回true,继续向下执行
            if (user != null) {
                System.out.println("有数据");
    
                return true;
            }
             //不符合条件的给出提示信息,并转发到登录页面
            response.sendRedirect("login.jsp");
            System.out.println("非法");
    
            return false;
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
        }
    }

        2.1.2 配置拦截器

     <!--拦截器映射-->
        <mvc:interceptors>
            
            <mvc:interceptor>
                <mvc:mapping path="/**"/>
                <bean class="com.invoicing.interceptor.LoginInterceptor"></bean>
    
            </mvc:interceptor>
        </mvc:interceptors>

         2.1.3 注意:

         因为拦截器无法拦截jsp页面,所以,直接登录jsp页面无法拦截。

         将所有的jsp文件放入到WEB-INF文件夹下,这样用户是直接不能访问WEB-INF文件下的jsp文件的。spring mvc的理念也是通过controller里的@RequestMapping来请求相关jsp页面,而非用户直接访问jsp页面。

      2.2 过滤器实现

        2.2.1导入依赖:

    <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
          <scope>provided</scope>
        </dependency>

        2.2.2编写过滤器:

    @WebServlet(urlPatterns = {"/*"})
    public class MyFilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            HttpServletRequest httpServletRequest=(HttpServletRequest) servletRequest;
            System.out.println("123");
            //放行URL
            if (httpServletRequest.getRequestURI().indexOf("/login") >= 0) {
                filterChain.doFilter(servletRequest,servletResponse);
            }
    
            Object user = httpServletRequest.getSession().getAttribute("user");
            if (user==null){
                httpServletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
            }else {
                //放行请求
                filterChain.doFilter(servletRequest,servletResponse);
            }
    
        }
    
        @Override
        public void destroy() {
    
        }
    }
  • 相关阅读:
    怎样理解 display:none 和 visibility:hidden
    怎样设置鼠标悬浮时弹出的文字提示框内容
    怎样获取当前元素节点的语言类型
    怎样控制元素节点的是否可拖动属性
    怎样读写分配给当前元素的快捷键
    怎样获取元素节点的标签名称
    怎样查看或修改元素节点的id属性
    怎样使用js将文本复制到系统粘贴板中
    怎样创建一个子树遍历器
    怎样创建一个子节点遍历器
  • 原文地址:https://www.cnblogs.com/xiao-ran/p/11858662.html
Copyright © 2020-2023  润新知