分享知識-快樂自己:Struts2 攔截器 與 過濾器
阿新 • • 發佈:2018-11-26
攔截器的使用以及配置:
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整合的時候使用到 攔截器 與 過濾器 (基本配置);發現 會先走 攔截器 然後再走 過濾器 。