ssm框架實現使用者登入的攔截器和過濾器

ssm框架實現使用者登入的攔截器和過濾器

文章只要是實現使用者登入過程的驗證,用攔截器可以攔截使用者沒有登入的情況下,不能進行訪問系統頁面

以下是自定義攔截器工程目錄實現的過程:

1:新建一個 interceptor 攔截器包,建立一個 LoginInterceptor 攔截器類

2:將這個類,繼承 HandlerInterceptor 介面,並實現 HandlerInterceptor 這個介面的三個方法

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 uri = request.getRequestURI(); // 獲取登入的uri,這個是不進行攔截的
//if(session.getAttribute("LOGIN_USER")!=null || uri.indexOf("system/login")!=-1) {// 說明登入成功 或者 執行登入功能			
if(session.getAttribute("LOGIN_USER")!=null) {
// 登入成功不攔截
return true;
}else {
// 攔截後進入登入頁面
response.sendRedirect(request.getContextPath() "/system/login");
return false;
}
}
}

3:攔截器是要配置的,將這個類,配置在 spring-mvc.xml 的配置檔案中,如下:

        <!-- 配置攔截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 攔截所有mvc控制器 -->
<mvc:mapping path="/**"/>
<!-- mvc:exclude-mapping是另外一種攔截,它可以在你後來的測試中對某個頁面進行不攔截,這樣就不用在
LoginInterceptor的preHandler方法裡面獲取不攔截的請求uri地址了(優選) -->
<mvc:exclude-mapping path="/system/login" />
<bean class="com.lingshi.bookstore.interceptor.LoginInterceptor"></bean>			
</mvc:interceptor>
</mvc:interceptors>

將登陸攔截器類 LoginInterceptor,配置到裡面

這個攔截器有2個知識要點:

①:

<mvc:mapping path="/**"/> 是已經攔截了所有請求,包括登入,如果後來想不攔截某個頁面,就在攔截配置裡面配置 
<mvc:exclude-mapping path="/system/login" />

②:也可以不在配置檔案裡攔截某個頁面請求,在攔截類裡面獲取攔截路徑,然後做個判斷

eg:

//String uri = request.getRequestURI(); // 獲取登入的uri,這個是不進行攔截的
//if(session.getAttribute("LOGIN_USER")!=null || uri.indexOf("system/login")!=-1)

4:頁面:

<div align="center">
<br><br><br>
<!-- 作業:post方法與get方法的區別 -->
<form action="${pageContext.request.contextPath}/system/login" method="post">
<p>使用者登入</p>
賬號:<input name="account" type="text" />
<br><br>
密碼:<input name="password" type="password" />
<br><br>
<input type="reset" value="撤 銷" />
<input type="submit" value="提 交" />
</form>
</div>

攔截器已經實現了。

二:過濾器

過濾器就分兩步:新建過濾器類,接著配置web.xml

1:

建一個LoginFilter 類,繼承 Filter 類

public class LoginFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
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("LOGIN_USER")==null
&& request.getRequestURI().indexOf("/system/login") == -1){
// 沒有登入
response.sendRedirect(request.getContextPath() "/system/login");
}else{
// 已經登入,繼續請求下一級資源(繼續訪問)
arg2.doFilter(arg0, arg1);
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}

2:配置 web.xml ,在字元過濾器下面接著配置一個過濾器

	
<!-- 使用filter實現登入控制 -->
<filter>
<filter-name>SessionFilter</filter-name>
<filter-class>com.lingshi.bookstore.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SessionFilter</filter-name>
<!-- 所有的管理頁面需要登入後才能訪問 -->
<url-pattern>/views/*</url-pattern>
</filter-mapping>

將過濾器類  LoginFilter  配置到 過濾器配置檔案中,即可完成

過濾器也實現了