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() {

    }
}

 

posted @ 2019-11-14 17:09  萧然成长记  阅读(2456)  评论(0编辑  收藏  举报