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

    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM