Ubuntu开发Struts2应用(5、自定义拦截器)

2012年01月24日 JAVA, Linux, Ubuntu 暂无评论

Struts2为我们提供了丰富的拦截器,而实现自定义拦截器也是容易的一件事。
拦截器必须是无状态的,原因是Struts2不能保证为每一个请求或者action创建一个实例,所以如果拦截器带有状态,会引发并发问题。
实际应用中处理权限问题是常见的,下面就以一个拦截器来判断处理用户是否登录而有权限去执行action的内容。
LoginInterceptor.java

package com.linuxsight.interceptor;
 import com.opensymphony.xwork2.ActionContext;
 import com.opensymphony.xwork2.ActionInvocation;
 import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
 public class LoginInterceptor extends AbstractInterceptor {
 private static final long serialVersionUID = 1L;
 @Override
 public String intercept(ActionInvocation invocation) throws Exception {
 ActionContext act=ActionContext.getContext();
 Object user = act.getSession().get("user");
 if(null!=user){//user不为空表示用户已经登录,允许执行action的方法。
 System.out.println("用户已登录");
 return invocation.invoke();
 }
 act.put("message", "你没有权限操作");
 return "input";
 }
 }

LoginAction.java

package com.linuxsight.action;
 public class LoginAction {
 private String message;
 public String getMessage() {
 return message;
 }
 public void setMessage(String message) {
 this.message = message;
 }
 public String execute() throws Exception{
 this.message="执行了LoginAction的方法	";
 System.out.println("执行了LoginAction的方法");
 return "input";
 }
 }
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>
<!-- 自定义拦截器 -->
<package name="authority"  extends="struts-default">
<interceptors>
<interceptor name="loginPemission" class="com.linuxsight.interceptor.LoginInterceptor">
</interceptor>
<!-- 拦截器栈 -->
<interceptor-stack name="loginPemissionStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="loginPemission"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 全局result -->
<global-results>
<result name="input">/login.jsp</result>
</global-results>
<action name="login" class="com.linuxsight.action.LoginAction">
<interceptor-ref name="loginPemissionStack"></interceptor-ref>
</action>
</package>
</struts>
login.jsp(模拟登录界面,用户是否登录将决定是否有权限去执行Action里的方法内容)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>登录</title>
</head>
<h3>自定义拦截器|用户登录</h3>
<body>
${message}<br>
<a href="login">执行操作</a>
<br>
<a href="user.jsp">登录</a>&nbsp;&nbsp;
<a href="quit.jsp">注销</a>
</body>
</html>
quit.jsp(模拟用户退出)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>登录</title>
</head>
<%request.getSession().removeAttribute("user"); %>
<h3>自定义拦截器|用户退出登录</h3>
<a href="login.jsp">返回操作</a>
<body>
</body>
</html>
user.jsp(模拟用户登录)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>登录</title>
</head>
<%request.getSession().setAttribute("user","linuxsight"); %>
<h3>自定义拦截器|用户已经登录</h3>
<a href="login.jsp">返回操作</a>
<body>
</body>
</html>

最后我把源代码共享一下,大家需要可以参考:http://115.com/file/dpbckf3m

给我留言