SSM專案中使用攔截器和過濾器
- 一、攔截器概述
- 二、攔截器配置步驟
- 1、創建一個攔截器(實作HandlerInterceptor介面)
- 2、配置攔截器
- 3、測驗下攔截器:
- 三、過濾器概述
- 四、過濾器配置步驟
- 1、創建一個過濾器(實作Filter介面)
- 2、配置web.xml
- 3、測驗過濾器
- 五、總結
一、攔截器概述
Spring MVC 也可以使用攔截器對請求進行攔截處理,用戶可以自定義攔截器來實作特定 的功能,自定義的攔截器必須實作 HandlerInterceptor 介面
- preHandle():這個方法在業務處理器處理請求之前被呼叫,在該方法中對用戶請求 request 進行處理,如果程式員決定該攔截器對請求進行攔截處理后還要呼叫其他 的攔截器,或者是業務處理器去進行處理,則回傳 true;如果程式員決定不需要 再呼叫其他的組件去處理請求,則回傳 false,
- postHandle():這個方法在業務處理器處理完請求后,但是 DispatcherServlet向客戶端回傳回應前被呼叫,在該方法中對用戶請求 request 進行處理,
- afterCompletion():這個方法在 DispatcherServlet 完全處理完請求后被呼叫,可以 在該方法中進行一些資源清理的操作,
二、攔截器配置步驟
1、創建一個攔截器(實作HandlerInterceptor介面)
package com.ssm.Interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
//攔截器
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//獲取請求的URL
String requestURI=request.getRequestURI();
HttpSession session=request.getSession();
Object userInfo=request.getSession().getAttribute("USERINFO");
System.out.println("鏈接:"+requestURI+"進入攔截器");
if(userInfo==null){ //表示未登錄就想進入系統
//直接重定向到登錄界面
String serverPath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/index.jsp";
response.sendRedirect(serverPath);
return false;
}else{
//登陸成功,不攔截
return true;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("跳轉后攔截");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("渲染后攔截");
}
}
這個攔截器我只是寫個Demo,所以只進行了是否登錄的驗證,真正的專案中你也可以在這里進行一些權限的判斷等等,
2、配置攔截器
<!--攔截器配置-->
<mvc:interceptors>
<!--后臺訪問攔截器-->
<mvc:interceptor>
<!--攔截所有資源-->
<mvc:mapping path="/**"/>
<!--登陸不攔截-->
<mvc:exclude-mapping path="/user/login"/>
<!--郵箱激活不攔截-->
<mvc:exclude-mapping path="/user/activeEmail"/>
<!--靜態資源的目錄不攔截-->
<mvc:exclude-mapping path="/commons/**"/>
<!--用戶通過郵箱中重置密碼的鏈接不攔截-->
<mvc:exclude-mapping path="/email/resetPassword"/>
<!--激活郵箱的驗證不攔截-->
<mvc:exclude-mapping path="/user/validateCode"/>
<!--實作攔截功能的類-->
<bean class="com.ssm.Interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
由于配置了<mvc:mapping path="/**"/>會攔截所有資源,我們必須用<mvc:exclude-mapping path="/這里寫你想放行的請求">標簽放行靜態資源和一些不用攔截的請求(登錄等等),<bean class="com.ssm.Interceptor.LoginInterceptor"></bean>是第一步創建的攔截器,
3、測驗下攔截器:
在地址欄輸入個非法的請求試試:


通過地址欄可以看到,頁面已經被重定向到了登陸界面,攔截成功,
但是攔截器并不能攔截jsp頁面的訪問,這個時候兩種選擇:
1、將所有jsp頁面都放在WEB-INF目錄下
2、用Servlet過濾器(雖然感覺技術有點老了)
三、過濾器概述
Servlet過濾器主要用于對客戶端(瀏覽器)的請求進行過濾處理,然后將過濾后的請求轉交給下一資源,
四、過濾器配置步驟
1、創建一個過濾器(實作Filter介面)
package com.ssm.Filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
//自定義過濾器
public class LoginFilter implements Filter {
//初始化方法
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//初始化處理
System.out.println("過濾器初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//過濾處理
//servletRequest 是個介面,HttpServletRequest 是實作,但是有些方法是HttpServletRequest獨有的,如:getSession
//HttpServletRequest介面是繼承servletRequest介面,增加了和http相關的方法
HttpServletRequest request= (HttpServletRequest) servletRequest;
HttpServletResponse response= (HttpServletResponse) servletResponse;
// String requestURI=request.getRequestURI();
// System.out.println("鏈接:"+requestURI+"進入過濾器");
HttpSession session=request.getSession();
if(session.getAttribute("USERINFO")==null){
//非法請求,直接跳轉到登陸界面
String serverPath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/index.jsp";
response.sendRedirect(serverPath);
}else{
//正常登錄,放行
filterChain.doFilter(request,response);
}
}
@Override
public void destroy() {
//釋放資源
System.out.println("過濾器銷毀");
}
}
2、配置web.xml
<!--使用過濾器實作登陸控制-->
<!--filter標簽用于宣告過濾器物件-->
<filter>
<!--過濾器名稱-->
<filter-name>LoginFilter</filter-name>
<!--過濾器完整類名-->
<filter-class>com.ssm.Filter.LoginFilter</filter-class>
</filter>
<!--filter-mapping用于創建過濾器的映射,指定Web應用中,哪些URL應用哪一個過濾器進行處理-->
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<!--url-pattern用于指定過濾器應用的URL-->
<!--過濾的頁面(自定義),這里對登錄界面就不要過濾了-->
<url-pattern>/views/*</url-pattern>
</filter-mapping>
各個標簽的解釋都寫在注釋里面了,至于需要過濾的資源,你可以根據自己的需求再添加
<url-pattern>,我主要是想把views目錄下面的jsp全部過濾,
3、測驗過濾器
不登陸直接訪問后臺jsp頁面:

訪問之后:

可以看到,過濾器直接將請求重定向到了登陸界面,過濾器過濾成功,
五、總結
現在已經有了很多權限管理的框架了,Shiro、Spring Security等等,以后盡量還是用新技術,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/277647.html
標籤:java
上一篇:Spring基礎總結(第一周課)
下一篇:【Java 輸入、輸出流】
