struts2定义拦截器(Interceptor)检查用户是否已经登录

6 篇文章 0 订阅
5 篇文章 0 订阅

今天在项目中用到了检查用户功能,第一次接触花了不少时间,记录下来;

struts2定义拦截器(Interceptor)检查用户是否已经登录,此功能用来防止用户用不正当的方法访问正当的页面进行不正当的操作。

第一步:写代码,定义拦截器。

定义拦截器的方法有很多,这里就不全部列举了,我是直接继承MethodFilterInterceptor,

public class LoginInterceptor extends MethodFilterInterceptor {

	private static final long serialVersionUID = 1L;

	@Override
	protected String doIntercept(ActionInvocation ai) throws Exception {
		
		//定义ActionContext 用来获取session ,request, response对象
		//以下是在普通类中获取HttpServletRequest和HttpServletResponse的方法
		ActionContext actionContext = ActionContext.getContext();
		HttpServletRequest request = (HttpServletRequest) actionContext.get(ServletActionContext.HTTP_REQUEST) ;
		HttpServletResponse response = (HttpServletResponse) actionContext.get(ServletActionContext.HTTP_RESPONSE);
		String path = request.getContextPath();
		String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
		
		//获取session,检查用户是否已经登录,注意此处的return null;很主要,防止页面多次访问
		User user = (User)actionContext.getSession().get("login");
		if(user == null){
			//return "login" 如果没有用户登录则转向此页面,basePath用来防止路径出错
			response.sendRedirect(basePath+"index.jsp");
			return null;
		}
		return ai.invoke();
	}

}



第二步:配置struts.xml

 <package name="oa_default" extends="struts-default" >
<!-- 验证用户登录 -->
    		<interceptor name="Login" class="com.panlong.web.interceptor.LoginInterceptor"/>
            <interceptor-stack name="LoginInterceptor">
            	<interceptor-ref name="Login">
            		<!-- <param name="includeMethods">list,del</param> -->
            		<param name="excludeMethods">log</param>
            	</interceptor-ref>
            	<interceptor-ref name="SystemException" />
            </interceptor-stack>
    	</interceptors>
</package>

说明:<param name="excludeMethods">log</param>是用来排除某些方法使用此拦截器,比如登录的方法就要被拦截。因为在登录前是没有用户存在的。还有此拦截器不能设置成默认的拦截,这样会在登录进去后发生一系列错误。<interceptor-ref name="SystemException" /> 这里我用的默认的interceptor。

以下是在action中配置interceptor:

<!-- 人员  -->
	<package name="person" extends="oa_default" namespace="/person">
	
		<action name="index">
     		<result>/person/Person_list.jsp</result>
     	</action>
     	
		<action name="*_*" class="com.panlong.action.{1}Action" method="{2}">
			<interceptor-ref name="LoginInterceptor"></interceptor-ref>
			<result>/person/{1}_{2}.jsp</result>
     		<result name="input">/person/{1}_{2}.jsp</result>
		</action>
	</package>


好了,大功告成,美中不足的是这种interceptor不能用来拦截jsp页面,所以要想拦截jsp页面我们还要继续写filter,下一篇开始filter

java技术社区QQ群:48482847欢迎你的加入!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值