Struts2+Web常使用的功能经验笔记第1季--3
?
1.?????? Struts2的拦截器
它一般作为Session建权(建立权限)用,在拦截器中进行session的判断。
引用一段别人的代码
先看拦截器配置
<package name="xxx-default" extends="struts-default">
???????? <interceptors>
???????? ??? <interceptor name="loginAuth"
?????????????????? />
???????? ??? <interceptor-stack name="completeStackWithLoginAuth">
?????????????????? <interceptor-ref name="loginAuth" />
?????????????????? <interceptor-ref name="defaultStack" />
???????? ??? </interceptor-stack>
???????? </interceptors>
???????? <default-interceptor-ref name="completeStackWithLoginAuth" />
???????? <global-results>
???????? ??? <result name="login">/userLogin/error.jsp</result>
???????? ??? <result name="expire">/modifyPW/modifyPW.jsp</result>
???????? ??? <result name="forbid">/userLogin/forbid.jsp</result>
???????? </global-results>
</package>
之后编辑拦截器类
@SuppressWarnings("serial")
public class LoginAuthInterceptor extends AbstractInterceptor {
?
?
??? @Override
??? public String intercept(ActionInvocation actionInvocation) throws Exception {
??????? // 获得会话中的用户身份字段
??????? Map session = actionInvocation.getInvocationContext().getSession();
??????? String user = (String) session.get(ISysParam.SESSION_USER);
??????? if (null == user) {
??????????? return Action.LOGIN;
??????? } else {
??????????? StringBuffer invokeMtd = new StringBuffer(actionInvocation
??????????????????? .getProxy().getNamespace());
??????????? invokeMtd.append("/"
??????????????????? + actionInvocation.getInvocationContext().getName());
??????????? String role = (String) session.get(ISysParam.USER_ROLE);
???????????
??????????? //测试代码? 如果是用户名是admin 则不进行权限判断
//??????????? if(user.equals(ISysParam.ROLETYPE_ADMIN)){
//??????????????? return actionInvocation.invoke();
//??????????? }
???????????
??????????? /*
???????????? * 得到该所能操作的名称空间 if(可以访问当前的名称空间){ 跳出拦截器 else{ 转到没有权限的页面 } }
???????????? */
//??????????? if (role.contains(invokeMtd.toString())) {
//??????????????? return actionInvocation.invoke();
//??????????? } else {
//??????????????? return "forbid";
//??????????? }
?
??????????? // if (!user.getUserName().equals(ISysParam.ROLETYPE_ADMIN)) {
??????????? // // 对非ADMIN用户,检查模块访问权限
??????????? // if (!chkPrivilege()) {
??????????? // log.debug(user.getUserName() + ":" +ISysParam.OPER_CANCEL);
??????????? // return FORBID;
??????????? // }
??????????? // }
??????????? // return actionInvocation.invoke();
??????????? // }
?? ??????????return actionInvocation.invoke();
??????? }
?
??? }
}
之后的流程配置如下
<package name="xxx" namespace="/xxx"
??????? extends="xxx-default">
??????? <action name="*" method="{1}" style="margin: 0cm 0cm 0pt;">??????????? <result name="input">{1}.jsp</result>
??????????? <result name="error">{1}.jsp</result>
??????????? <result name="success">{1}.jsp</result>
??????? </action>
??? </package>
<package name="xxx2" namespace="/xxx2"
??????? extends="xxx-default">
???????? <action name="*" method="{1}" style="margin: 0cm 0cm 0pt;">???????? ??? <result name="input">{1}.jsp</result>
???????? ??? <result name="error">{1}.jsp</result>
???????? ??? <result name="success">{1}.jsp</result>
???????? </action>
</package>
自己定义
<package name="myPkg" abstract="true" extends="struts-default"></package>
在这个包下面定义拦截器, 这个包下面定义拦截器栈的引用, 引用defaultStack和你自己定义的拦截器!然后你需要用这个拦截器的包都继承这个包就好了!
1.?????? Struts2的防刷新提交机制
在Struts2中解决表单的重复提交感觉还算简单。
token: 在活动中检查合法令牌(token), 防止表单的重复提交;
tokenSession: 同上, 但是在接到非法令牌时将提交的数据保存在session中;
首先在struts.xml中配置Action如下信息
<!-- 评论Action -->
<action name="commentsAction" style="margin: 0cm 0cm 0pt;">?
???????? <result name="invalid.token" type="redirect">productAction!list.action
???????? </result>
???????? <interceptor-ref name="defaultStack">
?????????????????? <param name="workflow.excludeMethods">default</param>
???????? </interceptor-ref>
???????? <interceptor-ref name="token">
?????????????????? <param name="includeMethods">add,update</param>
???????? </interceptor-ref>
?
???????? <result name="listByProductsId">/admin/page/commentsList.jsp</result>
???????? <result name="add">/admin/page/commentsAdd.jsp</result>
???????? <result name="update">/admin/page/commentsUpdate.jsp</result>
</action>
在这个Action中引用了2个拦截器,一个是默认的注入拦截器defaultStack,另一个就是令牌拦截器token,之后还定义了一个重复提交后的返回地址invalid.token。
之后在页面表单form中加入<s:token></s:token>就可以了。
?