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


免責聲明!

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



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