当前位置: 首页 > 知识库问答 >
问题:

当我打开/home时,不会调用映射到/home的Servlet过滤器。xhtml

全心思
2023-03-14

我是Java企业版新手。我开始从一些YouTube视频学习,最近开始阅读http://docs.oracle.com/javaee/6/tutorial/doc/我读完了第15章。

我试着做我自己的过滤器。

我没有使用JavaServlet类。因为我想使用JSF页面,而且据我所知,只有在JSF页面中才能使用托管Beans,而Servlet类可以使用JSP。它是确定的。

据我所知登录过滤器的用处:https://stackoverflow.com/tags/servlet-filters/info

[...] 当您有多个要检查登录用户的页面时,这尤其有用。不必在所有页面上复制粘贴相同的逻辑,您可以使用过滤器将其放在单个位置。

这是有用的(如我所知),当用户键入的URL直接进入浏览器的网页,需要登录用户,所以过滤器将重定向他到登录页面或继续,如果他是登录。

我搜索了任何简单的例子来学习,但没有找到。我将举一个简单的例子:

我有两个JSF页面
一个名为home.xhtml(需要登录用户)
另一个名为login.xhtml(过滤器必须重定向到它,如果非登录用户寻找家)

login.xhtml:

  <h:form>
     <h:panelGrid columns="2">
     <h:outputLabel value="name:"/> <h:inputText value="#{user.name}"/>
     <h:outputLabel value="password:"/> <h:inputSecret value="#{user.password}"/>
     </h:panelGrid>
     <h:commandButton id="btn"  value="login" action="#{user.login()}"/>
  </h:form>

家xhtml:

<h:body>
   Hello #{user.name}. You are welcome
</h:body>

用户:

@ManagedBean
@SessionScoped
public class User implements Serializable
{
   String name;
   String password;
   Authentication authentication;

   public User()
   {
      authentication = new Authentication();
   }

    //Getters and Setters for name and password.

   public String login()
   {
      if (this.getName().equals("user") &&(this.getPassword().equals("1234")))
      {
         authentication.setLoggedIn(true);
         FacesContext context = FacesContext.getCurrentInstance();
         context.getExternalContext().getSessionMap().put("auth", authentication);
         return "home";
      }
      else
      {
         authentication.setLoggedIn(false);
         FacesContext context = FacesContext.getCurrentInstance();
         context.getExternalContext().getSessionMap().put("auth", authentication);
         return "login";
      }
   }
}

认证:

@ManagedBean
@SessionScoped
public class Authentication implements Serializable
{

   private boolean authenticated;

   public Authentication()
   {
      authenticated = false;
   }

   public boolean isLoggedIn()
   {
      return authenticated;
   }

   public void setLoggedIn(boolean authenticated)
   {
      this.authenticated = authenticated;
   }

}

登录过滤器:

@WebFilter(value = "/home")
public class LoginFilter implements Filter
{

   @Override
   public void init(FilterConfig filterConfig) throws ServletException
   {
      //throw new UnsupportedOperationException("Not supported yet.");
   }

   @Override
   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException
   {
      HttpServletRequest req = (HttpServletRequest) request;
      Authentication auth = (Authentication) req.getSession().getAttribute("auth");

      if (auth != null && auth.isLoggedIn())
      {
         System.out.println("Filter is working");
         chain.doFilter(request, response);
      } else
      {
         System.out.println("Filter is working");
         HttpServletResponse res = (HttpServletResponse) response;
         res.sendRedirect(req.getContextPath() + "/login.xhtml");
      }
   }

   @Override
   public void destroy()
   {
      //throw new UnsupportedOperationException("Not supported yet.");
   }
}

faces-config:

   <navigation-rule>
      <from-view-id>/login.xhtml</from-view-id>
      <navigation-case>
         <from-outcome>home</from-outcome>
         <to-view-id>/home.xhtml</to-view-id>
         <redirect/>
      </navigation-case>
      <navigation-case>
         <from-outcome>login</from-outcome>
         <to-view-id>/login.xhtml</to-view-id>
         <redirect/>
      </navigation-case>
   </navigation-rule>

网状物xml:

<context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</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>/faces/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>faces/login.xhtml</welcome-file>
    </welcome-file-list>

现在,当我键入主页的URL时。xhtml页面(清除历史记录后)

甚至系统。出来println(“过滤器正在工作”) 不打印任何内容。


共有1个答案

易阳朔
2023-03-14

您确定已调用筛选器吗?如果没有打印到系统。我想不会。问题可能是servlet映射。

您指定了以下内容:

@WebFilter(value = "/home")
public class LoginFilter implements Filter {...}

我认为这只与url/home匹配。试着用/*/home*(这是非常有限的,我不推荐)。

另一件事:如果你得到Hello{user.name}。欢迎您作为输出,然后可能不会调用FacesServlet。这可能有两个原因:

  1. 你使用了错误的映射。尝试用/face/home.xhtml/home.jsf来调用页面。url取决于web.xml中的映射类型。
  2. FacesServletweb.xml中没有正确配置

 类似资料:
  • [上下文]tomcat 7-java 1.7 大家好,我正面临着陌生人的工作。在我的web.xml文件中,我映射了这样的请求: web.xml网站 DemoFilter.java(实现过滤器) DemoServlet.java(扩展HttpServlet) [1=预期结果]首先,当我尝试请求“/foo/bar”时,调用了过滤器和servlet(页面显示“foo”一词)。控制台结果: [2 =意外的

  • 在tomcat中,对于某个url,我想跳过所有过滤器并执行一个servlet,我认为将servlet放在过滤器之前会像我预期的那样,但servlet映射后面的过滤器仍在执行。我做错什么了吗? 例如,这是我的web.xml 因此,当传入的url包含“/abc/”时,我希望我的servlet执行并跳过过滤器。我将servlet放在所有过滤器之前,但当传入的url包含“/abc/”时,过滤器仍然会被执行

  • 我正在研究一个合作医疗系统。 我的代码在url调用的servlet的

  • 欢迎走进 PWA 世界!! 简介 本书围绕着 PWA 以及周边技术,从概念入手,以实战的方式给读者讲述如何编写 PWA,以及如何编写体验最好、速度最快、安全的 PWA 站点。 本书主要从以下几个部分讲述 PWA。 设计与体验 基础技术 Service Worker 离线与缓存 用户留存 安全 性能 为什么写这本书 我们团队从成立到现在,已有 2 年,推出 LAVAS 和 MIP 也是我们的尝试之一

  • FECS (FrontEnd Code Style Suite) FECS 是基于 Node.js 的前端代码风格工具套件,包含对 JavaScript、CSS 与 HTML 的检查及格式化。 安装 $ [sudo] npm install fecs -g 代码检查 fecs-check 命令 各语言对应的工具 语言 使用的工具 备注 JavaScript eslint -- CSS csshin

  • Welcome to the Jerrydremaker.github.io wiki!