2012-06-30 1 views
0

Я вызываю этот сервлет-сервлет сервлетов каждый раз, когда вызывается файл (изображения и xhtmls) из моей папки «com.shadibandhan.Restricted».Ограничение JSF ServletFilter на страницах с ограниченным доступом при регистрации в

Я использую JSF, поэтому есть также Faces Servlet.

Это мой web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 
    <context-param> 
     <param-name>javax.faces.PROJECT_STAGE</param-name> 
     <param-value>Production</param-value> 
    </context-param> 
    <servlet> 
     <servlet-name>Faces Servlet</servlet-name> 
     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet> 
     <servlet-name>SbServlet</servlet-name> 
     <servlet-class>com.shadibandhan.ControllerLayer.SbServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet>  
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>/faces/*</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>SbServlet</servlet-name> 
     <url-pattern>/SbServlet</url-pattern> 
    </servlet-mapping> 
    <session-config> 
     <session-timeout> 
      30 
     </session-timeout> 
    </session-config> 
    <welcome-file-list> 
     <welcome-file>faces/index.xhtml</welcome-file> 
    </welcome-file-list> 
    <listener> 
     <listener-class>com.sun.faces.config.ConfigureListener</listener-class> 
    </listener> 
    <filter> 
     <filter-name>SessionFilter</filter-name> 
     <filter-class> 
      com.shadibandhan.ControllerLayer.SessionFilter 
     </filter-class> 
     <init-param> 
      <param-name>avoid-urls</param-name> 
      <param-value></param-value> 
     </init-param> 
    </filter> 

    <filter-mapping> 
     <filter-name>SessionFilter</filter-name> 
     <url-pattern>/faces/com.shadibandhan.Restricted/*</url-pattern> 
    </filter-mapping> 

    <filter> 
     <filter-name>PrimeFaces FileUpload Filter</filter-name> 
     <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class> 
     <init-param> 
      <param-name>thresholdSize</param-name> 
      <param-value>4096</param-value> <!-- 4 Mb --> 
     </init-param> 
    </filter> 
    <filter-mapping> 
     <filter-name>PrimeFaces FileUpload Filter</filter-name> 
     <servlet-name>Faces Servlet</servlet-name> 
    </filter-mapping> 
</web-app> 

И это мой сервлет фильтр по имени SessionFilter

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package com.shadibandhan.ControllerLayer; 

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.StringTokenizer; 
import javax.servlet.*; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 

/** 
* 
* @author MUDASSIR 
*/ 
public class SessionFilter implements Filter { 

    private ArrayList<String> urlList; 

    @Override 
    public void init(FilterConfig config) throws ServletException { 

     System.out.println("****************************************"); 
     System.out.println("***Session Filter Servlet initialized***"); 
     System.out.println("****************************************"); 
     String urls = config.getInitParameter("avoid-urls"); 
     System.out.println("The urls to avoid are = " + urls); 
     StringTokenizer token = new StringTokenizer(urls, ","); 

     urlList = new ArrayList<String>(); 

     while (token.hasMoreTokens()) { 
      urlList.add(token.nextToken()); 

     } 
    } 

    @Override 
    public void doFilter(ServletRequest req, ServletResponse res, 
      FilterChain chain) throws IOException, ServletException { 

     System.out.println("This is the doFilter method"); 

     HttpServletRequest request = (HttpServletRequest) req; 
     HttpServletResponse response = (HttpServletResponse) res; 
     String servletPath = request.getRequestURI(); 
     String contextPath = request.getContextPath(); 
     String remoteHost = request.getRemoteHost(); 
     String url = contextPath + servletPath; 
     System.out.println("-----------------> Servlet path is = " + servletPath); 
     System.out.println("-----------------> Context path is " + contextPath); 
     System.out.println("-----------------> URL is " + url); 
     System.out.println("-----------------> Remote Host is " + remoteHost); 
     boolean allowedRequest = false; 

     if (urlList.contains(servletPath)) { 
      allowedRequest = true; 
     } 

     if (!allowedRequest) { 
      HttpSession session = request.getSession(false); 
      if (null == session) { 

       System.out.println("Session is not present"); 
       response.sendRedirect(contextPath); 
       return; 

      } if (null != session) { 
       //String loggedIn = (String) session.getAttribute("sb_logged_in"); 
       System.out.println("Session is present"); 
       System.out.println("\nSession no. is = " + session.getId()); 

       if (session.getAttribute("logged-in") == "true") { 
        System.out.println("Session logged-in attribute is true, " + session.getAttribute("sessionUsername") + " is logged in."); 

        //ServletContext context = request.getServletContext(); 

        RequestDispatcher dispatcher = request.getRequestDispatcher(servletPath); 
        dispatcher.forward(request, response); 
       } else { 
        System.out.println("Session logged-in attribute is not true"); 
        response.sendRedirect(contextPath); 
        return; 
       } 
      } 
     } 

     chain.doFilter(req, res); 
    } 

    @Override 
    public void destroy() { 
    } 
} 

Раньше я request.getServletPath(). Теперь я использую request.getRequestURI(), чтобы получить путь, по которому пользователь хочет идти.

Но это не открытие страницы. Когда я пытаюсь получить доступ к ограниченным страницам, вызывается sessionfilter, он дает мне эту ошибку.

type Status report 

message /ShadiBandhan/ShadiBandhan/faces/com.shadibandhan.Restricted/home.xhtml 

description The requested resource (/ShadiBandhan/ShadiBandhan/faces/com.shadibandhan.Restricted/home.xhtml) is not available. 

Я задал вопрос раньше, но с другим заголовком, который сделал его неясным. JSF ServletFilter Restriction on index page when logged in

ПРИМЕЧАНИЕ: Добавляет контекст два раза. Я не знаю почему. Может кто-нибудь, пожалуйста, помогите мне. Спасибо

ответ

1

getRequestURI() уже включает контекстный путь, поэтому вы видите его дважды в конечном URL. Чтобы получить запрос URI без контекста пути, подстроки его следующим образом:

String contextRelativeURI = request.getRequestURI().substring(request.getContextPath().length()); 

Кстати, есть недостающий return заявление после того forward() вызова.

+0

Это сработало. Ужасно! –