使用 JSF 的 Servlet 过滤器

2023-11-29

我尝试使用 JSF 配置 Servlet 过滤器。我在这里遇到很多问题,我也使用 PrimeFaces。

这是我的 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>JsfEaxmples</display-name>
  <context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>server</param-value>
  </context-param>
  <context-param>
    <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
    <param-value>.xhtml</param-value>
  </context-param>
  <context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
  </context-param>
  <context-param>
    <param-name>javax.faces.FACELETS_REFRESH_PERIOD</param-name>
    <param-value>1</param-value>
  </context-param>
  <context-param>
    <param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
    <param-value>true</param-value>
  </context-param>
  <context-param>
    <param-name>javax.faces.SEPARATOR_CHAR</param-name>
    <param-value>-</param-value>
  </context-param>
  <context-param>
    <param-name>org.richfaces.skin</param-name>
    <param-value>classic</param-value>
  </context-param>
  <context-param>
    <param-name>facelets.BUILD_BEFORE_RESTORE</param-name>
    <param-value>true</param-value>
  </context-param>
  <context-param>
    <param-name>facelets.RECREATE_VALUE_EXPRESSION_ON_BUILD_BEFORE_RESTORE</param-name>
    <param-value>true</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-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>

  </servlet-mapping>
  <context-param>
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
    <param-value>resources.application</param-value>
  </context-param>
  <listener>
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
  </listener>
  <filter>
  <filter-name>sessionfilter</filter-name>
  <filter-class>com.invoice.sessionfilter</filter-class>

  </filter>
  <filter-mapping>
  <filter-name>sessionfilter</filter-name>
  <url-pattern>/*</url-pattern>

  </filter-mapping>
</web-app>

首先我使用这样的过滤器<url-pattern>jsf invoice system/*</url-pattern>这完全不起作用,所以我改为<url-pattern>/*</url-pattern>这个有回应,但在我的过滤中出现了很多问题 我用过滤器检查以下过程

  1. 如果会话不存在,用户应重定向到登录页面
  2. 如果会话存在并且用户进入登录页面,则不应重定向他

添加过滤器 PrimeFaces 组件后外观发生变化。添加过滤器后,无法正确导航。

这是我的过滤器代码。

package com.invoice;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class sessionfilter implements Filter {

    String uname;

    /**
     * Default constructor.
     */
    public sessionfilter() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @see Filter#destroy()
     */
    public void destroy() {
        // TODO Auto-generated method stub
    }

    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // place your code here

        // pass the request along the filter chain
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        String pagerequested = req.getRequestURL().toString();
        HttpSession ses = req.getSession(true);
        //uname=(String)ses.getAttribute("uname");//null pointer exception
        if (pagerequested.contains("Login.xhtml") && uname == null)// if user logs in to this for first time
        {

            chain.doFilter(request, response);

        } else if (uname != null && pagerequested.contains("Login.xhtml")) { // if session exists and user tries to go to login page he should be redirected

            resp.sendRedirect("invoiceinfo.xhtml");

        } else if (uname == null && !pagerequested.contains("Login.xhtml")) {

            try {
                uname = (String) ses.getAttribute("uname");
                chain.doFilter(request, response);

            } catch (Exception e) {
                resp.sendRedirect("Login.xhtml");
            }
        }
    }

    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
        // TODO Auto-generated method stub
    }

}

这是我在会话范围内的登录信息,我在这里不使用注释

package com.invoice;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

@SessionScoped
public class login {

    String username, userpassword, errormess, navipg;

    public String getNavipg() {
        return navipg;
    }

    public void setNavipg(String navipg) {
        this.navipg = navipg;
    }

    public String getErrormess() {
        return errormess;
    }

    public void setErrormess(String errormess) {
        this.errormess = errormess;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getUserpassword() {
        return userpassword;
    }

    public void setUserpassword(String userpassword) {
        this.userpassword = userpassword;
    }

    public String navigate() {
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "invoice", "google");
            Statement stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery("select username,password from usertable where username='" + username + "' and password='" + userpassword + "' ");
            if (rs.next()) {
                setErrormess("");
                FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("uname", this.username);
                navipg = "invoiceinfo";
            } else {
                setErrormess("Invalid Login credentials");
                username = "";
                navipg = "Login";
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return navipg;
    }

    public String logout() {
        FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
        return "Login";
    }
}

我的登录页面是

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui">

    <h:head>
        <style type="text/css">
            .ui-panelgrid tr,
            .ui-panelgrid td {
                border: none;
            }
        </style>
    </h:head>

    <h:body>
        <h:form>
            <p:panelGrid columns="3" id="pnl" border= "0">
                <f:facet name="header"><p:graphicImage value="login.jpg"/></f:facet>
                <h:outputText value="Username"/>

                <p:inputText id="uname" value="#{login.username}" required="true" label="username"/>
                <p:message for="uname"/>

                <h:outputText value="Password"/>
                <p:password id="pass" value="#{login.userpassword}" required="true" label="password"/>
                <p:message for="pass"/>

                <p:commandButton value="Login" action="#{login.navigate}" ajax="false"/>
                <p:button value="Reset" />
            </p:panelGrid>

            <h1><h:outputText value="#{login.errormess}"/></h1>
        </h:form>
    </h:body>
</html>

我完全被困在这里,不知道如何继续过滤。


对于 CDI,我使用这个。似乎工作正常。也对 ajax 请求进行重定向。

所有页面都位于 /secure/ 中,除了位于根目录中的 login.xhtml 之外。

<filter>         
    <filter-name>LoginFilter</filter-name>         
    <filter-class>...LoginFilter</filter-class>     
</filter>      
<filter-mapping>         
    <filter-name>LoginFilter</filter-name>         
    <url-pattern>/secure/*</url-pattern>     
</filter-mapping>  

Filter:

@Inject
private LoginBean loginBean;

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

    // Set response headers to no-cache
    HttpServletResponse res = (HttpServletResponse) response;
    HttpServletRequest req = (HttpServletRequest) request;
    res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
    res.setHeader("Pragma", "no-cache"); // HTTP 1.0.
    res.setDateHeader("Expires", 0); // Proxies.

    // Check if user logged in, if not redirect to login.xhtml
    if (loginBean == null || !((LoginBean) loginBean).isLoggedIn()) {
        boolean isAjax = "XMLHttpRequest".equals(req.getHeader("X-Requested-With"));

        if (!isAjax) {
            res.sendRedirect(req.getContextPath() + "/login.xhtml"); 
        } else {
            // Redirecting an ajax request has to be done in the following way:
            // http://javaevangelist.blogspot.dk/2013/01/jsf-2x-tip-of-day-ajax-redirection-from.html
            String redirectURL = res.encodeRedirectURL(req.getContextPath() + "/login.xhtml");
            StringBuilder sb = new StringBuilder();
            sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?><partial-response><redirect url=\"").append(redirectURL).append("\"></redirect></partial-response>");
            res.setCharacterEncoding("UTF-8");
            res.setContentType("text/xml");
            PrintWriter pw = response.getWriter();
            pw.println(sb.toString());
            pw.flush();
        }
    } else {
        // Let chain of filters continue;
        chain.doFilter(request, response);
    }
}

登录.xhtml:

<h:body onload="PF('dlg').show()">
    <p:growl id="growl" life="5000" autoUpdate="true" showDetail="true" escape="false"/>

    <h:form>    
        <p:dialog id="dialog" header="Login" footer="..." width="400" widgetVar="dlg" closable="false" showEffect="clip" draggable="false" resizable="false" style="box-shadow: 7px 10px 5px #303030;"> 

            <p:panelGrid columns="2">
                <p:outputLabel value="Username"/>            
                <p:inputText value="#{loginBean.username}" id="username"/>            
                <p:outputLabel value="Password"/>            
                <p:password value="#{loginBean.password}" id="password"/>            
            </p:panelGrid>
            <p:commandButton  id="button" value="Login" action="#{loginBean.doLogin}" style="float:right"/> 
.... close tags

LoginBean 是一个简单的 SessionScoped CDI bean。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JSF 的 Servlet 过滤器 的相关文章

  • 从 asp.net mvc ajax 调用 wcf

    我有两个应用程序 第一个是 WCF 服务 第二个是 asp net MVC 3 应用程序 在 WCF 应用程序中我有一个界面 ServiceContract public interface IService1 OperationContr
  • (Django) AJAX 请求的 CSRF 验证在 Chrome 中工作,但在 Firefox 中不起作用

    正如标题所述 我的 Django CSRF 验证在 Chrome 中有效 但在 Firefox 中无效 我想知道原因 以便解决此问题 我已将此包含在head我的标签基本 html我的应用程序中的所有其他文件都从中扩展的文件 base htm
  • 如何在返回的 AJAX 调用上使用 django 模板标签?

    我有一个简单的 AJAX 脚本 它在名为的搜索字段中获取输入的字符串AJAXBox并调用一个视图函数 该函数使用过滤器查询数据库并返回与输入参数匹配的所有 User 对象的查询集 当我使用 django 模板标签迭代查询集时 它不起作用 我
  • 通过 Ajax 加载内容

    好的 我对 ajax 和从外部加载内容还很陌生 如果您能深入了解我的问题 我将不胜感激 我目前有一个空的隐藏 div 单击链接后应在其中加载 ajax 内容 div div 我目前有一个链接列表 它们都具有相同的类 我希望在单击时 空白 d
  • getScript 本地加载而不是全局加载?

    根据我的阅读 JQuery 的 getScript 函数使用名为 global eval 的函数在全局上下文中加载脚本文件 是否有特定的设置或方法可以更改此设置 以便它将改为在我调用它的函数中加载 如果我执行以下代码名称 则返回未定义 因为
  • ajaxSetup(beforeSend 不起作用

    登录到远程 API 服务器并获取 access token 后 我尝试为所有后续 ajax 调用设置授权标头 done function result console log GOT AUTHORIZATION amplify store
  • 用 Ajax 响应替换 div 的内部 HTML

    我试图在一段时间后更改 div 的内部 HTML 我得到了我想要的 Ajax 正确响应 但无法用 Ajax 响应替换所选内容的内部 HTML 我的代码有什么问题 Html p class time ui li desc 51 seconds
  • onchange 下拉列表

    我的问题是我所问问题的延续 请参阅链接 加载国家 州 城市 https stackoverflow com questions 2640001 load country state city 我已经展开以从数据库加载我的下拉列表 我只需要一
  • 仅使用 mod_rewrite 重定向主页

    我有一个需要重定向的网站 但我不能只重定向 目录 因为服务器上的文件夹中还有其他网站 这样做也会重定向它们 不好 因此 我的 htaccess 文件包含一堆针对各个 HTML 页面的 301 重定向 并且这些文件工作得很好 但我需要重定向主
  • 使用 Express 检测 NodeJS 上的 AJAX 请求

    我正在使用 NodeJS 和 Express 如何区分普通浏览器请求和 AJAX 请求 我知道我可以检查请求标头 但是 Node Exprsss 是否会公开此信息 大多数框架设置了X Requested With标头至XMLHttpRequ
  • AJAX VS PHP 动态网页?

    当您只能使用 php 来实现动态网页时 为什么要使用 AJAX 呢 使用 AJAX 的主要原因是用户体验 UX 现在 AJAX 不一定会改善每个实例的用户体验 所以在很多地方坚持使用纯 PHP 完全没问题 但想象一下这样的情况 网站上有一个
  • Response.Redirect 并不总是重定向

    我们在一个工作不一致的页面上有一个简单的 Response Redirect IIS 6 0 大多数情况下 它会正确重定向 但我们收到一些用户抱怨 他们没有重定向 而是看到 302 对象移至此处 页面 该页面显示标题信息以及正确的位置 如果
  • 如何从 GridView TemplateColumn 单击触发 UpdatePanel?

    我有以下情况 我的所有控件都在页面上的更新面板上 这些控件之一是 GridView 该 GridView 在标题模板字段上包含一个复选框 以进行全部选中 autopostback 是 true 但是当检查更改时 没有任何更改 更新面板会触发
  • ajax调用后如何停止刷新页面?

    ajax 调用后我无法停止刷新页面 我尝试过放置 e preventDefault 并返回 false 但我的页面又刷新了 我不知道代码有什么问题或者什么 请帮助我在ajax调用后停止刷新页面 解决这个问题对我来说会有很大的帮助 提前致谢
  • 使用 ASP.Net 和 Ajax 的登录页面

    我正在尝试使用 html ajax 和 ASP NET 制作登录页面 数据确实传递给 ajax 函数 但是当我调试 asp 页面时 用户名和密码以 NULL 发送 该代码应该获取用户名和密码 然后返回用户 ID html页面 div Use
  • .htaccess:“重定向永久”并回退到“RewriteRule”

    我有一个网上商店 我们可以在其中切换子目录 从 shop 到根 一些产品和类别名称也发生了变化 我想将一些特定的 URL 重定向到较新的 URL 例如 www domainname de shop product abc to www do
  • 验证错误值无效[重复]

    这个问题在这里已经有答案了 我知道这是一个常见的错误 并且有很多关于它的问题 但我必须创建一个新的问题 这是我的 jsf 页面
  • 返回视图作为 JSON 对象的一部分

    我有一个应用程序只加载一次完整视图 我这样做的原因并不重要 重要的是 其余内容只会以部分视图的形式返回 除了一些内容之外 我还有一些 JSON 对象 我想通过每个 AJAX 请求在服务器之间来回传递 有没有办法返回一个 JSON 对象 并将
  • HTML5 文件 API 和 AJAX 上传分块问题

    我编写了一个带有单独进度的拖放多个文件上传等 除了一件事之外 它工作得非常好 上传较大文件时 有时浏览器会锁定 直到上传完成 我认为这是因为该文件存储在浏览器的内存中并占用了浏览器可用的所有资源 我想知道 是否可以逐段读取文件并在读取时通过
  • 当php脚本通过ajax运行时显示进度条

    我有一个通过 ajax 向服务器提交值的表单

随机推荐

  • 从不同视图模型同步可观察量的简单、干净的方法

    假设我有两个视图模型 每个视图模型都有一个可观察的属性 表示不同但相似的数据 function site1Model username this username ko observable username function site2M
  • .net2.0 和 .net4.0 编写的 Web 服务客户端之间的差异

    我在通过 SSL 使用 Java Web 服务时遇到问题 我有两种方法 一种使用 net4 0 一种使用 net2 0 不幸的是 net4 0方法不起作用 但是 早期版本 2 0 可以正常工作 class Program static vo
  • 从 python 字典中打印列

    我有一本一周多提交的字典 我想以每周日历样式的列将它们打印出来 Fri Commit 04 15PM Move flex to mixin and do mobile first queries n Commit 03 52PM use p
  • 如何在 WPF 中平铺和叠加图像?

    我对 WPF 非常陌生 并尝试将应用程序从 VB6 移植到 C 和 XAML 我现在需要做的是用许多小图像创建一个大图像 这些小图像排列成一系列 瓷砖 其中一些较小的将有叠加在其上的覆盖层 在 VB6 中 只需使用 PictureBox 控
  • 在方法内使用扫描仪

    我是编程新手 所以如果有一个非常简单的答案 我深表歉意 但我似乎找不到任何实际的答案 我正在使用扫描仪对象在猜数字游戏中进行用户输入 扫描仪在我的主方法中声明 并将在其他单个方法中使用 但该方法将在各处被调用 我尝试将其声明为静态 但 Ec
  • 在后台播放网页中的声音文件

    我想在我的网页上后台播放声音文件 不希望出现媒体播放器 UI 我的网站将在 Fire Fox 上运行 我使用了 Embed 元素并设置了 Hidden 属性是真实的问题是 除非我删除隐藏属性 否则不会播放任何声音 在这种情况下 声音文件会播
  • React 组件渲染方法无缘无故被调用两次

    import App css import SolarSystem from components solarSystem solarSystem class App extends React Component componentDid
  • Akka 整合并发数据库请求

    我希望能够向多个数据存储库发出并发请求并合并结果 我试图了解我的方法是否有效 或者是否有更好的方法来解决这个问题 我绝对是 Akka Spray Scala 的新手 并且真的想更好地了解如何正确构建这些组件 任何建议 提示将不胜感激 试图让
  • 如何将设计器生成的类的基类从 System.Windows.Forms.Form 更改为我自己的 BaseForm

    每次我向 WinForms 项目添加一个新的 Form 时 设计器都会生成一个继承自 System Windows Forms Form 的新类的代码 出于某种原因 我希望它继承自我自己的 BaseForm 类 除了自己编辑生成的文件之外
  • shell级别的PostgreSQL数据库逆向工程

    我碰巧用大型数据库做了一些调节工作 但我对此没有那么丰富的经验 所以我想明智的做法是在我的本地主机上创建类似的数据库 以免弄乱原始数据库 这是我的问题 是否可以生成SQL脚本将创建我想要的精确表 我的意思是在 MySQL GUI 工具上有这
  • 如何使用 Node.js 在 a 中使用通配符从目录中读取文件

    我需要使用 Node js 从目录中读取文件 文件名都是 json 如何在 Node js 中对文件名部分使用通配符 您可以使用glob npm用于使用通配符文件名模式匹配 var glob require glob options is
  • 如何在iOS SDK中创建一个伞形框架?

    我想在 iOS SDK 中创建一个伞形框架 我的要求是 我有一个名为 框架 A 的框架 我想创建另一个名为 框架 B 的框架 我想将 框架A 作为子框架添加到 框架B 中 用户只需在项目中导入 框架B 即可同时使用 框架A 和 框架B 换句
  • 子对象初始化的顺序是什么?

    让我们有一个对象o类的某种类型 其中包含成员子对象so and sso另一个类类型 考虑以下示例 include
  • 如何从 FiPy 中的 3D 变量中提取平面(3D 到 2D)

    我在 3D 网格上有一个变量 我正在尝试制定一个计划 我很惊讶这个问题以前没有被问过 它看起来是一个简单而常见的问题 但我还没有找到任何好的方法 我将不胜感激任何建议 假设我有一个 3x3x5 的平行六面体 并且我正在尝试提取 z 平面 f
  • 由于错误 80020101,无法完成操作。IE [重复]

    这个问题在这里已经有答案了 可能的重复 Ajax请求问题 错误80020101 我正在使用 JQuery 1 64 这是我重置计时器的代码 var message Logged in var myTimeout setTimeout tim
  • 如何将 IIS 服务器中的特定端口重定向到其他端口

    我的 URL 重写规则仅适用于 IIS 中的端口 80 重写适用于 http 本地主机 80 gt http 本地主机 8100 重写适用于 http localhost 80 重定向 gt http 本地主机 8100 重写不适用于 ht
  • 为无效迭代器定义了哪些操作?

    作为后续关于比较无效迭代器的问题 我试图在 C 标准中找到无效迭代器允许的表达式的定义 搜索 无效迭代器 仅在 24 2 1 11 中找到一个引用 它说无效的迭代器可能是 单一的 但仅说明取消引用它们可能是未定义的行为 没有给出进一步的语义
  • 使用 ASP.Net 教授初学者 Web 开发的小项目想法 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我几周前就问过这个问题 如
  • 尝试将数据插入 Atlast 服务器上的集合时,命令失败并出现错误 8000 (AtlasError)

    我正在使用 mongoDB Atlas 创建一个 mongodb 一切似乎都很好 当我运行程序时 服务器连接成功 但是 当我尝试将数据插入集合时 它给出了错误 命令失败 错误 8000 AtlasError 我读到另一篇文章说我必须使用不同
  • 使用 JSF 的 Servlet 过滤器

    我尝试使用 JSF 配置 Servlet 过滤器 我在这里遇到很多问题 我也使用 PrimeFaces 这是我的 web xml