1

我正在使用 Struts 2 创建一个 Web 应用程序。我有一个登录页面。当用户在输入用户名和密码后单击登录按钮时,将检查凭据,如果发现凭据正确,则创建会话并设置其属性并将控制重定向到 WELCOME JSP。

现在在welcome.jsp打开之前,我想检查一下是否设置了会话属性。如何在 Struts 2 中做到这一点?

谁能让我清楚拦截器的概念。我读到我们创建拦截器来在调用动作之前或之后执行任何功能。我可以创建一个拦截器来检查会话是否已设置,每次在调用 WELCOME JSP 之前。

4

4 回答 4

5

你可以使用<s:if>标签来测试你的属性在 Session 中的存在。我假设你在你的动作类中设置值,这里是你如何在 jsp 页面中做到这一点

<s:if test="%{#session.logged_in ==true}">

我假设在这里我设置了一个标志,指示用户是否以类似的方式登录,您可以根据您的要求进行测试

对于拦截器,它们是 Struts2 开箱即用提供的一组实用程序类,使您的生活变得轻松。拦截器只是具有框架提供的某些功能的 java 类,其中一些是

  1. 上传文件
  2. i18n
  3. 参数
  4. 令牌等

这些拦截器是根据应用程序中配置的拦截器堆栈调用的,它们将在 2 个地方调用

  1. 当您向您的操作发送请求时
  2. 当请求处理完成并呈现视图时。

在第一种情况下,它们将在您的操作执行或您定义的自定义方法被调用之前被调用,拦截器负责向您的操作类提供所需的数据,拦截器在您的操作调用之前完成的一些工作是

  1. 文件上传
  2. 处理 i18n
  3. 将表单值传递给操作类中的受尊重字段
  4. 验证您的数据

struts2 提供了某些拦截器,您可以查看struts-defaultxml

您可以创建任意数量的拦截器并配置它们以根据您的要求执行,您需要扩展并在方法AbstractInterceptor内提供您的自定义逻辑intercept(ActionInvocation invocation)我建议您按照下面提到的链接获得更多概述

构建你自己的拦截器 Struts2 拦截器 编写拦截器

于 2013-09-04T09:16:39.567 回答
3

@rickgaurav 你的第一个问题。进行这样的登录操作

<action name="login_action" class="loginAction class">
            <result name="success" type="chain">welcomeAction</result>
            <result name="input">/index.jsp</result>
            <result name="error">/index.jsp</result>
        </action>

index.jsp 是您的登录页面

并在登录拦截器中首先制作一个会话映射,您的会话属性将存储在其中

Map<String, Object> sessionAttributes = invocation
            .getInvocationContext().getSession();

之后使用此条件进行检查

if (sessionAttributes == null
                || sessionAttributes.get("userName") == null
                || sessionAttributes.get("userName").equals("")) {

            return "login";
        }else{
if (!((String) sessionAttributes.get("userName")).equals(null)){
return invocation.invoke();
}else{
return "login";
}

对于您的第二个问题,假设您正在调用welcomeAction 以转到welcome.jsp 页面,因此您可以添加这样的操作

<action name="welcomeAction" class="class">
        <interceptor-ref name="logininterceptor"></interceptor-ref>




            <result name="login" type="chain">loginaction</result>
        <result name="success" >/welcome.jsp</result>

    </action>

希望这对你有用

于 2013-09-04T14:02:48.617 回答
2
  1. 在 Struts.xml 中这样写:

    <interceptors> <interceptor name="loginInterceptor" class="com.mtdc.interceptor.LoginInterceptor"></interceptor> <interceptor-stack name="loginStack"> <interceptor-ref name="loginInterceptor"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors>

2.现在在您要检查会话的操作之后放置:<interceptor-ref name="loginStack"></interceptor-ref>

3.我们在struts.xml中的LoginAction:`

<action name="login_action" class="com.action.LoginAction">

      <result name="success">/welcome.jsp</result>
      <result name="input">/login.jsp</result>
      <result name="error">/login.jsp</result> 

  </action>

`

4.现在为 make com,interceptor.LoginInterceptor 定义 LOGin 拦截器:

`

    public String intercept(ActionInvocation invocation) throws Exception {

            Map<String, Object> sessionAttributes = invocation
                    .getInvocationContext().getSession();
            if (sessionAttributes == null
                    || sessionAttributes.get("userName") == null
                    || sessionAttributes.get("userName").equals("")) {

                return "login";
            } else {

                if (!((String) sessionAttributes.get("userName")).equals(null)
                        || !((String) sessionAttributes.get("userName")).equals("")) {

                    return invocation.invoke();
                } else {

                    return "login";
                }
            }
        }

`

[5]。现在在您分配会话的地方创建登录操作类:

` 

    public String execute() {

        String result = LOGIN;
        UserLogin userlogin;
        try {
            userlogin = userlogindao.authenticateUser(signin_username, signin_password);
            if (userlogin != null && userlogin.getUsername() != null) {

            session.put("userID", userlogin.getUserId());
            session.put("userName", userlogin.getUsername());


            result = SUCCESS;
            } else {

            result = LOGIN;
            }
        } catch (Exception e) {
            result = LOGIN;


            e.printStackTrace();
        }
        return result;
        }

`

[6]。现在在您的登录页面上单击调用操作 LoginAction 的最后一步。

于 2013-09-04T14:13:49.677 回答
0

是的,您可以使用拦截器。创建一个 Action 类,它将像这样在会话中存储用户的 UserId / Username(在用户通过身份验证后)。

session.put("userID", userlogin.getUserId());

之后制作一个拦截器类。拦截器

public class LoginInterceptor implements **Interceptor** {  

public String intercept(ActionInvocation invocation) throws Exception {

使用获取会话属性

sessionAttributes.get("userId");

并检查它是否为空,如果为空则返回登录以将用户转发到登录页面,否则返回 invocation.invoke(); 继续操作。

并在 struts.xml 文件中配置包内的拦截器

<interceptors>
            <interceptor name="loginInterceptor" class=".....LoginInterceptor"></interceptor>
            <interceptor-stack name="loginStack">
                <interceptor-ref name="loginInterceptor"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
        </interceptors>

对于行动,你可以写

<action name="anything" class="anyclass" method="default">
            <interceptor-ref name="loginStack"></interceptor-ref>

    <result name="login">/index.jsp</result>

            <result name="success" type="redirect">success.jsp</result>

    </action>
于 2013-09-04T09:48:41.903 回答