SSM14-使用過濾器和攔截器實現用戶登陸訪問控制


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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM