Struts攔截器和過濾器的區別:
過濾器:對所有的東西都過濾。包括css,.js,.jpg等。
攔截器:只對action攔截。是struts工具。
一、攔截器配置。
1.創建一個類,讓其繼承自AbstractInterceptor
2.配置struts.xml
1)添加<interceptors>配置節,添加攔截器配置。
2)在action中引用,<interceptors>中的配置。
注意:
1.在action中需要添加defaultStack引用
2.在建<interceptors>可以建立stack,把defaultStack也添加在里面,在引用的時候引用此stack即可。
<?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.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="true" /> <package name="default" namespace="/" extends="struts-default"> <interceptors> <interceptor name="lanjieqi" class="com.itnba.maya.util.Lanjieqi"></interceptor> <interceptor-stack name="newStack"> <interceptor-ref name="lanjieqi"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <action name="*_*" class="com.itnba.maya.controller.{1}Action" method="{2}"> <!-- 直接引用newStack --> <interceptor-ref name="newStack"></interceptor-ref> <result> {1}_{2}.jsp </result> </action> </package> </struts>
二、在攔截器中使用內置對象。
獲取Session
1.ActionContext 獲取Map.
2.ServletActionContext
3.實現SessionAware接口
*****************************************************************
實例:使用攔截器實現登錄身份驗證。
有兩個action是不能攔截。打回登錄界面action,登錄提交驗證並寫 session的action
在登錄驗證的auth方法中,分兩種情況:
1.第一次登錄驗證。此時,session中沒有信息,需要向session中添加登錄信息
2.非第一次登錄驗證。此時,session中有信息,不需要再入session中添加信息
建一個User對象
package com.itnba.maya.model; 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; } }
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.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="true" /> <package name="default" namespace="/" extends="struts-default"> <!-- --> <interceptors> <interceptor name="lanjieqi" class="com.itnba.maya.util.Lanjieqi"></interceptor> <interceptor name="Loginlanjieqi" class="com.itnba.maya.util.Loginlanjieqi"></interceptor> <interceptor-stack name="newStack"> <interceptor-ref name="lanjieqi"></interceptor-ref> <interceptor-ref name="Loginlanjieqi"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <global-results> <result name="nologin">Login_login.jsp</result><!-- session里沒有值再跳回Login_login.jsp --> </global-results> <!-- Login_login和Login_home不能攔截掉,寫上面不受攔截器控制 --> <action name="Login_login" class="com.itnba.maya.controller.LoginAction" method="login"> <result>Login_login.jsp</result> </action> <action name="Login_home" class="com.itnba.maya.controller.LoginAction" method="home"> <result>Login_home.jsp</result> </action> <action name="*_*" class="com.itnba.maya.controller.{1}Action" method="{2}"> <interceptor-ref name="newStack"></interceptor-ref> <result> {1}_{2}.jsp </result> </action> </package> </struts>
ActionSupport類
package com.itnba.maya.controller; import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.itnba.maya.model.User; import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport { HttpSession session=ServletActionContext.getRequest().getSession(); private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String login(){ //login頁面直接跳走 return SUCCESS; } public String home(){ //模擬從數據庫中查出來 List<String> list=new ArrayList<String>(); list.add("zhangsan"); list.add("lisi"); list.add("wangwu"); list.add("zhaoliu"); //第一次session肯定是null的 Object obj=session.getAttribute("user"); if(obj==null){ if(user!=null){ //不判斷下會空會報空指針錯誤 if(list.contains(user.getUserName())){ //看看賬號是否有,這里沒驗證密碼 session.setAttribute("user", user.getUserName());//有就往session放值 return SUCCESS; } else{ return "nologin"; //不包含就走"nologin" } }else{ return "nologin"; } } else{ return SUCCESS; } } }
攔截器的類,判斷sessioni是否有值
package com.itnba.maya.util; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class Loginlanjieqi extends AbstractInterceptor { @Override public String intercept(ActionInvocation arg0) throws Exception { //先獲取session HttpSession session=ServletActionContext.getRequest().getSession(); //session如果沒值就轉到nologin if(session.getAttribute("user") == null){ return "nologin"; } return arg0.invoke(); } }
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>Insert title here</title> </head> <body> <h1>這是登錄頁面</h1> <form action="Login_home"> 賬號:<input type="text" name="user.userName"><br> 密碼:<input type="password" name="user.password"><br> <input type="submit" value="登錄"> </form> </body> </html>
home驗證session之后的頁面
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!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>Insert title here</title> </head> <body> 賬號:<s:property value="user.userName"/> </body> </html>