struts 2——拦截器的实现实例

目录

说明

struts 2:登录页面+拦截器

配置文件web.xml

代码片.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>Text</display-name>
  
  <!-- 核心拦截器 -->
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <!-- 之间不能有空格 -->
    <url-pattern>/ *</url-pattern>
  </filter-mapping>
</web-app>

配置文件struts.xml

代码片.

<?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="mypackage" extends="struts-default">  
 <!-- 定义一个拦截器 -->  
        <interceptors>  
            <interceptor name="authority"  
                class="struts.myinterceptor">  
            </interceptor>  
            <!-- 拦截器栈 -->  
            <interceptor-stack name="myinterceptor-stack">  
            	<interceptor-ref name="authority" />  
                <interceptor-ref name="defaultStack" />  
            </interceptor-stack>  
        </interceptors>  
      </package>
</struts>

action类login.java

代码片.

package struts;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import user.user;
//设置action的包名
@ParentPackage("mypackage")
public class login extends ActionSupport implements ModelDriven<user> {

	private static final long serialVersionUID = 1L;
	private user user=new user();//实例化实体类

	//注册一个action,访问路径是login,加入一个拦截器栈myinterceptor-stack。dispatcher:转发,redirect:重定向
	@Action(value="login",
			results={@Result(name="login",location="/WEB-INF/login.jsp",type="dispatcher"),
					@Result(name="hello",location="/hello.jsp",type="redirect")},
			interceptorRefs={
					@InterceptorRef(value="myinterceptor-stack")
			})
	//登录验证
	public String mylogin(){
		HttpServletRequest request=ServletActionContext.getRequest();
		System.out.println("这是action");
		//模拟数据库操作--成功登录
		if(user.getName().equals("123")&&user.getPass().equals("123")){
			ServletActionContext.getRequest().getSession().setAttribute("login","true");
			return "login";
		}
		//登录失败
		request.getSession().setAttribute("mapping", "密码或用户名错误");
		return "hello";
	}
	
	@Override
	public user getModel() {
		// TODO Auto-generated method stub
		return user;
	}
}

说明:

  1. 使用ModelDriven< user >接口,接收表单数据。要实例化实体类,实体类的属性名和表单项名一一对应。
  2. 使用注解来注册action。继承ActionSupport,表示此类是一个action。(也可以不继承)

实体类user.java

代码片.

import java.io.Serializable;
public class user implements Serializable {

	private static final long serialVersionUID = 1L;
	private String name;
	private String pass;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPass() {
		return pass;
	}
	public void setPass(String pass) {
		this.pass = pass;
	}
	@Override
	public String toString() {
		return "user [name=" + name + ", pass=" + pass + "]";
	}
}

说明:

拦截器myinterceptor.java

代码片.

package struts;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

//判断用户是否登录
public class myinterceptor extends AbstractInterceptor {
	private static final long serialVersionUID = 1L;
	@Override
	public String intercept(ActionInvocation arg0) throws Exception {
		
		// 获得被调用的Action类
		Object action = arg0.getAction();
		
		//在struts中可以直接使用ServletActionContext对象,获取web的内置对象
		HttpServletRequest request=ServletActionContext.getRequest();
		System.out.println("在拦截器中"+request.getParameter("s"));
		
		//用户是否有访问的钥匙“s”
		if(request.getParameter("s")==null){
			request.setAttribute("s", "false");
		}
		//有钥匙或者是登录页面,都会被放行
		if(request.getParameter("s").equals("true")||
				request.getSession().getAttribute("login").equals("true")){
			System.out.println("这是struts拦截器-=-通过");
			return arg0.invoke();	//通过拦截器,执行action中的内容	
		}

		//被拦截,向页面输出提示
		System.out.println("这是struts拦截器-=-拦截");
		request.getSession().setAttribute("mapping", "请先登录");
		System.out.println(request.getSession().getAttribute("mapping"));
		//直接返回字符串与action的 Result 匹配
		return "hello";
	}
}

说明:

  1. 实现抽象类AbstractInterceptor ,表示此类是一个拦截器。
  2. 实现Interceptor 接口重写init()和destroy()方法,完成拦截器的生命周期。

servlet监视器mysessionli.java

代码片.

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener
public class mysessionli implements HttpSessionListener {
    public mysessionli() {
    }
    public void sessionCreated(HttpSessionEvent arg0)  {
    	System.out.println("这是监视器");
    	arg0.getSession().setAttribute("login", "false");
    }
    public void sessionDestroyed(HttpSessionEvent arg0)  { 
    }
}

说明

  1. 用注解来定义servlet监视器。
  2. 监视session的创建。
  3. 设置用户登录是否成功。

登录界面hello.jsp

代码片.

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>登录界面</title>
</head>
<body>
	<div align="center">
		<font size="6" color="red"> <%
		System.out.println("jsp"+request.getAttribute("s"));
 	if (session.getAttribute("mapping") != null) { 		
 		out.println(session.getAttribute("mapping"));
 	}
 %></font>
	<form action="login?s=true" method="post">
			<table>
				<tr>
					<td>用户名:</td>
					<td><input name="name" type="text" /></td>
				</tr>
				<tr>
					<td>密码:</td>
					<td><input name="pass" type="password" /></td>
				</tr>
				<tr>
					<td><input type="submit" value="提交" id="s" /></td>
					<td><input type="reset" value="重置" id="r" /></td>
				</tr>
			</table>
		</form>
	</div>
</body>
</html>

总结

	1. 拦截器如何不拦截登录页面
	2. 注解定义action
**引用包是最大的困难(一步一步来)**
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值