我正在使用 Struts 2 创建一个 Web 应用程序。我有一个登录页面。当用户在输入用户名和密码后单击登录按钮时,将检查凭据,如果发现凭据正确,则创建会话并设置其属性并将控制重定向到 WELCOME JSP。
现在在welcome.jsp
打开之前,我想检查一下是否设置了会话属性。如何在 Struts 2 中做到这一点?
谁能让我清楚拦截器的概念。我读到我们创建拦截器来在调用动作之前或之后执行任何功能。我可以创建一个拦截器来检查会话是否已设置,每次在调用 WELCOME JSP 之前。
我正在使用 Struts 2 创建一个 Web 应用程序。我有一个登录页面。当用户在输入用户名和密码后单击登录按钮时,将检查凭据,如果发现凭据正确,则创建会话并设置其属性并将控制重定向到 WELCOME JSP。
现在在welcome.jsp
打开之前,我想检查一下是否设置了会话属性。如何在 Struts 2 中做到这一点?
谁能让我清楚拦截器的概念。我读到我们创建拦截器来在调用动作之前或之后执行任何功能。我可以创建一个拦截器来检查会话是否已设置,每次在调用 WELCOME JSP 之前。
你可以使用<s:if>
标签来测试你的属性在 Session 中的存在。我假设你在你的动作类中设置值,这里是你如何在 jsp 页面中做到这一点
<s:if test="%{#session.logged_in ==true}">
我假设在这里我设置了一个标志,指示用户是否以类似的方式登录,您可以根据您的要求进行测试
对于拦截器,它们是 Struts2 开箱即用提供的一组实用程序类,使您的生活变得轻松。拦截器只是具有框架提供的某些功能的 java 类,其中一些是
这些拦截器是根据应用程序中配置的拦截器堆栈调用的,它们将在 2 个地方调用
在第一种情况下,它们将在您的操作执行或您定义的自定义方法被调用之前被调用,拦截器负责向您的操作类提供所需的数据,拦截器在您的操作调用之前完成的一些工作是
struts2 提供了某些拦截器,您可以查看struts-defaultxml。
您可以创建任意数量的拦截器并配置它们以根据您的要求执行,您需要扩展并在方法AbstractInterceptor
内提供您的自定义逻辑intercept(ActionInvocation invocation)
我建议您按照下面提到的链接获得更多概述
@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>
希望这对你有用
在 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 的最后一步。
是的,您可以使用拦截器。创建一个 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>