gpt4 book ai didi

java - struts2 应用程序中的 session

转载 作者:搜寻专家 更新时间:2023-10-30 21:36:15 25 4
gpt4 key购买 nike

我创建了一个 Web 应用程序,我需要在其中维护 session 如果存在用户 session ,然后并且只有在那时它才会允许用户查看 jsp。

我以前使用过 jsp servlet,但我是 struts2 的新手。

我在这里在我的操作类中设置用户名:

修改后的代码

private HttpSession session;

public void setSession(HttpSession session) {
// TODO Auto-generated method stub0
this.session = session;
}

public HttpSession getSession() {
return session;
}

public String getLoginStatus(){
session = request.getSession();
session.setAttribute("userName", loginBean.getUsername());
return SUCCESS;
}

现在,当我在一个操作后被重定向到下一页时,它会显示一次 session 值。之后,在每一页上,我都在 session 中找到空值。

<%
String userName = (String)session.getAttribute("userName");
System.out.println(userName);

if(userName == null || userName.equals("") ){
response.sendRedirect("login.jsp");
}

%>

我在某处读到 Action 类 session 的范围仅限于一页 - 我该如何解决这个问题?

任何例子都会对我很有帮助。

最佳答案

您当前的代码存在一些问题。

  • 您应该使用拦截器强制用户登录,而不是尝试在 JSP 中强制执行。 JSP应该只做展示,不做流量控制。
  • 您应该避免在 JSP 中使用 scriptlet(代码块)。这在很久以前就已被弃用,并且被广泛认为是 MVC 应用程序中非常糟糕的做法。
  • 您可以直接访问 JSP 中的 session 值。您不需要在操作中实现 SessionAware 接口(interface),除非您需要访问操作本身内部的 session 。
  • 您应该将用户重定向到登录操作,而不是直接转到 JSP 页面,否则您将绕过 Struts2 框架并失去使用该框架的好处。

登录示例

下面是使用 Struts2 框架创建基本登录系统的一些示例代码。

需要登录

这部分是可选的,但一般来说,并非 Web 应用程序中的所有页面都需要用户登录。因此,让我们创建一个名为 LoginRequired 的接口(interface)。如果用户尚未登录,则实现此标记接口(interface)的任何操作都将重定向到登录页面。

注意:如果愿意,您可以改用注释,但在本例中我将使用接口(interface)。

public interface LoginRequired {}

拦截器

拦截器将强制用户登录以执行任何实现 LoginRequired 接口(interface)的请求操作。

public class LoginInterceptor extends AbstractInterceptor {
@Override
public String intercept(final ActionInvocation invocation) throws Exception {
Map<String, Object> session = ActionContext.getContext().getSession();

// sb: feel free to change this to some other type of an object which
// represents that the user is logged in. for this example, I am using
// an integer which would probably represent a primary key that I would
// look the user up by with Hibernate or some other mechanism.
Integer userId = (Integer) session.get("userId");

// sb: if the user is already signed-in, then let the request through.
if (userId != null) {
return invocation.invoke();
}

Object action = invocation.getAction();

// sb: if the action doesn't require sign-in, then let it through.
if (!(action instanceof LoginRequired)) {
return invocation.invoke();
}

// sb: if this request does require login and the current action is
// not the login action, then redirect the user
if (!(action instanceof LoginAction)) {
return "loginRedirect";
}

// sb: they either requested the login page or are submitting their
// login now, let it through
return invocation.invoke();
}
}

您还需要一个显示和处理登录页面的 LoginAction 和一个使 session 无效或清除 session 的 LogoutAction

配置

您需要将拦截器添加到堆栈中,并为“loginRedirect”创建一个全局结果映射。

<interceptors>
<interceptor name="login" class="your.package.LoginInterceptor"/>

<!-- sb: you need to configure all of your interceptors here. i'm only
listing the one we created for this example. -->
<interceptor-stack name="yourStack">
...
<interceptor-ref name="login"/>
...
</interceptor-stack>
</interceptors>

<global-results>
<!-- sb: make this the path to your login action.
this could also be a redirectAction type. -->
<result name="loginRedirect" type="redirect">/login</url>
</global-results>

关于java - struts2 应用程序中的 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5509606/

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