Использование сессий

Объект сессии в WEB-приложении имеет немаловажное значение. При использовании фреймворка Struts2 можно использовать сессию интерфейса ServletRequest, который расширяется интерфейсом HttpServletRequest. Метод getSession (boolean create) данного интерфейса возвращает объект типа HttpSession текущего сеанса клиента. Если параметр create равен true и объект HttpSession не существует, то создается новый объект HttpSession.

Интерфейс SessionAware

Несмотря на возможность использования сессии интерфейса HttpSession необходимо все же использовать объект сессии фреймворка. Для этого необходимо создать действие, которое наследует интерфейс SessionAware. Интерфейс SessionAware содержит метод setSession, который открывает нам доступ к сессии фреймворка. Параметром метода setSession является объект типа Map<String, Object>. Таким образом, определив в действии объект типа Map<String, Object>, мы можем связать его с сессией фреймворка. После этого, сессию можно использовать для обмена объектами между различными действиями.

Необходимо отметить, что перехватчик наследуют интерфейс SessionAware, получая доступ к объекту сессии. Такая структура фреймворка позволяет использовать перехватчики для проверки авторизации (наличия пользователя в сессии) при попытке "незванного гостя" попасть в закрытые области (страницы) приложения.

Пример использования SessionAware в Struts2 приложении

Модифицируем простейшее Struts2 приложение авторизации, рассмотренное на странице Действия actions. Для разработки будет использоваться среда Eclipse, а в качестве браузера - Internal Web Browser.

В приложении создадим действие LoginAction.java. Основная функция данного action будет заключаться в том, чтобы проверить заполнение текстовых полей страницы index.jsp. Если пользователь заполнит текстовые поля, то метод execute() разместит объект User в сессии и вернет строковое значение "success", если не заполнит - то "error". В зависимости от результата действия фреймворк будет открывать либо страницу success.jsp, либо error.jsp.

На странице success.jsp можно использовать сессию для получения доступа к объекту и отображения параметров его аккаунта. Вызов action-класса авторизации LoginAction будем выполнять на странице index.jsp.

На следующем скриншоте представлена структура проекта StrutsSession.

На странице дескриптор приложения web.xml не описывается. Листинг web.xml можно увидеть на странице Пример Struts2, где рассматривается вопрос кодировки передаваемых серверу сообщений.

Листинг action классa LoginAction.java

package example;

import java.util.Map;

import org.apache.struts2.interceptor.SessionAware;

public class LoginAction implements SessionAware
{
    private Map<String, Object> session; 
	
    private String userName = null;
    private String password = null;
    private String message  = null;
	  
    public LoginAction() {}

    @Override
    public void setSession(Map<String, Object> session)
    {
        this.session = session; 
    }
    public String execute()
    { 
        // Проверка заполнения полей
        if ((getUserName().length() > 0) && (getPassword().length() > 0)) {
            // Создание объекта User
            User user = new User();
            // Определение атрибутов объекта
            user.setLogin(getUserName());
            user.setPassword(getPassword());
            // Размещение объекта в сессиии
            session.put ("user", user);
            return "SUCCESS";
        } else {
            // Сообщение для объекта
            setMessage ("Не заполнено одно из обязательных полей");
            return "ERROR";
        }
    }  
    public String getMessage()
    { 
        return message;
    } 
    public void setMessage ( String message )
    { 
        this.message = message; 
    } 
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

Действие LoginAction переопределяет функцию execute. Как только будет обращение к этому действию Struts2 сразу же вызовет его метод execute, который проверит поля "userName" и "password", и, в зависимости от состояния, вернет либо "success", либо "error".

На странице проверки данных показано, как использовать метод validate() для проверки введенных данных пользователя.

Фреймворк вызывает метод setSession, в котором мы определяем нашу переменную session. Если поля "userName" и "password" будут заполнены, то метод создаст объект User и разместит его в сессии session. Структура объекта User приводится в следующем листинге.

Объект пользователя User.java

package example;

public class User
{
    private String login; 
    private String password; 
  
    public User(){}
    public String getLogin()
    { 
        return login; 
    } 
    public void setLogin (String login)
    { 
        this.login = login; 
    } 
    public String getPassword()
    { 
        return password; 
    } 
    public void setPassword (String password)
    { 
        this.password = password; 
    }
    @Override
    public String toString()
    {
    	return "User (login = " + login + ", password = " + password + ")";
    }
}

Листинг JSP-страницы index.jsp

На этой странице оператор должен ввести "Логин", "Пароль" и нажать кнопку Submit. По нажатию на кнопку серверу передается информация страницы (userName, password) и вызывается действие "login".

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>

<html>
  <head>
    <title>Страница авторизации</title>
  </head>
  <body>
    <s:form action="private/login" >
	    <s:textfield name="userName" label="Логин"/>
	    <s:password  name="password" label="Пароль"/>
        <s:submit />
    </s:form>
  </body>
</html>

В строке <%@ taglib uri="/struts-tags" prefix="s" %> подключаются теги Struts2, после чего обращение к объектам фреймворка производится через префикс "s". В теле страницы определено несколько тегов Struts2. В первом теге формы <s:form ... > определяется действие action="private/login", отвечающее за обработку данных. Далее в теле формы установлены текстовые поля "userName" и "password". При нажатии на кнопку <s:submit /> управление передается серверу и вызывается действие login.

Следует отметить, что действие располагается в "закрытой области" namespace (private).

Интерфейс страницы представлен на следующем скриншоте.

Файл конфигурации struts.xml

Подключение действия осуществляется в файле конфигурации struts.xml, в котором необходимо определить связь страницы index.jsp с действием "login".

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
         "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
      <package name="private" namespace="/private" extends="struts-default">
           <action name="login" class="example.LoginAction">
               <result name="SUCCESS">/private/success.jsp</result>
               <result name="ERROR">/error.jsp</result> 
           </action> 
      </package>
</struts>

В файле конфигурации определено, что действие "login" связано с классом example.LoginAction. В зависимости от результата (result) выполнения действия будет открыта либо страница private/success.jsp, либо error.jsp. В файле конфигурации мы определили, что действие login располагается в закрытой области (namespace) private.

Листинг страницы success.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="example.User" %%>
<% User user = (User) session.getAttribute("user"); %>


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <title>Страница приветствия</title>
  </head>
  <body>
    <h1>Struts2 приветствует Вас</h1>

    <b>Объект сессии </b> : <i><%= user.toString() %></i><br/>
  </body>
</html>

В случае успешного выполнения действия "private/login" сервер откроет страницу success.jsp, интерфейс которой представлен на следующем скриншоте.

Страница success.jsp использует только теги JSP для отображения объекта User. Изначально необходимо этот объект импортировать на страницу, после чего извлечь его из сессии.

<%@ page import="example.User" %>
<% User user = (User) session.getAttribute ("user"); %>

Листинг страницы error.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
   <head>
      <title>Страница ошибки/title>
   </head>
   <body>
      <h2>Ошибка авторизации</h2>
      <i><s:property value="message" /></i>
   </body>
</html>

Страница ошибки error.jsp выполняет только одну функцию - сообщает пользователю, что одно из полей осталось не заполнено.

Скачать примеры

Исходные коды рассмотренного примера можно скачать здесь (5.20 Мб).

  Рейтинг@Mail.ru