一、攔截器與過濾器的區別
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() { } }