關於過濾器和攔截器的區別,已經spring boot入門(七)中說明。下面舉個過濾器的應用場景,比如用戶信息頁只有再用戶登錄後纔可以進入,沒有登錄的用戶是無法進入的,此時便可以採用過濾器來講沒有登錄的用戶"過濾"掉。
1.建立filter包,在此包下建立UrlFilter類,此例我們模擬判斷用戶請求地址是否有誤:UrlFilter代碼如下:
@WebFilter(filterName = "test", urlPatterns = "/success/*")
public class UrlFilter 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 {
HttpServletRequest req = (HttpServletRequest) servletRequest;
String requestURI = req.getRequestURI();
System.out.println("--------------------->過濾器:請求地址"+requestURI);
if(!requestURI.contains("info")){
servletRequest.getRequestDispatcher("/failed").forward(servletRequest, servletResponse);
}else{
filterChain.doFilter(servletRequest, servletResponse);
}
}
@Override
public void destroy() {
System.out.println("----------------------->過濾器被銷燬");
}
}
注意:@WebFilter註解爲聲明此類爲filter,第一個參數爲該filter起一個名字,第二個參數爲說明要攔截的請求地址。該類實現了Filter接口,裏面有三個方法,分別爲過濾器創建、過濾方法和過濾器銷燬。我們在過濾方法doFilter執行過濾邏輯。同樣,在使用註解的方式(即@WebFilter)聲明過濾器時,需要再main函數類上添加@ServletComponentScan(basePackages = "此處寫明類地址,格式爲包名+類名(如com.yxc.*)"),具體代碼請見本人博客"spring boot入門(八)"。
2.爲使得模擬效果更好,在TestController類中添加了一個接口方法failed,代碼如下:
@RequestMapping("/failed")
public Map<String, String> requestFailed(){
Map<String, String> map = new HashMap<>();
map.put("code", "-1");
map.put("msg", "請求錯誤");
return map;
}
3.其中我們正常訪問的接口方法代碼如下:
@RequestMapping("/success/info")
public User userInfo(){
User user = new User();
user.setUsername("Yansir");
user.setPassword("");
user.setNickname("cherish");
user.setGender("女");
user.setAge("1");
return user;
}
4.說明一下過濾方法的內容,如果我們訪問的地址中包含"info",則正常向下執行即訪問/success/info接口,否則,則將請求跳轉到/failed接口。
5.測試:首先測試在瀏覽器輸入127.0.0.1:8080/success/info接口,內容如下:
再輸入一個錯誤的接口(但要以success/爲請求前路徑,因爲我們過濾器配置的爲此路徑下的web資源執行過濾方法),結果如下:
過濾器使用成功