2014年4月18日星期五

【web开发】☆★之Struts2自定义拦截器拦截登录

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
【web开发】☆★之Struts2自定义拦截器拦截登录  阅读原文»

【web开发】☆★之Struts2自定义拦截器拦截登录

【web开发】☆★之Struts2自定义拦截器拦截登录

在实际项目中我们的方法都是需要验证登录状态的,所以在使用Struts2框架的项目中,自定义拦截器是一个不错的选择,本文就简单介绍如何使用拦截器,对全局方法进行验证登录状态!

第一步搭建Struts2开发环境

第二步:编写一个Action方法

  package csg.struts2.action;  /**   *   * @author 小夜的传说   * @2014-4-18   * @struts   * @csg.struts2.action   * @StrutsAction   * @2014-4-18上午1:03:37   */  public class StrutsAction {      private String message;      public String getMessage() {          return message;      }      public void setMessage(String message) {          this.message = message;      }      public String execute() {          message = "execute方法";          return "success";      }      public String addUI() {          message = "addUI方法";          return "success";      }  }  

第三步写一个jsp视图模仿登录状态,只要访问这个jsp了,就把用户信息放在Session中代表已经登录,可以操作action方法,没有访问这个jsp代表没有登录,不可以操作任何方法

  <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  <html>    <head>      <title>拦截器</title>      <meta http-equiv="pragma" content="no-cache">      <meta http-equiv="cache-control" content="no-cache">      <meta http-equiv="expires" content="0">      <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">    </head>    <body>      <%      request.getSession().setAttribute("user", "login");      %>      用户已登录    </body>  </html>  

第四步:配置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="struts2" namespace="/test" extends="struts-default">          <!-- 通配符形式访问action -->          <action name="list_*" class="csg.struts2.action.StrutsAction" method="{1}">              <result name="success">/WEB-INF/page/success.jsp</result>          </action>      </package>  </struts>  

第五步:部署到服务器上直接访问:http://127.0.0.1:8080/struts/test/list_addUI.action

会打印出addUI方法!ok,下面就是写一个拦截器了!

第六步:编写登录拦截器

  package csg.struts2.interceptor;  import com.opensymphony.xwork2.ActionContext;  import com.opensymphony.xwork2.ActionInvocation;  import com.opensymphony.xwork2.interceptor.Interceptor;  /**   *   * @author 小夜的传说   * @2014-4-18   * @struts   * @csg.struts2.interceptor   * @LoginInterceptor   * @2014-4-18上午1:03:29   */  public class LoginInterceptor implements Interceptor {      // 方法在拦截器被垃圾回收之前调用,用来回收init方法初始化的资源      public void destroy() {      }      // 方法在拦截器被创建之后,在对Action镜像拦截之前调用,使用这个方法主要是给拦截器做类似初始化的操作      public void init() {      }      public String intercept(ActionInvocation invocation) throws Exception {          Object user = ActionContext.getContext().getSession().get("user");          if (user != null) {              // 如果user不为null,代表用户已经登录,允许执行action中的方法 这个结果就代表返回验证通过              return invocation.invoke();          } else {              //提示用户登录,我这里直接提示,在实际项目中,肯定会返回到登录页面              ActionContext.getContext().put("message", "你没有登录");              return "success";          }      }  }  

第七步:最重要的,我们要在写好的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="struts2" namespace="/test" extends="struts-default">          <interceptors>              <interceptor name="logininterceptor" class="csg.struts2.interceptor.LoginInterceptor"/>              <!-- 自定义一个拦截器栈,下面你拦截只需要用这个栈名字就行了 -->              <interceptor-stack name="loginstack">              <!-- 这个是系统拦截器栈,不这样写,就是当你单独一个action引用拦截器的时候就无法使用拦截器的中的核心功能 -->              <interceptor-ref name="defaultStack"/>              <!-- 这个引用你自己写的拦截器 -->              <interceptor-ref name="logininterceptor" />              </interceptor-stack>          </interceptors>          <!-- 这样写的意思是 在这个package包下面的所有action方法都需要拦截器 -->          <default-interceptor-ref name="loginstack"></default-interceptor-ref>          <!-- 全局视图,这个就是说拦截到你没登录的时候提示你登录 ,你做的话可以提示返回登录界面-->          <global-results>              <result name="success">/WEB-INF/page/message.jsp</result>          </global-results>          <!-- 通配符形式访问action -->          <action name="list_*" class="csg.struts2.action.StrutsAction" method="{1}">              <result name="success">/WEB-INF/page/success.jsp</result>              <!-- 也可以这样写 ,但是这样写就比较麻烦了,假如你下面还有action,这样你就每个action都需要引用,所以我注掉了-->              <!-- <interceptor-ref name="loginstack"></interceptor-ref> -->          </action>      </package>  </struts>  

第八步:解析

1、为什么<interceptor-ref name="defaultStack"/>

因为Struts2拦截器是个很奇诡的东西,当你自定义拦截器之后,在某个方法引用自己编写的拦截器之后,那么Struts许多的核心拦截器将无法使用,所以我们我们一般将自己写的拦截器和这个系统拦截器栈一起组成一个栈,这样就可以继续使用Struts2的拦截器了

可以参照struts源代码,在struts2-core-2.3.16.1.jar下面有个struts-default.xml文件,搜索defaultStack

如图:

wKioL1NQlPyzngGjAAKpjquV0yo427.jpg

2、配置全局拦截器的优缺点<default-interceptor-ref name="loginstack"></default-interceptor-ref>

假如,你某一个action方法需要另一个拦截器,但是其他方法不需要,这样你就需要在这个action中单独引用,注意,当你引用了这个拦截器之后,你定义的这个全局拦截器对于这个方法就会失效,所以一定要再次引用一次这个全局拦截器

3、为什么系统拦截器栈写在你定义的拦截器之前

  <!-- 这个是系统拦截器栈,不这样写,就是当你单独一个action引用拦截器的时候就无法使用拦截器的中的核心功能 -->              <interceptor-ref name="defaultStack"/>              <!-- 这个引用你自己写的拦截器 -->              <interceptor-ref name="logininterceptor" />  

因为Struts在实例化的过程中读取的xml是从上到下的这样方式,所以本着项目安全角度,我们先让系统执行Struts2核心拦截器,然后再执行自己写的拦截器。当然你反过来写也行,但是可能有些自己写的复杂的拦截器在系统拦截器没实例化之前,会失效。

4、本文详细对于Struts2拦截器的基本原理进行了简单解析,如果有哪位童鞋有意见,欢迎举手!Thank you!

本文出自 "诺言永远依恋小柴、、、" 博客,请务必保留此出处http://1936625305.blog.51cto.com/6410597/1397669

MDT2012部署系列之04 MDT Windows部署问题故障排除  阅读原文»

在实际生产应用环境中我们会遇到这样那样的问题,而这些问题会让你觉得无从下手,这将是一件很痛苦的事情,下面将一些基础的排错方法例出,希望能够对你有所帮助。

Windows 安装引擎

无论您使用哪种工具部署 Windows 7 或 Windows Server 2008 R2,都会运行新的 Windows 安装引擎。在使用 Windows 自动安装工具包 (AIK) 的 ImageX 等工具应用 Sysprep Windows 映像后运行 setup.exe 或等效的迷你安装工具,应该算是比较完整的安装体验了。运行安装工具时都需要配置信息;系统可能会提示您提供这些信息,但大多数时候它都会查询应答文件 (unattend.xml) 来获取这些信息。安装引擎会将其所有操作都记录到一个日志文件(setupact.log 文件)中,万一 Windows 安装发生错误,我们就需要查看这个文件。

问题一:Windows 安装提示的错误代码很奇怪

在下面的情形中,我们使用 unattend.xml 文件部署 Windows 7,但却在安装到一半时失败了,出现了一个奇怪的错误代码:

wps_clip_image-11756

答案:不要单击"确定"。改按 Shift-F10,找到 setupact.log 文件(此文件所在的位置因安装失败的时间而异)。在此例中,真正的错误是我们在 unattend.xml 中键入了一个错误的计算机名称,而让它出现在了 setupact.log 中。下面这几行就取自 setupact.log。真正导致安装停止的原因是,我故意向 unattend.xml 文件分配了一个超过 16 个字符的计算机名称(我曾见过客户这样做)。

wps_clip_image-26143

使用 MDT 2010 Lite Touch 部署 Windows

使用 MDT 2010 Lite Touch 部署 Windows 时,问题的故障排除过程更为复杂。这是因为,MDT 在核心安装引擎和 Windows AIK 工具上多加了一层工具和脚本。幸运的是,MDT 也提供额外的错误处理和日志文件,可协助我们找出错误原因,让我们在进行故障排除时更加得心应手。为了深入了解故障排除,在使用它部署 Windows 时,必须记住整个过程。

使用 MDT 部署 Windows 时,我们使用所谓的任务序列。任务序列是我们需要在部署过程中完成的一系列步骤或操作。一些常用步骤包括:格式化驱动器、插入驱动程序、使用应答文件运行 Windows 安装、安装应用程序以及安装更新。

MDT 2010 Lite Touch 裸机部署过程如下所示:

启动映像从 CD/USB 或 PXE 启动,启动后,即会连回部署服务器。

部署向导从服务器启动并读取部署设置(规则),然后自动启动部署或者提示您输入数据(因服务器的设置而异)。这些设置存储在内存中。

所选的任务序列随后启动,并开始执行自身包含的操作或步骤。例如,为了确保安装能够获取正确的设置,必须执行以下操作:
a. 收集 � 读取部署设置
b. 配置 � 通过适当的设置来更新 unattend.xml
c. 应用操作系统 � 使用更新后的 unattend.xml 文件运行 setup.exe

应用操作系统映像后,任务序列将重新启动计算机,开机后便从中断处继续进行。

对 MDT 2010 Lite Touch 进行故障排除时,我们也使用日志文件,但这些日志文件存储在 setupact.log 以外的其他位置。各个 MDT 脚本生成其各自的日志文件,但 BDD.log 包含一个所有其他 MDT 日志文件的汇总视图。这些日志存储在 X:\MININT\SMSOSD\OSDLOGS、C:\MININT\SMSOSD\OSDLOGS 或 C:\Windows\Temp\DeploymentLogs 中,存储位置因部署失败的时间而异。BDD.log 是主日志文件,但 SMSTS.log 文件可能还会生成另外一些关于 Lite Touch 部署中断原因的线索。(顺便说一下,对日志文件进行格式化是为了让 trace32 实用工具读取它们。)

问题二:MDT 2010 Lite Touch 无法连接服务器

这是一个相当常见的错误,但是我们如何解决它呢?在此例中,我知道提供的用户名和密码都正确。

wps_clip_image-28129

下一步是按 F8 来获取命令提示符。由于这个错误是在整个过程的早期发生的,还没有创建 C: 卷来存储日志文件,因此,MDT 将这些日志文件存储在 RAM 中。使用 trace32(或记事本)打开 X:\MININT\SMSOSD\OSDLOGS(RAM 驱动器)中的 BDD.LOG 后,我们会看到以下画面:

wps_clip_image-27709

真正的错误是规则中的拼写错误。部署共享是以 MDTProduction$ 名称被共享的,但我们在规则中键入的却是 MDTProducton$(少了"i")。

本文出自 "东妮学IT" 博客,谢绝转载!

阅读更多内容

没有评论:

发表评论