在做登录案例的时候,我们会考虑到这个问题,在用户未登录之前,用户是不能访问相关信息界面的,那就需要加上权限的控制,告诉用户必须处于登录状态,才可以访问。
在ssh框架中,才用struts2的拦截器进行权限的控制
那么什么是拦截器呢?
拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。
struts2中的拦截器是利用AOP的思想,不知道什么是AOP的,可以查看之间的博客。
那么知道了什么是拦截器之后,我们怎么做权限控制呢?
首先,我们通过下面这张图,来理解如何使用拦截器做权限控制
思路:
1.定义一个拦截器类(类里面通过判断是否有用户存在session里面,如果没有就拦截要访问的页面)
2.在struts.xml文件中配置拦截器
3.在要拦截的action中使用拦截器接口
Demo:
拦截器类
LoginInterceptor.java:
package com.baidu.demo;
import org.apache.struts2.ServletActionContext;
import com.baidu.pojo.Login;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
public class LoginInterceptor extends MethodFilterInterceptor{
private static final long serialVersionUID = -6989408598907040L;
@Override
protected String doIntercept(ActionInvocation actionInvocation) throws Exception {
//判断session中是否保存了后台用户数据
Login username =(Login) ServletActionContext.getRequest().getSession().getAttribute("login");
System.out.println(username);
if(username == null){
//没有登录就访问了
ActionSupport action =(ActionSupport) actionInvocation.getAction();
action.addActionError("您还没有登录,没有权限访问");
return "loginfail";
}else{
//已经登录过了
return actionInvocation.invoke();
}
}
}
struts.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
<constant name="struts.devMode" value="true"/>
<package name="default" namespace="/" extends="struts-default">
<!-- 定义拦截器-->
<interceptors>
<interceptor name="LoginInterceptor" class="com.baidu.demo.LoginInterceptor"></interceptor>
</interceptors>
<global-results>
<result name="loginfail">/index.jsp</result>
</global-results>
<action name="user_*" class="userAction" method="{1}">
<result name="list">/list.jsp</result>
<result name="update">/update.jsp</result>
<result name="delete" type="redirect">user_list</result>
<result name="toadd">/add.jsp</result>
<result name="add" type="redirect">user_list</result>
<!-- 引入自定义拦截器及默认的拦截器 -->
<interceptor-ref name="LoginInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
<!-- class="RegistAction"与applicationContext.xml中的id对应 -->
<action name="regist" class="registAction">
<result>/index.jsp</result>
</action>
<action name="login" class="loginAction" >
<result name="success" type="redirectAction">user_list</result>
<result name="input">/input.jsp</result>
</action>
</package>
</struts>
以上就是struts2拦截器做权限控制。