转载请注明出处:jiq•钦's technical Blog
在SSH框架之下,最基本的是要实现访问控制。
主要思想就是使用拦截器控制action的访问,使用jsp代码控制jsp页面的访问。
拦截器需要指定拦截除了LoginAction和LogoutAction之外的所有Action
一般是声明一些拦截器拦截器,然后将某些拦截器组合成拦截器栈:
<!-- 定义拦截器,在用户访问受保护资源之前判断其是否登录 -->
<interceptors>
<!-- 拦截器 -->
<interceptor name="authen" class="com.jsjl.interceptor.LoginAuthenInterceptor"/>
<!-- 定义一个拦截器栈 -->
<interceptor-stack name="securityStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="authen"/>
</interceptor-stack>
</interceptors>
然后在Action配置中制定需要使用的拦截器:
<action name="yndwAction"class="YNDWAction">
<result name="success">yndw_1.jsp</result>
<result name="error">error.jsp</result>
<interceptor-refname=”securityStack” />
</action>
但是不可能在所有的Action配置中都加上
<interceptor-ref name=”securityStack” />
解决方案:
1 Action访问控制
新建1+1+n个包
第一个包声明登入登出等不需要拦截的Action:
<package name="login"extends="struts-default" namespace="/">
<!-- class属性对应IoC容器中的BeanId,因为struts将Action托管给Spring了 -->
<action name="login" class="LoginAction">
<result name="yndw"type="redirectAction">
<param name="actionName">yndwAction</param>
<param name="namespace">/</param>
</result>
<!—因为使用了struts2的框架验证,所以必须配置input接过类型,验证失效时候
返回input结果,若找不到input类型,就会尝试用action的class去创建一个
action,导致action未知类型的错误 -->
<result name="input">/login.jsp</result>
</action>
<action name="logoutAction" class="LogoutAction">
<result name="success">login.jsp</result>
</action>
</package>
第二个包声明拦截器,然后定义为默认拦截器:
<package name="interceptor"extends="struts-default" namespace="/">
<!-- 定义拦截器,在用户访问受保护资源之前判断其是否登录 -->
<interceptors>
<!-- 拦截器 -->
<interceptor name="authen" class="com.jsjl.interceptor.LoginAuthenInterceptor" />
<!-- 定义一个拦截器栈 -->
<interceptor-stack name="securityStack">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="authen" />
</interceptor-stack>
</interceptors>
<!-- 在这个包中声明一个默认的拦截器对于action资源直接访问,使用拦截器,对于页面直接访问,页面中判断-->
<default-interceptor-ref name="securityStack"/>
<!-- 如果一个结果在多个Action或者拦截器中使用,就应该将其配置为全局结果,注意类型为redirect -->
<global-results>
<result name="login"type="redirect">/login.jsp</result>
</global-results>
</package>
然后其他N和包,都继承自第二个包,这样就默认继承了第二个包的默认的拦截器:
<package name="XXX"extends="interceptor" namespace="/">
就这样,访问除了第一个包中的所有Action都会通过拦截器判断用户是否登入,否则转到登陆页面。
拦截器是这样的:
public class LoginAuthenInterceptor extends AbstractInterceptor {
public String intercept(ActionInvocation invocation) throws Exception {
ActionContext context = ActionContext.getContext();
Map session = context.getSession();
Object user = session.get("isLogin");
if(user == null){
return"login";
}
return invocation.invoke();
}
}
2 JSP访问控制
然后对于jsp页面的访问控制,只需要在页面开始加上以下几句即可:
<%
Object isLogin = session.getAttribute("isLogin");
if(isLogin == null){
response.sendRedirect("login.jsp");
}
%>