当前位置: 首页 > 面试题库 >

用JAXP(JEE6)解析一个简单的XML文档

邵博艺
2023-03-14
问题内容

我想为我的Web应用程序创建一个授权过滤器(以便能够限制对某些页面的访问)。

我创建了一个简单的.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方法内部的注释中,解释了我需要做的事情。有人可以给我一个提示,告诉我如何遍历文件以查找每种用户类型的页面名称吗?我尝试从Internet上遵循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()VSFileInputStream

最后,您可以按以下方式访问所有买方页面:

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

不用说,提高安全性并不总是最佳实践。Java EE 6附带了容器管理的安全性。



 类似资料:
  • 使用iphoneSDK官方NSXMLParserDelegate做的简单xml解析,附带详细注释以及使用到的方法的详细解释,非常适合新手参考。 [Code4App.com]

  • 问题 你想从一个简单的XML文档中提取数据。 解决方案 可以使用 xml.etree.ElementTree 模块从简单的XML文档中提取数据。 为了演示,假设你想解析Planet Python上的RSS源。下面是相应的代码: from urllib.request import urlopen from xml.etree.ElementTree import parse # Download

  • 问题内容: 如果我想在python中创建一个简单的XML文件,该怎么办?(明智的) 我想要的xml看起来像: 问题答案: 如今,最流行(且非常简单)的选项是ElementTree API,该元素自Python 2.5起已包含在标准库中。 可用的选项有: ElementTree(ElementTree的基本,纯Python实现。自2.5以来是标准库的一部分) cElementTree(Element

  • 我的问题是:在PHP中,解析SRU请求返回的XML的最简单方法是什么? 例如,在浏览器中查看以下URL: http://explor.bcu.ac.uk/IntraLibrary-SRU?operation=searchRetrieve 此对公共存储库的查询返回符合SRU标准的格式良好的XML文档(它进行验证),在本例中返回两条记录。我使用过各种排列的simplexml\u load\u stri

  • 问题内容: 我正在尝试解析下面的文件。我想打印每个乘客的身份证和姓名。你能给我代码解析吗? 问题答案: 这是一个工作示例,尽管我建议您改用StAX,但您会发现SAX不太方便 输出

  • 问题内容: 我有这样的XML字符串 我遵循此帮助 用Java查询XML的最简单方法 我的代码: 我想获取味精节点值,但出现异常 我不会为这个简单的任务使用一些外部库。请指导我如何获取其他节点的值。谢谢 问题答案: 您不能将其重复用于多个调用,因为它会自动关闭。因此,您将获得IO异常。试试这个 编辑: 更好的方法是使用A解析您的XML并构建第一个(使用JAXP的DOM API),然后可以在多个XPa