在我们使用servlet的时候,有一个叫过滤器的技术, 通过配置文件匹配,去拦截我们的每一个请求,过滤器就可以对该请求进行一定的操作,然后在放行到对应的请求,
struts2 由于本身是filter(过滤器)实现, 为了为我们struts2增加一个拦截请求的功能,就开发了一个拦截器,简单来说就是struts2里面的过滤器。
自定义拦截器:
package com.xingxue.filter;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class LoginInterceptor implements Interceptor{
public void destroy() {
// TODO Auto-generated method stub
}
public void init() {
// TODO Auto-generated method stub
}
public String intercept(ActionInvocation arg0) throws Exception {
System.out.println("interceptor......");
//放行
return arg0.invoke();
}
}
注册拦截器:
<package name="admin" namespace="/admin" extends="struts-default" >
<interceptors>
<interceptor name="loginInterceptor" class="com.xingxue.filter.LoginInterceptor"></interceptor>
</interceptors>
<package>
为action添加拦截器:
<action name="adminLogin" class="com.xingxue.action.admin.AdminAction" method="adminLogin">
<interceptor-ref name="loginInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
<result name="OK" type="chain">findMenuByAdmin</result>
<result name="NO">/view/user/login.jsp</result>
</action>
<action name="findMenuByAdmin" class="com.xingxue.action.admin.AdminAction" method="findMenuByAdmin">
<result name="OK">/view/index.jsp</result>
<result name="NO">/view/user/login.jsp</result>
<interceptor-ref name="loginInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
注意:action想要使用拦截器,必须独立配置,
同时记住 <interceptor-ref name="defaultStack"></interceptor-ref>
必须加上,拦截器默认会拦截住参数,加上此配置,就会对参数放行
但是上述写法会导致程序有大量的配置,这就增加了开发难度,所以实际使用时可以采用全局拦截器进行配置:
1、创建拦截登陆拦截器
package com.xingxue.filter;
import java.util.Map;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class LoginInterceptor implements Interceptor{
public void destroy() {
// TODO Auto-generated method stub
}
public void init() {
// TODO Auto-generated method stub
}
public String intercept(ActionInvocation arg0) throws Exception {
System.out.println("interceptor......");
//放行
String url = ""+ServletActionContext.getRequest().getRequestURL();
//验证是否是登陆
if(url.contains("adminLogin") || url.contains("userLogin")) {
return arg0.invoke();
}else {
HttpSession session = ServletActionContext.getRequest().getSession();
Map<String, Object> admin = (Map<String, Object>) session.getAttribute("userBean");
if(admin == null) {
return "login";
}else {
return arg0.invoke();
}
}
}
}
2、配置全局拦截器:
<!-- 拦截器包 -->
<package name="interceptor" extends="struts-default">
<!-- 定义拦截器集合 -->
<interceptors>
<!-- 注册自定义拦截 -->
<interceptor name="login" class="com.xingxue.filter.LoginInterceptor"></interceptor>
<!-- 注册拦截器栈 吧多个拦截器按照一定顺序组合在一起,叫一个名字 -->
<interceptor-stack name="allInterceptor">
<interceptor-ref name="login"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 注册拦截器到struts2 -->
<default-interceptor-ref name="allInterceptor"></default-interceptor-ref>
<!-- 定义返回结果 -->
<global-results>
<result name="login">/view/user/login.jsp</result>
</global-results>
</package>
拦截器栈: 拦截器就是将多个拦截器合并为一个
3、在需要使用拦截器的package继承自我们的全局拦截器:
<package name="admin" namespace="/admin" extends="interceptor" >
<action name="adminLogin" class="com.xingxue.action.admin.AdminAction" method="adminLogin">
<result name="OK" type="chain">findMenuByAdmin</result>
<result name="NO">/view/user/login.jsp</result>
</action>
<action name="findMenuByAdmin" class="com.xingxue.action.admin.AdminAction" method="findMenuByAdmin">
<result name="OK">/view/index.jsp</result>
<result name="NO">/view/user/login.jsp</result>
</action>
</package>