簡體   English   中英

使用JAXP解析簡單的XML文檔(JEE6)

[英]Parsing a simple XML document with JAXP(JEE6)

我想為我的網絡應用程序創建一個授權過濾器(以便能夠限制對某些頁面的訪問)。

我創建了一個簡單的.xml文件,其中包含允許每個用戶訪問的頁面:

  <access>
    <buyer>
        <page>buyoffer.xhtml</page>
        <page>faq.xhtml</page>
        <page>index.jsp</page>
        <page>login.xhtml</page>
        <page>main.xhtml</page>
        <page>registrationSucceded.xhtml</page>     
    </buyer>
    <seller>
        <page>sellerpanel.xhtml</page>
        <page>faq.xhtml</page>
        <page>index.jsp</page>
        <page>login.xhtml</page>
        <page>main.xhtml</page>
        <page>registrationSucceded.xhtml</page>     
    </seller>
    <administrator>
        <page>sellerpanel.xhtml</page>
        <page>faq.xhtml</page>
        <page>index.jsp</page>
        <page>login.xhtml</page>
        <page>main.xhtml</page>
        <page>registrationSucceded.xhtml</page>     
    </administrator>
</access>

然后我需要進行解析以提取頁面的值,以便能夠創建允許或重定向的條件(依賴)。 我只需要告訴某人如何從xml中提取這些頁面的值。 這就是我現在所做的:

public class RestrictPageFilter implements Filter {

    private FilterConfig fc;
    private DocumentBuilder builder;
    private Document document;

    public void init(FilterConfig filterConfig) throws ServletException {
        // The easiest way to initialize the filter
        fc = filterConfig;
        // Get the file that contains the allowed pages
        File f = new File("/allowedpages.xml");
        // Prepare the file parsing
        try {
            builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
            document = builder.parse(f);
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        HttpSession session = req.getSession(true);
        String pageRequested = req.getRequestURL().toString();

        // Get the value of the current logged user
        Role currentUser = (Role) session.getAttribute("userRole");
        if (currentUser != null) {
            if(currentUser.getType().equals("BUYER")) {
                //Loop BUYER Element of the .xml
                //if pageRequested.contains(value of the page at buyer element)             
                // chain.doFilter(request, response);
                // Else
                // Redirect the user to the main page
            }
            else if(currentUser.getType().equals("SELLER")) {
                //Same as above just for seller element
            }
            else if(currentUser.getType().equals("ADMINISTRATOR")) {
                //Same as above just for administrator element
            }           
        }
    }

    public void destroy() {
        // Not needed
    }
}

在doFilter方法內部的注釋中解釋了我需要做什么。 有人可以給我一個提示,我應該如何遍歷文件來查找每個用戶類型的頁面名稱? 我嘗試從互聯網上關注JAXP示例,但它們比我需要的更復雜。

更新 xml存儲在WEB-INF / classes中

而是使用JAXB。 JAXP是一個古老且非常詳細的API。 JAXB傾向於Javabeans,因此干凈且相對容易。 首先創建一個Javabean,它使用javax.xml.bind注釋將1:1映射到XML文件。

@XmlRootElement
public class Access {

    @XmlElement
    private User buyer;

    @XmlElement
    private User seller;

    @XmlElement
    private User administrator;

    public User getBuyer() {
        return buyer;
    }

    public User getSeller() {
        return seller;
    }

    public User getAdministrator() {
        return administrator;
    }

    public static class User {

        @XmlElement(name="page")
        private List<String> pages;

        public List<String> getPages() {
            return pages;
        }

    }

}

然后執行以下部分來映射它(假設allowedpages.xml放在類路徑的根目錄中)。

InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream("allowedpages.xml");
Access access = (Access) JAXBContext.newInstance(Access.class).createUnmarshaller().unmarshal(input);

請注意,您不應該為此使用new File() 另請參閱getResourceAsStream()FileInputStream

最后,您可以訪問所有買家頁面,如下所示:

List<String> buyerPages = access.getBuyer().getPages();
// ...

毋庸置疑,養老保障並不總是最佳做法。 Java EE 6附帶容器管理的安全性。

我可以問你為什么要重新發明輪子? 如果您正在使用Java EE 6,為什么不使用類似於您所做的內置安全機制,但本質上是聲明性的?

請閱讀這篇文章

從本質上講,它將歸結為在web.xml編寫它:

<security-constraint>
   <display-name>For users in buyer role</display-name>
   <web-resource-collection>
      <web-resource-name>Restricted Access - Buyers Only</web-resource-name>
      <url-pattern>buyoffer.xhtml</url-pattern>
      <url-pattern>faq.xhtml</url-pattern>
      <url-pattern>index.jsp</url-pattern>
      <url-pattern>login.xhtml</url-pattern>
      <url-pattern>main.xhtml</url-pattern>
      <url-pattern>registrationSucceded.xhtml</url-pattern> 
      <http-method>GET</http-method>
   </web-resource-collection>
   <auth-constraint>
      <role-name>Buyer</role-name>
   </auth-constraint>
   <user-data-constraint>
      <transport-guarantee>NONE</transport-guarantee>
   </user-data-constraint>
</security-constraint>

以上示例適用於買方角色。

使用NodeList nodes = document.getElementsByTagName(tagname); 標記名應該是買方或賣方等,因為您需要它。 迭代節點列表並讀取數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM