您的位置:首页 > 编程语言 > Java开发

struts登录案例和自定义拦截器

2014-07-24 00:00 441 查看
struts登录案例:
struts.xml
<struts>
<constant name="struts.devMode" value="true" />
<constant name="struts.custom.i18n.resources" value="messages"></constant>
<package name="basic" extends="struts-default" namespace="/">
<interceptors>
<interceptor name="privilege" class="cn.itcast.interceptor.PrivilegeInterceptor"></interceptor>
</interceptors>
<global-results>
<result name="login">/login.jsp</result>
</global-results>
<action name="book_*" class="cn.itcast.action.BookAction" method="{1}">
<interceptor-ref name="privilege"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>
<package name="login" extends="struts-default" namespace="/">
<action name="login" class="cn.itcast.action.LoginAction">
<result name="input">/login.jsp</result>
<result>/index.jsp</result>
</action>
</package>
</struts>
messages.properties(国际话信息):
username.required=用户名不能为空
username.length=用户名不能小于三个字符
password.required=密码不能为空
loginfail=用户名或者密码错误

action:
LoginAction:
public class LoginAction extends ActionSupport implements ModelDriven<User> {
private User user=new User();
@Override
public User getModel() {
return user;
}
@Override
public String execute() throws Exception {
QueryRunner qr=new QueryRunner(DBCPUtil.getDataSource());
String sql="select * from user where username=? and password=?";
User loginUser=qr.query(sql, new BeanHandler<User>(User.class),user.getUsername(),user.getPassword());
if(loginUser==null){
this.addActionError(this.getText("loginfail"));
return INPUT;
}else{
ServletActionContext.getRequest().getSession().setAttribute("loginUser", loginUser);
return SUCCESS;
}
}
}

LoginAction-validation.xml:
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<field name="username">
<field-validator type="requiredstring">
<message key="username.required"></message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">3</param>
<message key="username.length"></message>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<message key="password.required"></message>
</field-validator>
</field>
</validators>

jsp:
login.jsp:
<s:fielderror />
<s:actionerror/>
<form action="${pageContext.request.contextPath}/login.action" method="post">
用户名:<input type="text" name="username"/>
密码:<input type="password" name="password"/>
<input type="submit" value="登录">
</form>
</body>

自定义拦截器
拦截器 的使用 ,源自Spring AOP(面向切面编程)思想
拦截器 采用 责任链 模式
* 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。
* 责任链每一个节点,都可以继续调用下一个节点,也可以阻止流程继续执行

在struts2 中可以定义很多个拦截器,将多个拦截器按照特定顺序 组成拦截器栈 (顺序调用 栈中的每一个拦截器 )

1、 struts2 所有拦截器 都必须实现 Interceptor 接口
2、 AbstractInterceptor 类实现了 Interceptor 接口. 并为 init, destroy 提供了一个空白的实现

所有实际开发中,自定义拦截器 只需要 继承 AbstractInterceptor类, 提供 intercept 方法实现

3、 常用struts2 拦截器
<interceptor-ref name="modelDriven"/> 模型驱动
<interceptor-ref name="fileUpload"/> 文件上传
<interceptor-ref name="params"> 参数解析封装
<interceptor-ref name="conversionError"/> 类型转换错误
<interceptor-ref name="validation"> 请求参数校验
<interceptor-ref name="workflow"> 拦截跳转 input 视图

案例 : 登陆,对其它Action访问 通过自定义拦截器 进行权限控制
导入jar包 (struts2 jar、c3p0、 dbutils、 mysql驱动)
web.xml
struts.xml
JDBCUtils 工具类

第一步 : 编写index.jsp 提供 图书增删改查 四个功能
编写BookAction ,提供四个业务方法

第二步: 完成登陆功能

第三步 :必须要登陆 才能进行图书管理
使用Filter 进行权限控制 ---- 过滤所有web请求 (所有web资源访问)
使用拦截器 进行权限控制 ---- 主要拦截对Action访问 (不能拦截JSP)

定义拦截器 继承AbstractInterceptor

配置拦截器
方式一
<!-- 注册拦截器 -->
<interceptors>
<interceptor name="privilege" class="cn.itcast.interceptor.PrivilegeInterceptor"></interceptor>
</interceptors>
<action name="book_*" class="cn.itcast.action.BookAction" method="{1}" >
<!-- 使用拦截器 -->
<!-- 当使用自定义拦截器 后,默认拦截器 就会失效 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="privilege"></interceptor-ref>
</action>
方式二
<!-- 注册拦截器 -->
<interceptors>
<interceptor name="privilege" class="cn.itcast.interceptor.PrivilegeInterceptor"></interceptor>
<!-- 自定义拦截器栈 -->
<interceptor-stack name="privilegeStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="privilege"></interceptor-ref>
</interceptor-stack>
</interceptors>

<!-- 设置当前包 所有Action 都使用 自定义拦截器栈 -->
<default-interceptor-ref name="privilegeStack"></default-interceptor-ref>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: