Pondremos en practica las restricciones a la url de la manera mas facil o sencilla posible pero eficiente. Suele pasar que en cualquier pagina o aplicacion debemos registranos y acceder a las demas paginas o datos pero si una aplicacion o sistema web no tiene restricciones cualquiera que este registrado o no puede acceder con simple facilidad y eso es algo inseguro y poco profesional asi que implementaremos una clase que haga las restricciones como sabran las lineas estan documentadas para su entendimiento no cabe recalcar que deben tener conocimientos previos de estos tipos de temas para su mejor entendimiento dicho esto agreamos la clase y quedara asi:
//definimos a que url se va aplicar la restriccion en este caso a todas las peticiones url
@WebFilter("*.xhtml")
//implementamos el filtro de servlet y agremos los metodos abstractos
public class SessionUrlFliters implements Filter{
//agregamos una variable filterConfig
FilterConfig fc;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//hacemos que la variable sea igual al filter config que recibe del index o home
fc = filterConfig;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
/*restriccion de urls*/
//agregamos el httpservletrequest haciendolo un casting e igualando al request que recibe como parametro de doFilter
HttpServletRequest req = (HttpServletRequest) request;
//agregamos el httpservletresponse haciendolo un casting e igualando al response que recibe como parametro de doFilter
HttpServletResponse res = (HttpServletResponse) response;
//sesion para recuperar las url que van llegando y hacer la comparacion
HttpSession session = req.getSession(true);
//variable para recibir la url de la peticion que sera igualado la variable req
String reqUrl = req.getRequestURL().toString();
//hacemos la condicional el cual modificaremos en el Bean y la variable donde esta el url es diferente a la consecuencia
if(session.getAttribute("userName") == null && ! reqUrl.contains("home.xhtml")){
//hacemos la redireccion hacia home.xhtml desde la raiz y concatenamos
res.sendRedirect(req.getContextPath()+"/faces/home.xhtml");
}else{
//permitimos la direccion
chain.doFilter(request, response);
}
}
@Override
public void destroy() {
//borramos el filter config
fc=null;
}
}
Y el managedBean se modificara y quedara asi:
@ManagedBean
@SessionScoped
public class ManagedBeanSesionLogin implements Serializable{
private String userName;
private String userPass;
private Login login;
private Session session;
private Transaction transaction;
public ManagedBeanSesionLogin() {
//daremos un tiempo para la sesion si pasa del tiempo establecido se cerrara y haciendo el casting
HttpSession timerSession = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
//tiempo de espera
timerSession.setMaxInactiveInterval(300);
}
public String beginSession(){
/*inicializamos para asegurarnos*/
session = null;
transaction = null;
try {
/*instanciamos los objetos*/
loginDAO daoLogin = new loginDAO();
//abrimos sesion de conexcion
session = HibernateUtil.getSessionFactory().openSession();
//creamos la transaccion y la comenzamos
transaction = session.beginTransaction();
//intanciamos el objeto
Login login = daoLogin.getByUserName(session, userName);
//valida si es que existe el usuario
if(login != null){
//valida que la contraseña sea la misma
if(login.getPass().equals(Encrypting.encrypting(userPass))){
//creamos una session de http para los filtros de url no pude implementarlo de otra manera
HttpSession httpS = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
//agregamos el atributo a la variable
httpS.setAttribute("userName", userName);
//si todo es valido manda a la pagina
return "/User/viewAll";
}
}
transaction.commit();//cerrar transaccion
userName = null;
userPass = null;
//mandar mensaje de error de datos
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error de Acceso", "Datos Incorecctos"));
//retornar
RequestContext.getCurrentInstance().execute("cleanForm('loginForm')");
return "/home";
} catch (Exception e) {
//verificamos sino hay ya una transaccion ya definida
if(transaction != null){
//si lo hay haremos que todo se revierta en la BD y que como estaba antes de utilizar este metodo
transaction.rollback();
}
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, "Error Fatal", "Contacte con su administrador "+e.getMessage()));
login = new Login();
return null;
}finally{
//verificamos sino hay ya una session ya definida
if(session != null){
//si lo hay cerramos la session
session.close();
}
}
}
public String closeSession() {
userName = null;
userPass = null;
//creamos una session de http para los filtros de url no pude implementarlo de otra manera
HttpSession httpS = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
//borramos las session almacenadas
httpS.invalidate();
return "/home";
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPass() {
return userPass;
}
public void setUserPass(String userPass) {
this.userPass = userPass;
}
}
Listo así nadie podrá redirigirse a otra pagina que no sea home siempre y cuando no haya inicialisado session