Struts2笔记三


本文的核心内容:拦截器(拦截栈)、JSP通用跳转


一:Struts2的拦截器(Interceptor) 同一个包中有效。


1. 作用:拦截请求和响应。可将多个Action中的共性代码提取到拦截器中,从而可以减少Action中的代码冗余。(作用类似于Servlet中的Filter)

 

2. 实现:  实现接口->配置Struts.Xml

 

 

 

3. 拦截响应:ai.invoke()方法之前执行的代码片段,称为拦截请求;ai.invoke()方法之后执行的代码片段,称为拦截响应。

4. 中断请求:

I. 拦截器中可根据条件判断控制程序流程(调用ai.invoke(),到达目标Action)或者根据拦截器的返回结果,中断可断请求,并执行全局跳转。

5. 拦截器栈:

 

 

如果不自己定义拦截器:Struts2默认的拦截器部分。

 

 

 

6. 设置引用默认拦截器栈:

 

 

7. 书写顺序:package 标签内部书写顺序

I. 拦截器

II. 拦截器栈

III. 默认引用的拦截器(栈)

IV. 全局跳转

V. Action


8. 拦截器不能直接拦截JSP页面。

解决方案   将重要的JSP页面全放入WEB-INF目录下。(防止用户直接访问)

            Web.xml设置默认访问页面index.jsp

            

             <welcome-file-list>
  	            <welcome-file>/index.jsp</welcome-file>
              </welcome-file-list>

            index.jsp页面使用脚本直接跳转MainAction->主页面

Index.jsp

 

 

MainAction

 

 

Struts.xml

 

 

MainAction只做一件事,加载信息,跳转主页面

通过直接访问Action间接控制JSP页面的访问

 

9. 方法拦截器

继承MethodFilterInterceptor

 

 

配置拦截(黑白名单)



拦截器实战:用户权限验证(用户不登录不能访问任何与自身数据有关操作)

1:用户登录成功后->Session中存储用户的信息。

private String name;
private String pwd;

//实例属性需要为其提供get/set方法 ,此处省略
public String login() throws Exception {	
		HttpServletResponse response=ServletActionContext.getResponse();
		ControlService service=new ControlServiceImpl();
		Control con=service.login(name, pwd);
		ValueStack vs=ActionContext.getContext().getValueStack();
		if(con==null){
			return Action.NONE;
		}else{
			Cookie cookieName=new Cookie("name",name);
			Cookie cookiePwd=new Cookie("pwd",pwd);
			//路径必须设置为当前JSP页面同一级所在路径:/EMSStruts/login.jsp
			cookieName.setPath("/EMSStruts");
			cookiePwd.setPath("/EMSStruts");
			response.addCookie(cookieName);
			response.addCookie(cookiePwd);			
			vs.setValue("#session.con", con);
			return Action.SUCCESS;
		}			
	}

2:拦截器的核心方法。


	public String intercept(ActionInvocation ai) throws Exception {
		//通过ai获取值栈->操作OGNL表达式取作用域中的值。
		ValueStack vs=ai.getStack();
		Control con=(Control)vs.findValue("#session.con");
		if(con!=null){
			ai.invoke();//已登录->放行。
		}		
		return "loginPage";//未登录->全局跳转
	}


3:Struts配置文件



                <interceptors>
			<!-- 如果自定义拦截器后、Struts2默认拦截栈将失效,如果需要则需手动引入 -->
			<interceptor name="check" class="interceptor.CheckInterceptor" />
			
			<!-- 自定义拦截栈可以封装多个拦截栈和拦截器、省去每个Action配置的麻烦 -->
			<interceptor-stack name="myStack">
				<interceptor-ref name="check" />
				<!-- 引入Struts2默认拦截栈 -->
				<interceptor-ref name="defaultStack"/>
			</interceptor-stack>
                </interceptors>
		<!-- 设置当前包下所有Action默认执行的拦截栈或拦截器->不必再每个Action中手动配置
			如果有特殊的拦截器则需在Action中添加
		 -->
		<default-interceptor-ref name="myStack" />
		
		 <!--设置全局跳转、 name若与Action的name冲突,Action的name优先   -->
		<global-results>
			<result name="loginPage" type="redirect">/login.jsp</result>
		</global-results>

二:配置通用JSP页面跳转


 

 

  

Action跳转JSP页面转为->跳转通用的Action自动完成路径配置。



猜你喜欢

转载自blog.csdn.net/sugar_map/article/details/80260827
今日推荐