1.過濾器和攔截器
區別:
過濾器作用於請求到達servlet之前,在spring中也就是在dispacherServlet(前端控制器)之前。而攔截器最早只能作用於請求到達servlet之后,在執行controller之前。
過濾器:依賴於servlet容器。在實現上基於函數回調,可以對幾乎所有請求進行過濾,但是缺點是一個過濾器實例只能在容器初始化時調用一次。
攔截器:依賴於web框架,在SpringMVC中就是依賴於SpringMVC框架。在實現上基於java的反射機制,屬於面向切面編程(AOP)的一種運用。一個攔截器實例在一個controller生命周期之內可以多次調用。但是缺點是只能對controller請求進行攔截,對其他的一些比如直接訪問靜態資源的請求則沒辦法進行攔截處理。
2.ssm下實現過濾器
<!--loginFilter-->
<filter>
<filter-name>loginFilter</filter-name>
<filter-class>com.hdh.web.filter.LoginFilter</filter-class>
<init-param>
<!--不進行過濾的url,因為它就是跳轉到登陸界面, -->
<param-name>unFiltetRequest</param-name>
<param-value>/login</param-value>
</init-param>
<init-param>
<!--未登錄用戶跳轉的url -->
<param-name>unFilterPag</param-name>
<param-value>/login.jsp</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>
unFiltetRequest:在配置文件中定義好不需要過濾的登陸請求路勁
unFilterPag:在配置文件中定義好不需要過濾登陸頁面
3.攔截所有的html和jsp資源
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>
4.編寫自定義過濾器實現Filter接口
public class LoginFilter implements Filter { private String unFilterPag = ""; private String unFiltetRequest = ""; public void init(FilterConfig filterConfig) throws ServletException { unFilterPag = filterConfig.getInitParameter("unFilterPag"); unFiltetRequest = filterConfig.getInitParameter("unFiltetRequest"); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response;
//拿到當前頁面的路徑 http://localhost:8080/register.html 就是/register.html String servletPath = req.getServletPath(); HttpSession session = req.getSession(); Object ifLogin = session.getAttribute("user"); if (servletPath.equals(unFilterPag) || servletPath.equals(unFiltetRequest)){
//放行 chain.doFilter(req,res); }else { if (ifLogin==null){ res.sendRedirect(req.getContextPath()+unFilterPag); }else{
//放行 chain.doFilter(req,res); } } } public void destroy() { } }
5.ssm下實現攔截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<mvc:exclude-mapping path="/user/login"></mvc:exclude-mapping>
<bean class="com.hdh.web.interceptor.LoginInterecpt"></bean>
</mvc:interceptor>
</mvc:interceptors>
攔截所有的controller請求(攔截器只能攔截controller請求,無法攔截靜態資源)
不攔截的資源:
<mvc:exclude-mapping path="/user/login"></mvc:exclude-mapping>
6.自定義攔截器實現HandIntercept接口
public class LoginInterecpt implements HandlerInterceptor { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); if (session.getAttribute("user")==null){ response.sendRedirect(request.getContextPath()+"/login.jsp"); return false; }else { return true; } } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
其他一些常用的filter
字符集編碼過濾器
<!-- 配置 springMVC 編碼過濾器 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!-- 設置過濾器中的屬性值 -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<!-- 啟動過濾器 -->
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern> </filter-mapping>