更多Struts2在框架开发
1 拦截器?
Struts2封装了很多的功能,这些功能都在拦截器里面,每次都会执行默认拦截器。Struts2中的拦截器有点类似于传统的过滤器,是AOP思想(不通过修改源代码的方式扩展功能)与责任链模式(类似过滤链)的结合,作用无非就是拦截,符合条件就放行,不符合就拦下来。
相比于过滤器的过滤内容(如:html、jsp、servlet、路径等等),拦截器只能拦截action,并且是在action创建之后,action里面的方法执行之前进行拦截。
Struts2中有很多默认的拦截器(每次都会执行)和其他拦截器(不一定会执行),但实际开发中,我们可以自定义某一功能的拦截器。
2 不登陆别想进这个页面
案例目标: 在Struts2的基础上,编写自定义的登陆过滤器,实现功能: 如果不是登陆状态,则禁止访问主页,将跳转到登陆页面。
2.1 写一个Struts2不用数据库的简单登陆
Struts2的入门请搜索本博客上篇和中篇,本文不再详细累述
登陆页面
<form action="${pageContext.request.contextPath}/user_login.action" method="post" targer="_parent">
用户名:<input type=text name="userName" />默认admin<br>
手 机:<input type=password name="userPhone" />默认123<br>
<input type="submit" value="登陆"/>
</form>
action(固定用户名和手机)
/**
* 用户登陆
* @return
*/
public String login() {
HttpServletRequest request = ServletActionContext.getRequest();
//设置固定的用户名admin和手机123
if ("admin".equals(user.getUserName()) && "123".equals(user.getUserPhone())) {
//向session中放值
request.getSession().setAttribute("userSession", user);
return "success_login" ;
}else {
return "fail_login" ;
}
}
主页
当前用户:${userSession.userName },欢迎您进入系统主页!!
2.2 编写自定义的登陆拦截器
创建拦截器类
package edu.kmust.interceptor;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
/**
* 拦截器类
* @author zhaoyuqiang
*
*/
public class LoginInterceptor extends MethodFilterInterceptor {
/**
* 该方法写拦截器逻辑
*/
protected String doIntercept(ActionInvocation invocation) throws Exception {
/*
* 获取Session域中的值
*/
HttpServletRequest request = ServletActionContext.getRequest();
Object obj = request.getSession().getAttribute("userSession");
if(obj != null) {
//是登陆状态,拦截器执行类似放行的操作
return invocation.invoke();
}else {
//不是登陆状态,不能执行Action中的登陆方法,返回登陆页面
return "fail_login";
}
}
}
在struts.xml配置文件中注册拦截器(配置action与拦截器的关系)
<struts>
<package name="XXX" extends="struts-default" namespace="/">
<!--1.在package标签里面声明自定义拦截器 -->
<!--
interceptor:
name: 拦截器的名字,随便起的
class:拦截器类的全路径
-->
<interceptors>
<interceptor name="loginIntercept" class="edu.kmust.interceptor.LoginInterceptor"></interceptor>
</interceptors>
<action name="XXX" class="edu.kmust.action.XXX" method = "{}">
<!--2.在action标签中使用自定义的拦截器
interceptor-ref : 使用自定义拦截器
name: 自定义拦截器的名称
param : 配置action里面某些方法不拦截
name属性:excludeMethods(忽略某些方法),单词写错不会报错
值: action中不拦截的方法名称,如果有多个方法,则用逗号隔开就可以了
-->
<interceptor-ref name ="loginIntercept">
<param name="excludeMethods">login</param>
</interceptor-ref>
<!--3.在action标签中把默认拦截器手动执行一次
因为配置自定义拦截器后,默认拦截器就不执行了,所以需要手动执行一次默认拦截器才行
-->
<interceptor-ref name="defaultStack"></interceptor-ref>
<!--result标签省略-->
</package>
</struts>
代码案例可参考: