Struts2—拦截器实现权限控制

在Struts2中,有内置的拦截器,在struts-core的struts-default.xml中,有一些框架自身默认配置的拦截器。

在拦截器中,有一个拦截器栈,在拦截器栈中拦截器的顺序非常的重要。action会按照里面的顺序去通过拦截器。

、只要在定义包的过程中继承struts-default包,defaultstack就是默认的拦截器栈

、当为一个显式的拦截器定义一个拦截器时,则不再调用他的默认拦截器

、拦截器栈中的顺序很重要,需要符合逻辑性

在这里我们模拟一个用户权限的登入拦截器,需要登入的用户才可以登入,不然无法登入页面。

login.jsp

<body>
    <h2>用户登入</h2>
    ${loginerro}
    <form action="login" method="post">
    用户名:<input type="text" name="user" />
    密码:<input type="password" name="password"/>
   <input type="submit" value="登入"/>
    </form>
    
  </body>

manager.jsp
<body>
    此页面只有登入用户的人可以查看,其他不可以。
    
  </body>
需要一个处理登入请求的类

login.jsp

public class Login extends ActionSupport implements SessionAware{
	private String user;
	private String password;
	private Map<String, Object> session;
	public String getUser() {
		return user;
	}
	public void setUser(String user) {
		this.user = user;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Override
	public void setSession(Map<String, Object> session) {
	this.session=session;
		
	}
	//处理登入请求
	public String login(){
		if("admin".equals(user)&&"123".equals(password)){
			session.put("logininfo", user);
			return SUCCESS;
		}else{
			session.put("loginerro", "用户名不正确");
			return ERROR;
		}
	}

}
使用session来保存是否登入的信息

一个继承abstractinterceptor的类

LoginInterceptor.jsp

public class LoginInterceptor extends AbstractInterceptor {

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		ActionContext context=ActionContext.getContext();
                            
//得到session中的是否登入信息

Map<String, Object> session=context.getSession();if(session.get("logininfo")!=null){String result=invocation.invoke();return result;}else{return "login";}}}
 创建完毕以后我们在xml文件中进行配置拦截器和action 
 
<!--注册拦截器  -->
    <interceptors>
      <interceptor name="auth" class="com.imooc.interceptor.LoginInterceptor"></interceptor>
     <!-- 自定义拦截器组合 --> 
      <interceptor-stack name="mystack">
      <interceptor-ref name="defaultStack"></interceptor-ref>
      <interceptor-ref name="auth"></interceptor-ref>
      </interceptor-stack>
    </interceptors><!--通过此action来访问后台页面,需要判断用户是否登入,如果没有登入就跳转到登入页面  -->
    <action name="auth">
    <result>/WEB-INF/page/manager.jsp</result>
    <result name="login">/WEB-INF/page/login.jsp</result>
    <!--引用拦截器栈  -->
    <interceptor-ref name="mystack"></interceptor-ref>
    </action>
    <action name="login" class="com.imooc.action.Login" method="login">
    <result>/WEB-INF/page/manager.jsp</result>
    <result name="error">/WEB-INF/page/login.jsp</result>
    </action> 



运行结果如下:



猜你喜欢

转载自blog.csdn.net/wkztselina/article/details/53340487