gpt4 book ai didi

java - Struts2拦截器 session 在验证登录页面时获取空值

转载 作者:行者123 更新时间:2023-11-30 03:51:05 24 4
gpt4 key购买 nike

我是 Struts2 的初学者,我正在尝试在我自己的 Web 项目上实现此场景:

  • 当用户访问登录页面时,服务器将通过拦截器访问 session 来验证他/她是否以“admin”/“user”身份登录,如果用户在 session 中没有权限数据(为空),则他们将被拒绝。将被传递到登录页面。
  • 如果用户以“admin”身份登录,用户将被重定向到“admin”页面。
  • 如果用户以“用户”身份登录,用户将被重定向到“用户”页面。

我正在尝试这些代码,如果我不使用拦截器,我可以访问 session ,但是如果我使用拦截器,我得到的是, session 仍然是null并给出错误500而是使用 NPE。我不知道这有什么问题。

感谢所有帮助我的人。

struts.xml

<struts>
<constant name="struts.action.extension" value=","/>
<constant name="struts.custom.i18n.resources" value="global" />
<constant name="struts.devMode" value="true" />
<!-- Configuration for the default package. -->
<include file="strutsconf/struts-user.xml"/>

</struts>

struts-pageauth.xml

<struts>
<package name="struts-pageauth" namespace="/" extends="struts-default">
<interceptors>

<interceptor name="loginpageauth" class="control.intercept.UserAuthenticationLogin"/>

<interceptor-stack name="loginauth">
<interceptor-ref name="createSession"/>
<interceptor-ref name="loginpageauth"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>

</interceptors>
</package>
</struts>

strusts-user.xml

<struts>
<constant name="struts.custom.i18n.resources" value="prop-user" />

<include file="strutsconf/struts-pageauth.xml"/>

<package name="struts-user" namespace="/" extends="struts-default, struts-pageauth">

<action name="login" method="login" class="control.action.Login">

<interceptor-ref name="loginauth"/>
<result name="admin">/main/admin/Admin.jsp</result>
<result name="user">/main/user/User.jsp</result>
<result name="error">/Login.jsp</result>
</action>

<action name="logout" method="logout" class="control.action.Login">
<result name="success">/Login.jsp</result>
<result name="error">/Login.jsp</result>
</action>

</package>
</struts>

UserAuthenticationLogin.java

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package control.intercept;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.interceptor.Interceptor;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;

public class UserAuthenticationLogin extends ActionSupport implements SessionAware, Interceptor {

public void setSession(Map<String, Object> map) {
this.sessionMap = map;
}

public void destroy() {
System.out.println("UserAuthentication Interceptor destroy() called");
}

public void init() {
System.out.println("UserAuthentication Interceptor init() called");
}

public String intercept(ActionInvocation ai) throws Exception {
System.out.println("=========================DEBUG========================");
System.out.println("UserAuthentication Interceptor intercept() called");
System.out.println(getText("auth.privilage")); // I can access this properties
System.out.println(this.sessionMap); // It gets NULL ??
// System.out.println(this.sessionMap.get(getText("auth.privilage")));
if(this.sessionMap.get(getText("auth.privilage"))==null) {
return ai.invoke();
}
else if(this.sessionMap.get(getText("auth.privilage")).equals("admin")) {
return "admin";
}
else if(this.sessionMap.get(getText("auth.privilage")).equals("user")) {
return "user";
}
else {
return "login";
}
}

private String id;
private String password;
private String admin;
private Map<String, Object> sessionMap;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String getAdmin() {
return admin;
}

public void setAdmin(String admin) {
this.admin = admin;
}

public Map<String, Object> getSessionMap() {
return sessionMap;
}

public void setSessionMap(Map<String, Object> sessionMap) {
this.sessionMap = sessionMap;
}
}

Login.java

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package control.action;

import com.opensymphony.xwork2.ActionSupport;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;

public class Login extends ActionSupport implements SessionAware {

public void setSession(Map<String, Object> map) {
this.sessionMap = map;
}

public String login() throws Exception {
if(id.equals("admin") && password.equals("admin")) {
this.sessionMap.put("id", "admin");
this.sessionMap.put("priv", "admin");
return "admin";
}
if(id.equals("user") && password.equals("user")) {
this.sessionMap.put("id", "user");
this.sessionMap.put("priv", "user");
return "user";
}
else {
setErr_msg(super.getText("error.login"));
return super.ERROR;
}
}

public String logout() throws Exception {
this.sessionMap.remove("id");
this.sessionMap.remove("priv");
return super.SUCCESS;
}

private String id;
private String password;
private String err_msg;
private String admin;
private Map<String, Object> sessionMap;

public Map<String, Object> getSessionMap() {
return sessionMap;
}

public void setSessionMap(Map<String, Object> sessionMap) {
this.sessionMap = sessionMap;
}

public String getAdmin() {
return admin;
}

public void setAdmin(String admin) {
this.admin = admin;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String getErr_msg() {
return err_msg;
}

public void setErr_msg(String err_msg) {
this.err_msg = err_msg;
}

}

最佳答案

sessionMap由ServletConfigInterceptor注入(inject)在实现 SessionAware 接口(interface)的操作中,而不是在拦截器中。

在拦截器中获取 session 映射的正确方法是:

Map<String, Object> session = ActionContext.getContext().getSession();

注意:将操作和拦截器混在一起时要小心:看到拦截器实现 ActionSupport 很奇怪...这不是您的代码问题,因为您使用的是声明性 xml 配置,但约定插件会扫描扩展 ActionSupport 的类的包(幸运的是,您有一个名称不匹配的包),并将其检测为 Action,使其成为 ThreadLocal,这不是拦截器的本意。那么你必须记住在将来升级你的代码时要小心,以避免出现意外的结果。

关于java - Struts2拦截器 session 在验证登录页面时获取空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24443842/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com