正如上一篇文章说的,拦截器是struts2的核心,同时struts2引入了注解的方式。这里就来简单看看针对struts2.1中使用注解和拦截器的开发。
首先要引入struts2.1各包,特别要引入Convention Plugin插件。
本文只是一个简单模拟,因此我们新建两个jsp文件,分别为登录和退出。
login.jsp
< %@ page language="java" pageEncoding="GB18030"%>
< %
pageContext.getSession().setAttribute("user","huashui");
pageContext.getSession().setAttribute("rights","TEST_AUTH");
%>
登录成功
logout.jsp
< %@ page language="java" pageEncoding="GB18030"%>
< %
pageContext.getSession().removeAttribute("user");
pageContext.getSession().removeAttribute("rights");
%>
退出成功
index.jsp
< %@ page language="java" pageEncoding="GB18030"%>
< !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>主页</title>
</head>
<body>
<p>
${tip }
</p>
<a href="login.jsp">登录</a>
<br />
<a href="logout.jsp">退出</a>
<br />
<a href="admin/test.action">权限页面</a>
</body>
</html>
建好了这三个页面后,我们开始来写注解。
package org.huashui.authentication;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
*@author Huashui
*@blog http://huashui.org
*/
@Retention(RetentionPolicy.RUNTIME)//指定该注解是在运行期进行
@Target({ElementType.METHOD})//指定该注解要在方法上使用
public @interface AuthName {
String value() default "";
}
注解本身不能起作用,注解起作用关键在于后台有一个解析器。接下来来写下这个解析器。
package org.huashui.authentication;
import java.lang.reflect.Method;
/**
* @author huashui
* @blog http://huashui.org
*/
public class ParseAuthName {
public static String parseAuthentication(Class< ?> clazz, String methodName,
Class< ?>... parameterTypes) throws NoSuchMethodException {
//根据方法名,取得方法,如果有则返回
Method method = clazz.getMethod(methodName, parameterTypes);
if (null != method) {
AuthName authName = method.getAnnotation(AuthName.class);
if (null != authName) {
return authName.value();
}
}
return null;
}
}
接下来书写拦截器
package org.huashui.interceptor;
import org.huashui.authentication.ParseAuthName;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionProxy;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
/**
* @authorhuashui
* @blog http://huashui.org
*/
@SuppressWarnings("serial")
public class AuthInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
ActionContext context = invocation.getInvocationContext();
String user = (String) context.getSession().get("user");
String rights = (String) context.getSession().get("rights");
if (null != user) {
ActionProxy proxy = invocation.getProxy();
String methodName = proxy.getMethod();
Object action = proxy.getAction();
String auth = null;
try {
auth = ParseAuthName.parseAuthentication(action.getClass(),
methodName, null);
} catch (NoSuchMethodException e) {
e.printStackTrace();
ActionContext.getContext().put("tip", "没有权限");
return Action.LOGIN;
}
if (null != auth) {
if ("TEST_AUTH".equals(auth)) {
return invocation.invoke();
}
}
ActionContext.getContext().put("tip", "没有权限");
return Action.LOGIN;
} else {
ActionContext.getContext().put("tip", "没有登录");
return Action.LOGIN;
}
}
}
接下来配置下拦截器
< ?xml version="1.0" encoding="UTF-8" ?>
< !DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="huashui-default" namespace="/admin"
extends="struts-default">
<interceptors>
<interceptor name="auth"
class="org.huashui.interceptor.AuthInterceptor">
</interceptor>
<interceptor -stack name="authdefault">
</interceptor><interceptor -ref name="defaultStack"></interceptor>
<interceptor -ref name="auth"></interceptor>
</interceptors>
<default -interceptor-ref name="authdefault"></default>
</package>
</struts>
配好这些后,我们开始写Action进行测试
package org.huashui.action;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.huashui.authentication.AuthName;
/**
* @author 曾华水
* @email email@huashui.org
*/
@ParentPackage("huashui-default")
@Namespace("/admin")
public class UserListAction {
@AuthName(value = "TEST_AUTH")
@Action(value = "test", results = {
@Result(name = "success", location = "/WEB-INF/content/success.jsp"),
@Result(name = "login", location = "/index.jsp")
})
public String execute() {
return com.opensymphony.xwork2.Action.SUCCESS;
}
}
完成。

Canada>Canada Loli Imgboard Pthc wpjtaz
On another call Hussyfan Kids avt