Поскольку внешность входит в систему основной с java server и primefaces

Добрый день я хотел бы попросить помощь относительно login aplicativo до сих пор у меня есть таблица пользователь с полями назвал и password, но quisera знание, как он делается в jsf с книжным магазином компонентов primefaces, я благодарен заранее за Вашу ценную помощь.

1
задан 13.04.2016, 19:22
1 ответ

Транскрипция контента этого blog:

Привет Люди,

мы увидим, как делать формуляр login и контроль доступа используя PrimeFaces. Мы не используем ни оснований глупцов, ни сложной логики, только говорится, чтобы пользователь не смог не соглашаться ни на какой ресурс, а он не logueado в системе.

Мы основываемся на предыдущем post "Первые шаги с PrimeFaces, Затмением и Томкат (Шаг за шагом)", уже я не введу между тем деталь как реализовывать некие задания, которые являются объясненными в предыдущем post.

Создавая вид:

Мы должны создавать файл в "WebContent", или же в root нашего приложения, так называемого "login.xhtml"

Контент - следующий:

<html xmlns="http://www.w3c.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.org/ui">
<h:head>
</h:head>
<h:body style="text-align:center">
  <p:growl id="mensajes" showDetail="true" life="2000" />
  <h:form>
    <p:panel header="Login" style="width:300px">
      <h:panelGrid columns="2" cellpadding="5">
        <h:outputLabel for="username" value="Usuario:" />
        <p:inputText value="#{loginBean.nombre}" id="username"
           required="true" label="username" />
        <h:outputLabel for="password" value="Clave:" />
        <p:password value="#{loginBean.clave}" id="password" required="true"
           label="password" />
        <f:facet name="footer">
          <p:commandButton id="loginButton" value="Login"
             actionListener="#{loginBean.login}" update=":mensajes"
             oncomplete="manejarLogin(xhr, status, args)" />
        </f:facet>
      </h:panelGrid>
    </p:panel>
  </h:form>
</h:body>
<script type="text/javascript">
  //<![CDATA[
  function manejarLogin(xhr, status, args) {
    if (!args.validationFailed && args.estaLogeado) {
      setTimeout(function() {
        window.location = args.view;
      }, 500);
    }
  }
//]]>
</script>
</html>

В браузере, этот код производит следующий вид:Login Давайте анализировать сейчас немного код:

<p:growl id="mensajes" showDetail="true" life="2000" />

Оно используется для того, чтобы являться возникающими сообщениями, мы произведем их с loginBean, например: Mensaje

<p:inputText value="#{loginBean.nombre}" id="username"
   required="true" label="username" />

Этот tag представляет поле, которое содержит имя пользователя, которое как только он был передан (submit) установит стоимость в bean, loginBean, стороны сервера посредством названный к методу setNombre () из-за признака назовите. Это обязательное поле, это, не может быть в мишени.

<p:password value="#{loginBean.clave}" id="password" required="true" 
   label="password" />

Этот предыдущий tag работает сходно с tag имени, но с ключом, кроме того поле не покажет того, что tipea.

В конце концов:

<p:commandButton id="loginButton" value="Login"
   actionListener="#{loginBean.login}" update=":mensajes"
   oncomplete="manejarLogin(xhr, status, args)" />

Это кнопка, которая посылает поля server (я назвал и фиксировал) и выполняет метод login () loginBean, как только он работает в упомянутый метод становится отвечающим современным требованиям компонент возникающих сообщений, чтобы показывать сообщения, которые накопились, кроме того выполняет рукописный шрифт клиент manejarLogin (xhr, статус, args). Самые важные линии метода:

if (!args.validationFailed && args.estaLogeado) {

Мы убеждаемся, что процесс утверждения не удался, и что пользователь был logueado. Если пользователь - logueado правильно, он работает:

window.location = args.view;

где args, это выбор параметров, которые мы получим от сервера, в этом случае он посылает нам параметр view с именем вида, который должен быть нагруженным. В это мы это делаем с отсрочкой для того, чтобы они смогли являться возникающими сообщениями благополучного прибытия.

Создавая компонент сервера

Уже мы увидели, как осуществляется эта операция, должны создавать класс java так называемый ar.com.magm.web.primefaces. LoginBean, который должен быть добавленным потом в faces-config.xml как bean сеанса, кода, который, чтобы это делать:

<managed-bean>
  <managed-bean-name>loginBean</managed-bean-name>
  <managed-bean-class>ar.com.magm.web.primefaces.LoginBean</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>
</managed-bean>

Чтобы мочь копировать предыдущий код, необходимо выбирать закладку "Source" редактора файла конфигурации внешности.

Код только что созданного класса - следующий:

package ar.com.magm.web.primefaces;

import java.io.Serializable;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpSession;
import org.primefaces.context.RequestContext;

public class LoginBean implements Serializable {
  private static final long serialVersionUID = -2152389656664659476L;
  private String nombre;
  private String clave;
  private boolean logeado = false;

  public boolean estaLogeado() {
    return logeado;
  }

  public String getNombre() {
    return nombre;
  }

  public void setNombre(String nombre) {
    this.nombre = nombre;
  }

  public String getClave() {
    return clave;
  }

  public void setClave(String clave) {
    this.clave = clave;
  }

  public void login(ActionEvent actionEvent) {
    RequestContext context = RequestContext.getCurrentInstance();
    FacesMessage msg = null;
    if (nombre != null && nombre.equals("admin") && clave != null
        && clave.equals("admin")) {
      logeado = true;
      msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Bienvenid@", nombre);
    } else {
      logeado = false;
      msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Login Error",
                             "Credenciales no válidas");
    }

    FacesContext.getCurrentInstance().addMessage(null, msg);
    context.addCallbackParam("estaLogeado", logeado);
    if (logeado)
      context.addCallbackParam("view", "gauge.xhtml");
  }

  public void logout() {
    HttpSession session = (HttpSession) FacesContext.getCurrentInstance() 
                                        .getExternalContext().getSession(false);
    session.invalidate();
    logeado = false;
  }
}

Кроме gettes и сеттеров для имени и ключа и getter, чтобы знать, - ли пользователь logueado, у нас есть еще два метода: login () и logout (), давайте анализировать login ().

if (имя! = null && nombre.equals ("admin") && ключ! = null && clave.equals ("admin")) { logeado = true; msg = new FacesMessage (FacesMessage. SEVERITY_INFO, "Bienvenid@", назовите);

Если имя пользователя и пароль правильны и кроме того обладают стоимостью "admin", мы считаем, что пользователь действительный и logueamos выполняя:

logeado = true;

Потом мы устанавливаем mansaje благополучного прибытия, о котором мы говорим раньше:

msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Bienvenid@", nombre);

Разъяснение: если какой-либо осведомляется, потому что единственный пользователь - "admin" и ключ - "admin", и обе стоимость - "hardcodeados" и не могут меняться, ответ состоит в том, что я упростил это задание, чтобы не делать более сложным пример, кроме того не оказывается очень сложным получать это от базы данных например.

Если пользователь не logueado:

 } else {
      logeado = false;
      msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Login Error",
                             "Credenciales no válidas");
    }

Просто мы это гарантируем устанавливая стоимость переменной logeado в фальшивом и устанавливая сообщение предупреждения пользователю.

В конце концов мы посылаем сообщение, которое мы установили раньше:

FacesContext.getCurrentInstance().addMessage(null, msg);

Мы добавляем параметр, который будет использован в рукописном шрифте клиента:

context.addCallbackParam("estaLogeado", logeado);

Если пользователь смог loguearse без недостатков, мы посылаем ему как параметр предстоящий вид.

if (logeado)
  context.addCallbackParam("view", "gauge.xhtml");

Метод logout (), который мы еще не использовали, реализует следующее:

Он получает сеанс пользователя:

HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
                                    .getExternalContext().getSession(false);

Инвалид:

session.invalidate();

и desloguea в пользователя:

logeado = false;

Добавляя выбор logout в "gauge.xhtml"

Мы издаем "gauge.xhtml" и добавляем следующий код немедленно после body:

<h:body>
  <p:commandLink id="logout" actionListener="#{loginBean.logout}"
      style="margin-right:20px;" oncomplete="logout(xhr, status, args)">
    <h:outputText value="logout" />
  </p:commandLink>

Добавят, что такое соединение как который видно в следующей фигуре: LoginStatus

Соединение выполнит метод loginBean.logout и однажды завершенный он выполнит рукописный шрифт клиента logout (....)

Рукописный шрифт клиента должен присоединяться между завершением tag body и завершением tag html, как останься:

</h:body>
<script type="text/javascript">
  //<![CDATA[
  function logout(xhr, status, args) {
    setTimeout(function() {
      window.location = 'login.xhtml';
    }, 500);
  }
//]]>
</script>
</html>

Поскольку возможно наблюдать только, мы делаем redirect в страницу login.

Контролируя доступ ко всем ресурсам

До сих пор мы создали необходимые компоненты, чтобы позволять пользователю представлять Ваши верительные грамоты, и что были подтверждены и хранились в сеансе, также позволяем пользователю заканчивать Ваш сеанс, но еще лишенная что-то очень важная, так как мы до сих пор должны верить в то, что все пользователи хорошие и проходят сначала по процессу login перед тем, как ходатайствовать о любом другом ресурсе. В конце концов, окончательно мы не можем доверять этому, должны создавать такой механизм, который, если пользователь или процесс требует ресурса без того, чтобы были санкционированы Ваши верительные грамоты, не мог бы соглашаться на того же самого. В это мы это делаем с использованием фильтра, который является компонентом, который работает до того, как манипулировали конечной просьбой в server и может "крутить" разгрузку нормального выполнения, если он необходим.

Создавая фильтр:

Чтобы создавать фильтр мы нажимаем Ctrl+N в виде "Прохект Эксплорер" и выбираем "Filter" "Веб" категории и нажимаем на кнопку "> Next"

Мы завершаем ее первый экран с:

Java package: ar.com.magm.web.filters Class ямс: LoginFilterCrear Filtro Presionamos "> Next"

Потом мы меняем унифицированный указатель ресурса Pattern из-за "/*" для того, чтобы этот фильтр работал перед любой просьбой.Filtro Creado и мы нажимаем на "Finish"

Код, у которого должен быть метод doFilter (.), находится далее и объяснен комментариями в том же коде:

public void doFilter(ServletRequest request, ServletResponse response,
  FilterChain chain) throws IOException, ServletException {
  HttpServletRequest req = (HttpServletRequest) request;
  HttpServletResponse res = (HttpServletResponse) response;

  // Obtengo el bean que representa el usuario desde el scope sesión
  LoginBean loginBean = (LoginBean) req.getSession().getAttribute("loginBean");

  //Proceso la URL que está requiriendo el cliente
  String urlStr = req.getRequestURL().toString().toLowerCase();
  boolean noProteger = noProteger(urlStr);
  System.out.println(urlStr + " - desprotegido=[" + noProteger + "]");

  //Si no requiere protección continúo normalmente.
  if (noProteger(urlStr)) {
    chain.doFilter(request, response);
    return;
  }

  //El usuario no está logueado
  if (loginBean == null || !loginBean.estaLogeado()) {
    res.sendRedirect(req.getContextPath() + "/login.xhtml");
    return;
  }

  //El recurso requiere protección, pero el usuario ya está logueado.
  chain.doFilter(request, response);
}

Я отделил логику исключения контроля ресурсов в очень простом методе, который находится далее и который также составляет часть фильтра, который не требует многого объяснения.

private boolean noProteger(String urlStr) {

/*
 * Este es un buen lugar para colocar y programar todos los patrones que
 * creamos convenientes para determinar cuales de los recursos no
 * requieren protección. Sin duda que habría que crear un mecanizmo tal
 * que se obtengan de un archivo de configuración o algo que no requiera
 * compilación.
 */
  if (urlStr.endsWith("login.xhtml"))
    return true;
  if (urlStr.indexOf("/javax.faces.resource/") != -1)
    return true;
  return false;
}

Этот фильтр завершает эту маленькую систему контроля доступа и logueo, я надеюсь, что он они полезный. Полный workspace этого post, предыдущего и будущего posts, что имели общее с темой, находится в github в следующем адресе: https://github.com/magm3333/workspace-pftuto

Ты можешь находить больше информации в официальном сайте Java:
Form-Based Authentication with в Хавасервер Фасес Application

-1
ответ дан 24.11.2019, 14:36
  • 1
    Ответы не должны основываться только на внешних ссылках. Ответы должны быть автомобилем, содержавший. –  13.04.2016, 23:00
  • 2
    Ты мог бы добавлять немного контента ссылки, так как, если в пользу какого-то мотива сайт прекращает функционировать, стоимость твоего ответа теряется. – jasilva 13.04.2016, 23:21