Struts2自定义拦截器
2015-08-07 13:29
357 查看
介绍
Struts2的拦截器(Intercaptor)在Action前后执行,完成了横切、预处理和后加工的任务,隔离了Web应用程序的关注点,使得一些特殊处理任务封装了拦截器中,极大的提高了分离程度,并且提高了代码的重用性。Struts2在其默认包struts-default中提供的默认拦截器栈-defaultStack,提供了从数据转移和验证到一场处理,完成了框架的大部分处理工作,虽然满足了开发人员的大部分需求,但是有些时候也需要自定义拦截器,比如实现用户是否登录验证。
自定义拦截器步骤:
1. 编写自定义拦截器类,实现interceptor接口,或者继承AbstractIntercaptor抽象类。
2. 在struts.xml文件中配置拦截器。
情景设计
当用户登录成功可以查看相关详细信息页面,没登录时不能查看详细信息页面,并且自动跳转到登录页面,逻辑很简单,下面看一下具体实现代码。
实现细节
代码总体结构,如下图
![](http://img.blog.csdn.net/20150810144617326)
1.创建拦截器类AuthenticationInterceptor.java
首先看一下如何自定义拦截器类,创建java类:AuthenticationInterceptor,实现interceptor接口,或者继承AbstractIntercaptor抽象类,如果实现interceptor接口,需要实现三个抽象方法,destroy,init,intercept。AbstractIntercaptor抽象类需要实现intercept抽象方法。两个抽象方法都传入一个ActionInvocation对象,返回字符串对象。
AuthenticationInterceptor.java
2.处理登录的Action
UserLogin.java
3.UserService.java
4.User.java
5.struts.xml文件
6.前端页面
(1) index.jsp
(2) Login.jsp
(3) LoginSuccess.jsp
(4) ShowDetail.jsp
(5) Error.jsp
Struts2的拦截器(Intercaptor)在Action前后执行,完成了横切、预处理和后加工的任务,隔离了Web应用程序的关注点,使得一些特殊处理任务封装了拦截器中,极大的提高了分离程度,并且提高了代码的重用性。Struts2在其默认包struts-default中提供的默认拦截器栈-defaultStack,提供了从数据转移和验证到一场处理,完成了框架的大部分处理工作,虽然满足了开发人员的大部分需求,但是有些时候也需要自定义拦截器,比如实现用户是否登录验证。
自定义拦截器步骤:
1. 编写自定义拦截器类,实现interceptor接口,或者继承AbstractIntercaptor抽象类。
2. 在struts.xml文件中配置拦截器。
情景设计
当用户登录成功可以查看相关详细信息页面,没登录时不能查看详细信息页面,并且自动跳转到登录页面,逻辑很简单,下面看一下具体实现代码。
实现细节
代码总体结构,如下图
1.创建拦截器类AuthenticationInterceptor.java
首先看一下如何自定义拦截器类,创建java类:AuthenticationInterceptor,实现interceptor接口,或者继承AbstractIntercaptor抽象类,如果实现interceptor接口,需要实现三个抽象方法,destroy,init,intercept。AbstractIntercaptor抽象类需要实现intercept抽象方法。两个抽象方法都传入一个ActionInvocation对象,返回字符串对象。
AuthenticationInterceptor.java
package cn.sanishan.common.interceptor; import java.util.Map; import cn.sanishan.common.bean.User; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor; /** * 自定义拦截器,判断session中用户名是否存在如果不存在则进入登录界面 * 实现Interceptor接口,实现三个方法(destroy、init、intercept) * @author ShanQiang * @date 2015年8月7日 */ public class AuthenticationInterceptor implements Interceptor{ public void destroy() { } public void init() { } public String intercept(ActionInvocation actinInvocation) throws Exception { // 通过ActionInvocation对象获取session,为了解耦,不推荐使用servelet api获取session Map session = actinInvocation.getInvocationContext().getSession(); User user = (User) session.get("user"); if(user==null){ // 如果用户为空,跳转到登录界面 return Action.LOGIN; }else{ return actinInvocation.invoke(); } } }
2.处理登录的Action
UserLogin.java
package cn.sanishan.common.action; import java.util.Map; import org.apache.struts2.interceptor.SessionAware; import cn.sanishan.common.bean.User; import cn.sanishan.common.service.UserService; import com.opensymphony.xwork2.ActionSupport; /** * 用户登录验证 * 继承ActionSupport类,重写execute() * @author ShanQiang * @date 2015年8月7日 */ public class UserLogin extends ActionSupport implements SessionAware{ private User user; // 由于SessionAware接口中的注册session的方法-setSession(Map session)需要一个Map类型 private Map session; @Override public String execute() throws Exception { UserService service = new UserService(); String result = service.validateUser(user); System.out.println(result); if("success".equals(result)){ session.put("user",user); } return result; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } /** * 通过SessionAware的setSession方法注册session */ public void setSession(Map session) { this.session = session; } }
3.UserService.java
package cn.sanishan.common.service; import java.util.HashMap; import java.util.Map; import cn.sanishan.common.bean.User; /** * * @author ShanQiang * @date 2015年8月7日 */ public class UserService { private static Map users = new HashMap(); /** * 通过静态块,创建一个对象 */ static{ User user1 = new User(); user1.setUsername("zhangsan"); user1.setPassword("123"); users.put(user1.getUsername(),user1); } /** * 获取user对象 * @param user * @return */ public User getUser(String username){ return (User) users.get(username); } /** * 验证用户是否存在,如果存在返回true, * @param user * @return */ public String validateUser(User user){ // 通过用户名去查询用户 User _user = this.getUser(user.getUsername()); // 判断用户是否为空,如果为空的话返回"input",如果不为空的话,进一步判断密码是否正确。 if(_user!=null){ if( user.getPassword().equals( _user.getPassword() ) ){ return "success"; }else{ return "input"; } }else{ return "input"; } } }
4.User.java
package cn.sanishan.common.bean; /** * 用户实体类 * @author ShanQiang * @date:2015年8月7日 */ public class User { // 用户名 private String username; // 密码 private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
5.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.i18n.encoding" value="UTF-8"/> <!-- 开发者模式 --> <constant name="struts.devMode" value="true"/> <package name="common" extends="struts-default" namespace="/common"> <!-- 自定义拦截器 --> <interceptors> <interceptor name="authenticationIntercepttor" class="cn.sanishan.common.interceptor.AuthenticationInterceptor"/> </interceptors> <!-- 配置全局返回结果 --> <global-results> <!-- 用户判断session的结果 --> <result name="login">/Login.jsp</result> <result name="input">/Login.jsp</result> <result name="error">/WEB-INF/common/Error.jsp</result> </global-results> <!-- 全局异常处理 --> <global-exception-mappings> <exception-mapping exception="java.lang.Exception" result="error" /> </global-exception-mappings> <action name="Login" class="cn.sanishan.common.action.UserLogin"> <result name="success">/WEB-INF/common/LoginSuccess.jsp</result> </action> <action name="show" class="cn.sanishan.common.action.ShowAction"> <interceptor-ref name="authenticationIntercepttor"></interceptor-ref> <result>/WEB-INF/common/ShowDetail.jsp</result> </action> </package> </struts>
6.前端页面
(1) index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>HelloWorld</title> </head> <body> <script> // 项目一加载就进入到登录界面 window.location = " Login.jsp"; </script> </body> </html>
(2) Login.jsp
<%@ 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>Login</title> </head> <body> <s:form action="common/Login"> <s:textarea name="user.username" label="用户名"></s:textarea> <s:password name="user.password" label="密码"></s:password> <s:submit value="登录"></s:submit> </s:form> </body> </html>
(3) LoginSuccess.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!-- 引入struts2的标签库s --> <%@ taglib prefix='s' uri="/struts-tags" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>LoginSuccess</title> </head> <body> <s:set name="username" value="user.username"></s:set> 欢迎<s:property value="#username"/>登录成功!<br> <a href="common/show.action">显示</a> </body> </html>
(4) ShowDetail.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> </head> <body> 显示详细信息页面<br> </body> </html>
(5) Error.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>Error</title> </head> <body> Error!!! </body> </html>
相关文章推荐
- JAVA 阻塞队列实现 生产者和消费者 模式
- javafx spring
- JAVA中转义字符
- Java中Cloneable 和 clone()的总结和使用
- mac 下面破解MyEclipse 10的方法
- JAVA捕获异常与抛出异常
- Java集合框架中的核心接口、集合及映射实现类表
- JVM内存分配与回收
- Java 实现的断点下载
- Eclipse 中双击变量不高亮 解决办法
- Java窗体加载时组件不显示的解决方法
- 理解Quartz原理
- Java核心技术第9版中文扫描版
- Java 使用线程池递归压缩一个文件夹下的所有子文件
- JavaSE----面向对象(多态、抽象类、接口)
- org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider
- 【开发环境】JAVA 环境变量批处理
- 其他可插拔的mvc的实现
- Stacks-分别用链表和数组实现(in Java)
- Spring依赖注入:注解注入总结