您的位置:首页 > 编程语言 > Java开发

Struts2自定义拦截器

2015-08-07 13:29 357 查看
介绍

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: