为啥struts2的拦截器会导致session为空呢?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥struts2的拦截器会导致session为空呢?相关的知识,希望对你有一定的参考价值。
当实现接口sessionaware后,如果加入了拦截器,就会一直为空是怎么回事
添加自定义拦截器的几个步骤。
1:定义好类文件。
2:添加配置。
1)声明拦截器。
2)声明拦截器栈(引用自定义拦截器和默认拦截器栈)。
3)将自定义拦截器栈声明为默认拦截器栈。
你是不是2)步骤里,括号内的没有做到呢。
因为session的注入,是struts2是通过拦截器实现的。
下面是一个示例:
<interceptors><interceptor name="accessController" class="interceptor.AccessControllerInterceptor" />
<interceptor name="validatorWorkflow" class="interceptor.ValidatorWorkflowInterceptor" />
<interceptor name="exceptionHandler" class="interceptor.ExceptionHandlerInterceptor" />
<interceptor-stack name="myStack">
<interceptor-ref name="accessController" />
<interceptor-ref name="defaultStack" />
<interceptor-ref name="validatorWorkflow" />
<interceptor-ref name="exceptionHandler" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack" /> 参考技术A
使用ActionContext获得session会带来单元测试不好作,所以使用SessionAware可以用通过的Map对象来注入session,这样在单元测试的时候只需要创建一个Map就可以了。这是一种比较推荐的做法
LogionAction.java文件如下:
package com.xujun.webwork.action;
import com.opensymphony.xwork.Action;
import com.opensymphony.webwork.interceptor.SessionAware;
import java.util.Map;
public class LoginAction implements Action,SessionAware
private Map mySession;
public String execute() throws Exception
mySession.put("username", "xujunSessionAware");
return this.SUCCESS;
public void setSession(Map session)
this.mySession = session;
xwork.xml配置如下,注意interceptor-ref 名称的大小写:
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-1.0.dtd">
<xwork>
<include file="webwork-default.xml" />
<package name="default" extends="webwork-default">
<action name="login" class="com.xujun.webwork.action.LoginAction">
<result name="success" type="dispatcher">
<param name="location">/main.jsp</param>
</result>
<interceptor-ref name="completeStack"></interceptor-ref>
</action>
</package>
</xwork>
main.jsp文件如下:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib prefix="ww" uri="webwork"%>
<html>
<body>
<p align="center">Login Success!</p>
<p align="center">Welcome!
<ww:property value="#session['username']"/>
</p>
</body>
</html>本回答被提问者采纳
struts2+hibernate+spring项目实战用户登录校验(struts拦截器)
一、概述
项目中所有页面均放入WEB-INF,所有页面安全性得到了很大程度的提高。但是当用户登录后长时间没有操作时,会造成Session数据的过期,如果此时获取Session中的数据,必定会引发WEB引用的空指针异常,造成数据错误,程序崩溃。因此需要一种机制保障每次发送请求执行Action中的方法之前校验用户是否处于登录状态。
针对上述分析,可以选用两种实现方式。
AOP
AOP思想可以在任意方法执行前进行拦截,完成原始方法执行前的操作
Struts2拦截器
Struts2拦截器可以再Struts2的任意Action执行之前和之后,完成某些任务,其内部工作原理与AOP极其相似。
二、拦截器实现
2.1、拦截器实现类
package org.sihai.qualitycontrol.util.interceptor;
import org.sihai.qualitycontrol.auth.emp.vo.EmpModel;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class LoginInterceptor extends AbstractInterceptor{
public String intercept(ActionInvocation invocation) throws Exception {
//执行除了登录操作之前的所有操作做登录校验
//获取本次操作的信息
/*
System.out.println(invocation.getProxy().getAction());
System.out.println(invocation.getProxy().getActionName()); emp_login
System.out.println(invocation.getProxy().getMethod());
*/
String actionName = invocation.getProxy().getAction().getClass().getName();
String methodName = invocation.getProxy().getMethod();
String allName = actionName+"."+methodName;
if("org.sihai.qualitycontrol.auth.emp.web.EmpAction.login".equals(allName)){
return invocation.invoke();
}
//解决登录嵌套的问题
// System.out.println(invocation.getProxy().getActionName()+"---"+invocation.getProxy().getAction().getClass().getName());
if(invocation.getProxy().getActionName().equals("page_login")){
return invocation.invoke();
}
//获取当前登录人信息
EmpModel loginEm = (EmpModel) ActionContext.getContext().getSession().get(EmpModel.EMP_LOGIN_USER_OBJECT_NAME);
//如果当前没有登录,跳转到登录页面
if(loginEm == null){
//跳转到登录
return "noLogin";
}
//执行原始操作
return invocation.invoke();
}
}
这里需要判断三个问题:
1、如果是登录方法,放行。
2、解决登录嵌套的问题
3、获取当前登录人的信息,判断是否有权限
2.2、拦截器配置
<interceptors>
<interceptor name="loginInterceptor" class="org.sihai.qualitycontrol.util.interceptor.LoginInterceptor"/>
<interceptor-stack name="systemStack">
<interceptor-ref name="loginInterceptor"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="systemStack"/>
这样就可以拦截非法的用户了。
如果想获取更多源码或者视频教程,欢迎关注我的微信公众号
好好学java
,在公众号里,回复:java基础、html5、javaEE基础、struts2、spring、redis、luncene、oracle
等,将可获得以上的优质视频教程及源码。
以上是关于为啥struts2的拦截器会导致session为空呢?的主要内容,如果未能解决你的问题,请参考以下文章
servlet请求被struts2拦截器拦截,导致页面访问不到,