Ubuntu开发Struts2应用(5、自定义拦截器)
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>
<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