struts2 在拦截器进行注入(根据Action是否实现自定义接口)

例如:常常在Action中都需要获取当前登录的User,就需要获取Session,然后从Session获取当前登录的User,因为这些步骤都是重复操作,可以想办法在拦截器中进行实现,可以自定义一个接口,只要你的Action实现了这个接口,就在自定义拦截器中进行注入。即从拦截器中获取Session,然后设置进行注入。


简单的例子:

一个自定义接口,只要Action实现这个接口,就在拦截器中进行注入

package com.atguigu.surveypark.struts2;

import com.atguigu.surveypark.model.User;

/**
 * 用户关注
 */
public interface UserAware {
	public void setUser(User user);
}


一个自定义拦截器(登录拦截器):在拦截器中获取action的实例,如果实现上面的接口就进行注入。即调用接口的方法。
package com.atguigu.surveypark.struts2.interceptor;

import com.atguigu.surveypark.model.User;
import com.atguigu.surveypark.struts2.UserAware;
import com.atguigu.surveypark.struts2.action.BaseAction;
import com.atguigu.surveypark.struts2.action.LoginAction;
import com.atguigu.surveypark.struts2.action.RegAction;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

/**
 * 登陆拦截器
 */
public class LoginInterceptor implements Interceptor {

	private static final long serialVersionUID = 4230211839075439660L;

	public void destroy() {
	}

	public void init() {
	}

	@SuppressWarnings("rawtypes")
	public String intercept(ActionInvocation arg0) throws Exception {
		BaseAction action = (BaseAction) arg0.getAction();
		if(action instanceof LoginAction
				|| action instanceof RegAction){
			return arg0.invoke();
		}
		else{
			User user = (User) arg0.getInvocationContext().getSession().get("user");
			if(user == null){
				//去登陆
				return "login" ;
			}
			else{
				//放行
				if(action instanceof UserAware){
					//注入user给action
					((UserAware)action).setUser(user);
				}
				return arg0.invoke();
			}
		}
	}
}

Action:一个实现接口的Action

package com.atguigu.surveypark.struts2.action;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.atguigu.surveypark.model.Survey;
import com.atguigu.surveypark.model.User;
import com.atguigu.surveypark.service.SurveyService;
import com.atguigu.surveypark.struts2.UserAware;

/**
 * SurveyAction
 */
@Controller
@Scope("prototype")
public class SurveyAction extends BaseAction<Survey> implements UserAware{

	private static final long serialVersionUID = 2438909978838628762L;
	
	//注入SurveyService
	@Resource
	private SurveyService surveyService ;

	//调查集合
	private List<Survey> mySurveys ;

	//接受user对象
	private User user;
	
	public List<Survey> getMySurveys() {
		return mySurveys;
	}

	public void setMySurveys(List<Survey> mySurveys) {
		this.mySurveys = mySurveys;
	}

	/**
	 * 查询我的调查列表
	 */
	public String mySurveys(){
		this.mySurveys = surveyService.findMySurveys(user);
		return "mySurveyListPage" ;
	}
	
	/**
	 * 新建调查
	 */
	public String newSurvey(){
		this.model = surveyService.newSurvey(user);
		return "designSurveyPage" ;
	}

	//注入User对象
	public void setUser(User user) {
		this.user = user ;
	}
}

struts.xml:拦截器注册

<?xml version="1.0"?>
<!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.ui.theme" value="simple" />
	<!-- 开发模式 -->
	<constant name="struts.devMode" value="true" />
	
	<package name="surveyparkPkg" extends="struts-default" namespace="/">
		<interceptors>
			<!-- 注册登陆拦截器 -->
			<interceptor name="loginInterceptor" class="com.atguigu.surveypark.struts2.interceptor.LoginInterceptor" />
			<!-- 定义拦截器栈 -->
			<interceptor-stack name="surveyparkStack">
				<interceptor-ref name="loginInterceptor" />
				<interceptor-ref name="defaultStack" />
			</interceptor-stack>
		</interceptors>
		
		<!-- 定义默认栈 -->
		<default-interceptor-ref name="surveyparkStack" />
		
		<!-- 定义全局结果 -->
		<global-results>
			<result name="login">/index.jsp</result>
		</global-results>
		
		<!-- regAction -->
		<action name="RegAction_*" class="regAction" method="{1}">
			<result name="regPage">/reg.jsp</result>
			<result name="input">/reg.jsp</result>
			<result name="success">/index.jsp</result>
		</action>
		<!-- loginAction -->
		<action name="LoginAction_*" class="loginAction" method="{1}">
			<result name="loginPage">/index.jsp</result>
			<result name="input">/index.jsp</result>
			<result name="success">/index.jsp</result>
		</action>
		
		<!-- SurveyAction -->
		<action name="SurveyAction_*" class="surveyAction" method="{1}">
			<result name="mySurveyListPage">/mySurveyList.jsp</result>
			<result name="designSurveyPage">/designSurvey.jsp</result>
		</action>
	</package>
</struts>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Struts2 ,可以使用拦截器实现权限控制。具体来说,可以编写一个自定义拦截器,然后在 struts.xml 配置文件将其配置为需要进行权限控制的 Action拦截器。以下是一个简单的权限拦截器示例: ```java public class AuthInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception { // 获取当前用户 User user = (User) ActionContext.getContext().getSession().get("user"); // 判断用户是否拥有权限 if (user != null && user.hasPermission(invocation.getInvocationContext().getName())) { // 如果有权限,则继续执行 Action return invocation.invoke(); } else { // 如果没有权限,则跳转到错误页面 return "error"; } } } ``` 在上述代码,我们首先获取了当前用户,然后判断用户是否拥有执行当前 Action 的权限。如果有权限,则继续执行 Action;否则,跳转到错误页面。 接下来,在 struts.xml 配置文件,我们可以将该拦截器配置为需要进行权限控制的 Action拦截器,如下所示: ```xml <action name="myAction" class="com.example.MyAction"> <interceptor-ref name="authInterceptor"/> <result name="success">/myAction.jsp</result> <result name="error">/error.jsp</result> </action> <interceptor-stack name="authStack"> <interceptor-ref name="authInterceptor"/> <interceptor-ref name="defaultStack"/> </interceptor-stack> <interceptors> <interceptor name="authInterceptor" class="com.example.AuthInterceptor"/> </interceptors> ``` 在上述代码,我们首先定义了一个名为 authStack 的拦截器栈,该拦截器栈包含了 authInterceptor 和 defaultStack 两个拦截器。然后,我们将 myAction Action 配置为使用 authStack 拦截器栈。最后,我们定义了一个名为 authInterceptor 的拦截器,并将其添加到了 interceptors 。 这样一来,当用户访问 myAction Action 时,就会先执行 authInterceptor 拦截器进行权限控制,然后再执行 defaultStack 拦截器的其它拦截器。如果 authInterceptor 拦截器返回了 error,则会跳转到 error.jsp 页面;否则,会跳转到 myAction.jsp 页面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值