1. 程式人生 > >分享知識-快樂自己:Struts2 攔截器 與 過濾器

分享知識-快樂自己:Struts2 攔截器 與 過濾器

攔截器的使用以及配置:

package com.gdbd.interceptor;

import com.gdbd.pojo.UserInfo;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

import java.util.Map;

/**
 * 登陸攔截器:(攔截的只是 Action 請求路徑)
 * (可根據自行情況進行更改)
 * @author asus
 */
public class LoginInterceptor implements
Interceptor { @Override public void destroy() { System.out.println("銷燬"); } @Override public void init() { System.out.println("初始化"); } @Override public String intercept(ActionInvocation invocation) throws Exception { System.out.println("---------------攔截器-------------------"); String actionName
= invocation.getProxy().getActionName(); Map<String, Object> session = invocation.getInvocationContext().getSession(); UserInfo userInfo = (UserInfo) session.get("userInfo"); if ("login".equals(actionName)) { String invoke = invocation.invoke();
return invoke; } if (userInfo != null) { String invoke = invocation.invoke(); return invoke; } return "login"; } }

struts.xml:關鍵配置

<!--
   定義攔截器
-->
<interceptors>
    <!--自定義攔截器-->
    <interceptor name="loginInter" class="com.gdbd.interceptor.LoginInterceptor"/>
    <!--攔截器棧-->
    <interceptor-stack name="MyStack">
       <interceptor-ref name="defaultStack"/>
       <interceptor-ref name="loginInter"/>
    </interceptor-stack>
</interceptors>
<!--全域性範圍攔截定義-->
<default-interceptor-ref name="MyStack"/>

或者...指定 Action
<action name="login" class="userLoginAction" method="password">
<result name="login">/login.jsp</result>
<result name="main" type="redirect">/main.jsp</result>
<interceptor-ref name="MyStack"/>
</action>

過濾器的使用以及配置:

package com.gdbd.filter;
import com.gdbd.pojo.UserInfo;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * 原理是,將所有的地址中包含JSP的訪問攔截,將訪問重定位到網站的跟目錄
 * (根據自行情況可進行更改)
 * @author asus
 */
public class URLFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("Filter 初始化");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
            throws IOException, ServletException {
        System.out.println("---------------過濾器-------------------");
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        //獲取請求的URL路徑
        StringBuffer url = httpServletRequest.getRequestURL();
        HttpSession session = httpServletRequest.getSession();
        UserInfo userInfo = (UserInfo) session.getAttribute("userInfo");
        if (userInfo != null) {
            filterChain.doFilter(request, response);
            return;
        }
        //判斷地址中是否包含"JSP"
        if (url.indexOf("login.jsp") > 0) {
            filterChain.doFilter(request, response);
        } else if (url.indexOf("jsp") > 0) {
            HttpServletResponse httpres = (HttpServletResponse) response;
            //跳轉到網站根目錄,也可以根據自己的需要重定位到自己的Action
            httpres.sendRedirect("/login.jsp");
            return;
        } else { //不包含JSP,則繼續執行
            filterChain.doFilter(request, response);
        }
    }
    @Override
    public void destroy() {
        System.out.println("Filter 銷燬");
    }
}

WEB.XML 配置

    <!--過濾請求的URL路徑-->
    <filter>
        <filter-name>URLfilter</filter-name>
        <filter-class>com.gdbd.filter.URLFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>URLfilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

提示:

樓主A:在進行SSH整合的時候使用到 攔截器 與 過濾器 (基本配置);發現 會先走 攔截器 然後再走 過濾器  。