zoukankan      html  css  js  c++  java
  • 【SSH三框架】Struts2第六章的基础:他们拦截函数的定义

    干web当然,需要做的事情时,项目管理登录身份验证及其他权利。假设我们必须使用相应的登陆,未经允许是不可能的。

    因此,我们需要使用拦截器,拦截功能struts2它集成。当然,有可能在Spring正在使用,这以后会写Spring时间写博客。

    下一个,验证,未登陆不可以訪问一些方法:


    首先,我们创建一个web项目,而且配置一些Struts2的jar包和web.xml文件。这两个就不多说了。

    我们首先写一个登陆获得session的界面:index.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    
    <% 
    	request.getSession().setAttribute("user", "itcast");
    %>
    用户已经登陆
    在这个界面,我们如果用户已经登陆,而且设置了一个session


    我们还要写一个退出登陆的界面:remove.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    
    <% 
    	request.getSession().removeAttribute("user");
    %>
    用户已经退出
    在这个界面,我们注销了session(也不能说是注销,由于我们仅仅是把user这个属性移除了)


    然后。我们须要配置下struts.xml文件了,这里是最重要的一步:

    <?xml version="1.0" encoding="GBK"?>
    <!DOCTYPE struts PUBLIC
    	"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
    	"http://struts.apache.org/dtds/struts-2.1.7.dtd">
    <!-- 指定Struts 2配置文件的根元素 -->
    <struts>
    	
    	<package name="employee" namespace="/control/employee" extends="struts-default">
    		<interceptors>
    			<interceptor name="permission" class="cn.interceptor.PermissionInterceptor"></interceptor>
    			<interceptor-stack name="permissionStack">
    				<interceptor-ref name="defaultStack" />
    				<interceptor-ref name="permission" />
    			</interceptor-stack>
    		</interceptors>
    		
    		<global-results>
    			<result name="message">/WEB-INF/message.jsp</result>
    		</global-results>
    		<action name="list_*" class="cn.com.HelloWorldAction" method="{1}">
    			<interceptor-ref name="permissionStack" />
    		</action>
    	</package>
    </struts>
    1、<interceptors></interceptors>标签。这是定义interceptors的

    2、<interceptor name="permission" class="cn.interceptor.PermissionInterceptor"></interceptor>这里定义了一个interceptor,name是permission。拦截器类是PermissionInterceptor。这个类是我们自定义的

    3、<interceptor-stack name="psermissionStack"></interceptor-stack>这是定义了一个拦截器栈。假设我们为某个action设置了单个的自己定义的interceptor。将会导致Struts2的一些核心拦截器失效,所以我们须要定义一个拦截器栈,把<interceptor-ref name="defaultStack">这个Struts2的默认拦截器栈加入进去,而且放在栈顶,然后再加入进去我们自己定义的拦截器:<interceptor-ref name="permission />。这样子我们就能够在<action>中加入进去一个拦截器栈,而不是单一的一个拦截器。

    4、<global-results>这是定义了一个全局的result视图

    5、<action></action>能够看到我们在这个action插入了一个标签<interceptor-ref name="permissionStack" />这就是把我们上边定义的拦截器栈增加了进去。


    在我们的struts.xml配置完毕之后。我们须要写一个拦截器类了:PermissionInterceptor.java,该类扩展了com.opensymphony.xwork2.interceptor.Interceptor接口

    package cn.interceptor;
    
    import java.util.Map;
    
    import javax.interceptor.InvocationContext;
    
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionInvocation;
    import com.opensymphony.xwork2.interceptor.Interceptor;
    
    public class PermissionInterceptor implements Interceptor {
    
    	@Override
    	public void destroy() {
    		
    
    	}
    
    	@Override
    	public void init() {
    		
    
    	}
    
    	@Override
    	public String intercept(ActionInvocation actionInvocation) throws Exception {
    		Object user = ActionContext.getContext().getSession().get("user");
    		if(user!=null){
    			return actionInvocation.invoke();
    		}
    		ActionContext.getContext().put("message", "你没有权限运行该操作");
    		return "message";
    	}
    
    }
    
    在这个接口中。有三个方法,各自是销毁、初始化、还有详细的intercept的操作:

    在intercept()方法中:我们首先通过ActionContext对象获得了user对象,假设user对象不为空(登陆),则我们return actionInvocation.invoke()。拦截器栈中兴许的拦截器继续运行。等到拦截器运行完之后,action中调用的方法就開始运行了。假设对象为空,我们设置message。而且返回message视图。


    接下来,我们要给action定义对应的逻辑处理类:

    package cn.com;
    
    public class HelloWorldAction {
    	private String message;
    
    	public String getMessage() {
    		return message;
    	}
    
    	public void setMessage(String message) {
    		this.message = message;
    	}
    	public String addUI(){
    		this.message="addUI";
    		return "message";
    	}
    	public String execute() throws Exception{
    		this.message="execute";
    		return "message";
    	}
    }
    
    在上边调用拦截器之后。假设我们return actionInvocation.invoke(),则我们会运行这个逻辑类中对应的方法,假设我们调用了execute()方法,我们会运行这种方法中的逻辑处理,然后。返回message视图。


    然后。我们来写一下message相应的视图:message.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%@ taglib uri="/struts-tags" prefix="s" %>
    <% 
    	String user = (String)request.getSession().getAttribute("user");
    %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>    
        <title>My JSP 'message.jsp' starting page</title>
        
    	
    
      </head>
      
      <body>
        ${message }
        <%=user %>
      </body>
    </html>
    


    这是我们项目的project文件夹:

    假设我们首先输入:http://localhost:8080/test/control/employee/list_execute.action,这是要訪问execute()方法,在页面中会打印出:你没有权限运行该操作 null

    假设我们输入:http://localhost:8080/test/index.jsp,页面上会打印出:用户已经登陆

    然后,我们再输入:http://localhost:8080/test/control/employee/list_execute.action。页面上会打印出:execute itcast

    可以看出来,我们的拦截器起作用了:在不登陆的情况下。我们不可以訪问对应的方法








    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    软工2021个人阅读作业#2——构建之法和CI/CD的运用
    2021年.Net中级开发工程师面试题
    OneForAll框架搭建之旅:Vue + .NetCore WebApi(3)
    创建WebService服务--.NET Core与SoapCore 及遇到的问题(二)
    创建WebService服务--.NET Framework(一)
    面试小记
    Vue开发环境安装
    java笔记之设计模式 1、创建型模式:工厂方法
    Abp太重了?轻量化Abp框架
    Tomcat学习2:一键启动以及源码阅读
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4871007.html
Copyright © 2011-2022 走看看