?
1.?????? Struts2的拦截器
它一般作为Session建权(建立权限)用,在拦截器中进行session的判断。
引用一段别人的代码
先看拦截器配置
<package name="xxx-default" extends="struts-default"> ???????? <interceptors> ???????? ??? <interceptor name="loginAuth" ?????????????????? class="XXX.LoginAuthInterceptor" /> ???????? ??? <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}" class="XXXAction"> ??????????? <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}" class="XXX2Action"> ???????? ??? <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" class="action.CommentsAction"> ? ???????? <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>就可以了。
?