一般来说,我们的web系统都是只有在用户登录之后才允许操作的,也就是说我们不允许非登录认证的用户直接访问某些页面或功能菜单项。对于struts项目来说就可以定义拦截器来实现。
解决方式
1、定义一个拦截器类(类里面通过判断是否有用户存在session里面,如果没有就拦截要访问的页面)
2、在struts2配置文件中配置拦截器
3、 在要拦截的action中使用拦截器接口
拦截器:
package cn.edu.gxuwz.interceptor;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
import cn.edu.gxuwz.entity.SysUser;
@SuppressWarnings("serial")
public class PrivilegeInterceptor extends MethodFilterInterceptor {
//执行拦截的方法
@Override
protected String doIntercept(ActionInvocation actionInvocation) throws Exception {
// TODO Auto-generated method stub
//判断session中是否保存了后台用户的信息
SysUser sysUser = (SysUser) ActionContext.getContext().getSession().get("sysUser");
if(sysUser == null){
//没有登录就进行访问了
ActionSupport actionSupport = (ActionSupport) actionInvocation.getAction();
actionSupport.addActionError("亲,您还没有登录,没有权限访问!");
return "error";
}else{
//已经登录过了
return actionInvocation.invoke();
}
}
}
struts.xml:
<!--配置全局映射视图,捕获所有 异常跳转指定页面 -->
<package name="base" extends="struts-default">
<interceptors>
<interceptor name="myinterceptor" class="cn.edu.gxuwz.interceptor.PrivilegeInterceptor">
</interceptor>
<!-- 定义拦截栈 -->
<interceptor-stack name="loginStack">
<interceptor-ref name="myinterceptor">
<!-- 拦截action中的某些方法
<param name="includeMethods">method1,method2</param> -->
<!-- 不拦截action中的某些方法 -->
<param name="excludeMethods">webLogin</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
</package>
struts-web.xml:
<!-- 定义系统设置模块 -->
<package name="biz" extends="base" namespace="/biz">
<!--系统设置 -->
<action name="*_*"
class="cn.edu.gxuwz.action.{1}Action" method="{2}">
<result name="success">${forwardView}</result>
<result name="error">${forwardView}</result>
<result name="input">/error/error.jsp</result>
<!-- 添加拦截器 -->
<interceptor-ref name="loginStack"></interceptor-ref>
</action>
</package>