`

struts2拦截器 获得请求方法名+获得请求参数

阅读更多

SSI框架为基础开发的,hulian平台

struts2拦截器里如何知道你请求的是那个方法
使用:invocation.getInvocationContext().getName(); //输出Priv_queryPriv,这正是我访问的Action中的方法。

 

1.struts.xml中这么定义的

<struts>
	<!-- character filter -->
	<constant name="struts.i18n.encoding" value="utf-8" />
	<constant name="struts.multipart.saveDir" value="/tmp" />
	<constant name="struts.multipart.maxSize" value="1000000000" />
	<!-- CONFIG Global Exception -->
	
	<package name="basePriv" extends="struts-default">
		<interceptors>
			<interceptor name="myPrivInterceptor" class="PrivInterceptor"/>
			<interceptor-stack name="b2cplatPrivInterceptor">
				<interceptor-ref name="myPrivInterceptor">
					<param name="includeMethods"></param>
					<param name="excludeMethods">
						loginMain,loginTop,loginSwitch,loginRight,login,leftMenuShow,
						queryCityList,queryInOrOutAreaList,queryDistricts
					</param>
				</interceptor-ref>
				<interceptor-ref name="defaultStack"/>
			</interceptor-stack>
		</interceptors>
		
		<default-interceptor-ref name="b2cplatPrivInterceptor"/>
		
		<global-results>
			<result name="privError">/errorPrivPage.jsp</result>
			<result name="updateEmpPassword">/jsp/phone/xxxx.jsp</result>
			<result name="loginPage" type="redirect">/jsp/phone/login/trunToLogin.jsp</result>
		</global-results>
		
		<global-exception-mappings>
			<exception-mapping result="error" exception="java.lang.Exception">/errorPage.jsp
			</exception-mapping>
		</global-exception-mappings>
	</package>
	
	
<package name="managerPlatform" extends="basePriv" namespace="/">
	<action name="*_*" class="{1}Action" method="{2}">
		<result name="success">${successPath}</result>
		<result name="error">${errorPath}</result>
		<result name="input">${inputPath}</result>
		<result name="redirectAction" type="redirectAction">${redirectActionPath}</result>
		<result name="doChain" type="chain">${chainPath}</result>
		<result name="redirect" type="redirect">${redirectPath}</result>
		<result name="print" type="stream">
			<param name="contentType">application/vnd.ms-excel</param>
			<param name="inputName">inputStream</param>
			<param name="contentDisposition">filename="${printFileName}"</param>
			<param name="bufferSize">1024</param>
		</result>
	</action>
</package>
		
</struts>

 2.Action这么写

/**
 * 权限信息控制
 * @author  ken
 * @date 2011-9-13 下午15:00:46
 */
@Scope("prototype")
@Controller("PrivAction")
public class PrivAction extends BaseAction{

	private static final long serialVersionUID = 1L;
	static final Logger log = Logger.getLogger(PrivAction.class);
	
	@Autowired
	private PrivService privService;
	
	/* 权限模型 */
	private TEmployeePriv employeePriv;
	
	/**
	 * 权限查询
	 * @return
	 */
	public String queryPriv(){
		if(employeePriv==null){
			employeePriv = new TEmployeePriv();
			successPath = "/jsp/phone/priv/priv/privList.jsp";
			return SUCCESS;
		}
		try {
			entitys = this.privService.queryAllPriv(employeePriv);
		} catch (Exception e) {
			log.error("",e);
		}
		
		successPath = "/jsp/phone/priv/priv/privList.jsp?flag=true";
		return SUCCESS;
	}
}

 3.struts2拦截器

 /**
  * 权限拦截器Interceptor
 * @author mengxianjun
 * @date 2011-4-8 下午03:07:24
 *
 */

@SuppressWarnings("serial")
@Component( "PrivInterceptor" )
@Scope("prototype")
public class PrivInterceptor extends MethodFilterInterceptor{
	
	@Resource(name = "EmployeeService")
	private EmployeeService empSafeService;//工号安全Service
	
	@Resource(name="EmployeeRoleService")
	private EmployeeRoleService empRoleService;
	
	/* (non-Javadoc)
	 * @see com.opensymphony.xwork2.interceptor.MethodFilterInterceptor#doIntercept(com.opensymphony.xwork2.ActionInvocation)
	 * @author mengxianjun
	 * @date 2011-4-8 下午03:07:24
	 */
	
	@SuppressWarnings("unchecked")
	@Override
	protected String doIntercept(ActionInvocation invocation) throws Exception {

		System.out.println("============"+invocation.getInvocationContext().getName());
		System.out.println("============"+invocation.getInvocationContext().getLocale());
		System.out.println("============"+invocation.getInvocationContext().getParameters());
		
		
		System.out.println("执行到拦截器里。。。。");
		
		ActionContext act = invocation.getInvocationContext();
		
		//获得session
		Map session = invocation.getInvocationContext().getSession();
		
		TEmployeeInfo sessionInfo = (TEmployeeInfo) session.get("user");
		
		String employee_id="";
		
		/**
		 * 一、是否登录
		 */
		try
		{
			employee_id = sessionInfo.getEmployeeId();
		}
		catch( NullPointerException e )
		{
			act.put("message", "Session过期,请重新登录!");
			return "loginPage";
		}
		
/*=========================================================单点登录判断============================================*/
		HashMap<String, String> map = (HashMap<String, String>)  ServletActionContext.getServletContext().getAttribute("userList");
		String sessionID_User = map.get( employee_id ); //登录用户session的ID
		String sessionID_Now = ServletActionContext.getRequest().getSession().getId(); //当前session的ID
		
		if( ! sessionID_User.trim().equals(sessionID_Now) )
		{
			act.put("message", "此账号已登录!");
			return "privError";
		}
/*=========================================================单点登录判断============================================*/
		
		/**
		 * 二、登录成功后,根据URL进行权限判断
		 */
		if( !"".equals(employee_id.trim()) && null!=employee_id )
		{
			/**
			 * 2.1判断工号登录后,业务密码是否为123456,是跳转到商户安全设置,修改业务密码
			 */
			/*TEmployeeSafe empSafe = empSafeService.queryEmployeSafe(employee_id);
			if( null!=empSafe )
			{
				String MD5password = KeyedDigestMD5.getKeyedDigest("123456","").toUpperCase();//获得123456的MD5值
				String employeePass = empSafe.getEmployeePass();//获得登录密码
				String employeePass2 = empSafe.getEmployeePass2();//获得工号业务密码
				if( MD5password.equals(employeePass) || MD5password.equals(employeePass2) )
				{
					act.put("message", "欢迎使用本系统,您的登录密码、业务密码过于简单,请修改!");
					return "updateEmpPassword";
				}
			}*/
			
			
			/**
			 * 2.2截取请求URL
			 */
			HttpServletRequest request = ServletActionContext.getRequest();
			
			String currentURL = request.getRequestURI();
			String targetURL = "";
			
			if( -1 != currentURL.indexOf("?") )//普通<form>标签是?分隔传来的参数
			{
				String paramURL = currentURL.substring(currentURL.indexOf("?",0), currentURL.length());//参数URL
				
				int targetLength = currentURL.length() - paramURL.length();//去掉请求参数Length
				
				targetURL = currentURL.substring(currentURL.indexOf("/",1), targetLength);
				System.out.println("去掉请求参数路径URL:"+targetURL);
			}
			else if( -1 != currentURL.indexOf(";") )//struts2标签<s:form>标签是;分隔传来的参数
			{
				String paramURL = currentURL.substring(currentURL.indexOf(";",0), currentURL.length());//参数URL
				
				int targetLength = currentURL.length() - paramURL.length();//去掉请求参数Length
				
				targetURL = currentURL.substring(currentURL.indexOf("/",1), targetLength);
				System.out.println("去掉请求参数路径URL:"+targetURL);
			}
			else
			{
				targetURL = currentURL.substring(currentURL.indexOf("/",1), currentURL.length());
				System.out.println("请求路径URL:"+targetURL);
			}
			
			
			/**
			 * 2.3必须保证当前用户:1.工号必须开启2.角色已分配  3.角色已启用   4.角色有权限集合
			 */
			if("12".equals(sessionInfo.getState()))
			{
				act.put("message", "工号已锁定!");
				return "privError";
			}
			else if("15".equals(sessionInfo.getState()))
			{
				act.put("message", "工号已注销!");
				return "privError";
			}
			else if( sessionInfo.getRoleState()==null || "".equals(sessionInfo.getRoleState()) )
			{
				act.put("message", "未分配角色!");
				return "privError";
			}
			else if( !"10".equals(sessionInfo.getRoleState()) )
			{
				act.put("message", "该角色未启用!");
				return "privError";
			}
			else
			{
				try
				{
					/*1.得到中间表TRolePriv集合*/
					TRolePriv rp = new TRolePriv();
					rp.setRoleNum(sessionInfo.getRoleNum());
					List<TRolePriv> rolePrivList = empRoleService.queryRolePriv(rp);
					
					/*2.根据中间表TRolePriv,生成TEmployeePriv集合*/
					List<TEmployeePriv> privList = new ArrayList<TEmployeePriv>();
					for( TRolePriv trp : rolePrivList )
					{
						TEmployeePriv myPriv = empRoleService.queryPrivById(trp.getPrivNum());
						if(myPriv!=null&&myPriv.getPrivUrl()!=null&&!"".equals(myPriv.getPrivUrl())){
							privList.add(myPriv);//去掉一级菜单添加进privList,privUrl为空是一级菜单
						}
					}
					
					/*3.权限privUrl与targetURL比较*/
					if( privList.size()>0 )
					{
						int privState = 0;
						
						for( TEmployeePriv p : privList )
						{
							/**
							 * 对比去掉请求参数后的URL是否一致,即/Login_login
							 */
							String privUrl = p.getPrivUrl();//TEmployeePriv中privUrl,可能带参数,可能不带参数
							
							if(-1!=privUrl.indexOf("?",0)){
								String paramPrivURL = privUrl.substring(privUrl.indexOf("?",0), privUrl.length());//参数URL
								int targetPrivLength = privUrl.length() - paramPrivURL.length();//去掉请求参数Length
								privUrl = privUrl.substring(privUrl.indexOf("/",0), targetPrivLength);//TEmployeePriv中privUrl去掉参数
							}
							
							if( privUrl.equals(targetURL) )
							{
								privState = 1;
							}
						}
						if( 1 == privState )
						{
							return invocation.invoke();
						}
						else
						{
							System.out.println("-------得到Priv权限集合,但是无访问权限---------");
							act.put("message", "您没有权限  , 拒绝访问!");
							return "privError";
						}
					}
					else
					{
						act.put("message", "您没有相应权限 , 拒绝访问!");
						return "privError";
					}
				}
				catch( NullPointerException e )
				{
					act.put("message", "您没有权限 , 拒绝访问!");
					return "privError";
				}
			}
		}
		else
		{
			act.put("message", "Session过期,请重新登录!");
			return "loginPage";
		}
	}
}

 输出:

16:05:35,813 INFO  [STDOUT] ============Priv_queryPriv
16:05:35,813 INFO  [STDOUT] ============zh_CN
16:05:35,813 INFO  [STDOUT] ============{}
16:05:35,813 INFO  [STDOUT] 执行到拦截器里。。。。
16:05:35,813 INFO  [STDOUT] 请求路径URL:/Priv_queryPriv

 

=========================================================================================================

 

struts2 拦截拦截器怎么样获得action 后面的参数 例如 login.action? user.user_name='aaaaa'
我想获得到action 后面的参数再做判断,请问怎么样获得呢

问题补充:
我想在拦截器里面得到传入的user.user_name

最佳答案

先在拦截器intercept()方法中获取parameters对象:
  Map paramMap = invocation.getInvocationContext().getParameters();
然后用parameters对象获取参数(是一个字符串数组):
 String[] names = (String[]) paramMap.get("user.user_name");
 String username=names[0];

 

 

 

 

分享到:
评论
4 楼 变脸小伙 2016-03-01  
今天也跟着学习了,用到了
3 楼 mszb00123 2013-10-04  
谢谢,帮了大忙了
2 楼 古卷书书 2013-08-03  
学习下。
1 楼 everytimeyou 2011-11-21  
select

相关推荐

    struts2拦截器解决请求乱码和输出乱码.txt

    struts2 拦截器 解决 请求乱码 和 输出乱码 java

    struts2 拦截器写法

    Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现.

    Struts拦截器及token拦截器防止重复提交例子源码

    Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的 拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器 三、定义Struts2拦截器。 ...

    Struts2拦截器实例.docx

    Struts2拦截器实例——登录校验,登录校验拦截器除了登录请求不被拦截,对用户的所有其他请求进行拦截。对没有登录的用户如果访问其他需要用户的页面进行页面跳转,从新跳转回登录页面。进行登录操作。

    struts2.0拦截器、crud例子与用法

    struts2.0描述了拦截器并有对应的例子,用struts实现crud 用法及例子,并介绍了struts2的action的流程 及请求过程

    Struts2之Action接收请求参数和拦截器详解

    主要介绍了Struts2之Action接收请求参数和拦截器详解,非常具有实用价值,需要的朋友可以参考下

    Java Struts 实现拦截器

    Struts2的处理流程: • 客户端产生一个HttpServletRequest的请求,该请求被提交到一系列的标准过滤器(Filter)组建链中(如ActionContextCleanUp:它主要是清理当前线程的ActionContext、Dispatcher,...

    struts2自定义拦截器配置心得

    strut2 配置自定义拦截器 包括struts2.xml 和 action对应的xml 以及拦截器 可能有点简单 但是基本配置都有

    struts2学习笔记十(第10讲.Struts2的核心 拦截器)

    NULL 博文链接:https://zhaolianyang.iteye.com/blog/870600

    Struts2(4)拦截器与验证框架

    在struts2框架中主配置文件struts-defalut.xml 文件中定义了大量的拦截器和拦截器栈。通过 default-interceptor-ref元素定义了 当前应用的默认拦截器栈,对用户的每次请求都需要调用拦截器栈中的每个拦截器来拦截...

    ajax请求拦截器

    struts2在struts2.xml里配置拦截器可以过滤到指定的url的请求,但是对于ajax的请求确是过滤不了,比如说sesion超时或某些页面有权限控制的,通过ajax的请求时系统会报错最近在解决此类问题时碰上了找了不少资料,...

    struts2+spring2+ibates

    3、struts.xml中命名空间和拦截器的使用。 4、sqlmapconfig.xml中传入参数和result的设置,只需要将得到的值result映射到有此属性的类对象. 5、JSP/Servlet中获得当前应用的相对路径和绝对路径 JSP中获得当前应用的...

    struts2建立流程

    Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,...

    struts解决拦截百度编辑器问题

    struts解决拦截百度编辑器问题,自己写拦截器

    structs2拦截器实例计算action执行的时间

    structs2拦截器实例计算action执行的时间,涉及拦截器,structs.xml的配置等等。。

    Struts2 in action中文版

    4.3 研究内建的Struts 2拦截器 67 4.3.1 工具拦截器 67 4.3.2 数据转移拦截器 67 4.3.3 工作流拦截器 69 4.3.4 其他拦截器 72 4.3.5 内建的拦截器栈 73 4.4 声明拦截器 74 4.4.1 声明独立的拦截器和拦截器栈 74 ...

    struts2JAR包

    Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,...

    struts2学习文档

    Struts2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,...

    struts2 详解文档

    自定义拦截器 对Action中所有方法进行输入校验 对Action指定方法进行校验 输入校验的流程 基于XML配置方式实现对action的所有方法进行校验 基于XML配置方式实现对指定action方法校验 配置国际化全局资源文件、...

    Struts拦截器实现拦截未登陆用户实例解析

    主要介绍了Struts拦截器实现拦截未登陆用户实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics