Struts2拦截器,需要导相应的jar包及复制Struts.xml文件到src目录下,web.xml进行修改
拦截器
在访问Action的时候进行拦截处理,需要继承AbstractInterceptor,重写intercept方法
案例一:在访问Action输出一句话(买电脑),使用拦截器在访问Action之前和之后各输出一句话(送键盘)(送鼠标)
1.新建一个买电脑的action,继承ActionSupport,进行输出一句话
public class BuyAction extends ActionSupport{
@Override
public String execute() throws Exception {
System.out.println("买电脑");
return SUCCESS;
}
}
2.JSP页面提交到Action中
<form action="/8.28lanjieqi/login.action">
<input type="submit" value="提交">
</form>
3.新建一个买电脑送优惠的类用作于拦截器,继承AbstractInterceptor,重写里面的intercept方法,这句话代表String obj=arg0.invoke();相当于拦截前输出或则拦截后输出,案例中表示拦截前送键盘,拦截后送鼠标
public class YouhuiAction extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation arg0) throws Exception {
System.out.println("送键盘");
String obj=arg0.invoke();
System.out.println("送鼠标");
return obj;
}
}
4.修改struts.xml,在里面定义、使用拦截器
<!-- 实例一 -->
<interceptors>
<!-- interceptors标签里的interceptor定义拦截器 -->
<interceptor name="YouhuiAction" class="com.action.YouhuiAction">
</interceptor>
</interceptors>
<action name="login" class="com.action.BuyAction">
<!-- 结果为“success”时,跳转至success.jsp页面 -->
<result name="success">/index.jsp</result>
<!-- 设置使用拦截器 ,defaultStack是核心拦截器,如果只设置自己的,就不再走Struts核心拦截器 -->
<interceptor-ref name="YouhuiAction"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
运行结果:
拦截器堆栈
如果拦截器过多,可以把打放进一个自定义的拦截器堆栈当中,当有action需要访问的时候,可以在配置文件中进行设置堆栈名即可
如在上述案例中多一个拦截器,可以把该拦截器放进拦截堆栈中,让需要使用拦截器的Action进行调用
1.创建送货拦截器
public class SonghuoAction extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation arg0) throws Exception {
String obj=arg0.invoke();
System.out.println("点赞好评免费送货");
return obj;
}
}
2.在配置文件中设置堆栈
<!-- 堆栈,把需要的拦截器放进堆栈,当调用的使用直接输入堆栈别名即可 -->
<interceptors>
<!-- interceptors标签里的interceptor定义拦截器 -->
<interceptor name="YouhuiAction" class="com.action.YouhuiAction">
</interceptor>
<interceptor name="SonghuoAction" class="com.action.SonghuoAction">
</interceptor>
<!-- 定义拦截器堆栈 -->
<interceptor-stack name="tt">
<interceptor-ref name="YouhuiAction"></interceptor-ref>
<interceptor-ref name="SonghuoAction"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 定义默认拦截器引用 -->
<default-interceptor-ref name="YouhuiAction">
</default-interceptor-ref>
<!-- 指定拦截器引用 -->
<action name="login" class="com.action.BuyAction">
<!-- 结果为“success”时,跳转至success.jsp页面 -->
<result name="success">/index.jsp</result>
<interceptor-ref name="tt"></interceptor-ref>
</action>
运行结果:
案例二:用拦截器登录验证,如用户必须在登录页面通过用户名和密码访问登录的Action跳转到首页,防止用户直接访问首页的Action
1.创建实体类,里面有name+pwd的属性,get+set方法
2.在login.jsp页面中设置访问login.action
<form action="/8.28lanjieqilogin/login.action">
用户名:<input type="text" name="users.name"/>
密码:<input type="password" name="users.pwd"/>
<input type="submit" value="提交"/>
</form>
3.新建loginAction,调用实体类,继承ActionSupport用于重写execute()方法,实现SessionAware接口用于获得Session存值,用于判断用户是否通过登录跳转到首页
public class loginAction extends ActionSupport implements SessionAware{
private Map session;
private Users users;
public Users getUsers() {
return users;
}
public void setUsers(Users users) {
this.users = users;
}
public Map getSession() {
return session;
}
@Override
public String execute() throws Exception {
if (users.getName().equals("admin")&&users.getPwd().equals("123456")) {
session.put("users", users);
return SUCCESS;
}else {
return ERROR;
}
}
@Override
public void setSession(java.util.Map<String, Object> session) {
this.session=session;
}
}
4.创建首页的Aciton,当访问了该Action进行输出一句话
public class IndexAction extends ActionSupport{
@Override
public String execute() throws Exception {
System.out.println("谢谢您的光临");
return SUCCESS;
}
}
5.创建跳转Action的拦截器,验证用户是否通过登录页面跳转过来的,需要继承AbstractInterceptor,重写intercept方法,判断之前存的Session是否为空,为空则跳转为登录页面,如不为空则正常执行
public class LLAction extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation arg0) throws Exception {
System.out.println("进入拦截器");
Map session = arg0.getInvocationContext().getSession();
if (session.get("users")!=null) {
return arg0.invoke();
}else {
return Action.LOGIN;
}
}
}
6.修改一下配置文件,定义、配置监听类
<interceptors>
<interceptor name="LLAction" class="com.action.LLAction"></interceptor>
</interceptors>
<action name="login" class="com.action.loginAction">
<!-- 结果为“success”时,跳转至success.jsp页面 -->
<result name="success">/index.jsp</result>
<!-- 结果为"error"时,跳转至fail.jsp页面 -->
<result name="error">/login.jsp</result>
<result name="input">/login.jsp</result>
</action>
<action name="index" class="com.action.IndexAction">
<result name="success">/index.jsp</result>
<result name="login">/login.jsp</result>
<result name="error">/login.jsp</result>
<interceptor-ref name="LLAction"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
运行结果:直接拼接项目/Action名字.action无法访问,当注册登录可以访问
直接访问返回登录页面