我是Java Enterprise Edition的新手。我开始从一些YouTube视频中学习,最近开始阅读http://docs.oracle.com/javaee/6/tutorial/doc/我完成了第15章。
我试着制作自己的过滤器。
我没有使用Java Servlet类。因为我想使用JSF页面,据我所知,只能使用带有JSF页面的Managed Beans,而Servlet类可以使用JSP。没关系。
据我所知,登录过滤器的用处: https://stackoverflow.com/tags/servlet-filters/info
[...]当您有多个页面时,此功能特别有用 您想查看已登录的用户。而不是copypasting 所有页面上的逻辑相同,您可以使用过滤器将其整合在一起 的地方。
当用户在浏览器中为需要登录用户的页面直接输入 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>
home.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;
}
}
LoginFilter:
@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.");
}
}
面-配置:
<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>
的web.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>
现在,当我在浏览器中键入home.xhtml页面的网址(清除历史记录和Cookie后)后,我会将其重定向到登录页面。但它改为回家,名称为空值:
Hello #{user.name}. You are welcome
呈现为Hello . You are welcome
即使System.out.println("Filter is working");
也没有打印任何内容。
答案 0 :(得分:1)
你确定过滤器被调用了吗?如果没有任何内容打印到System.out
,我猜不会。问题可能是servlet映射。
你指定了这个:
@WebFilter(value = "/home")
public class LoginFilter implements Filter {...}
我认为这只会与网址/home
匹配。请尝试使用/*
或/home*
(这是非常有限的,我不建议使用)。
另一件事:如果输出Hello #{user.name}. You are welcome
,则可能不会调用FacesServlet
。这可能有两个原因:
/faces/home.xhtml
或/home.jsf
来调用该页面。该网址取决于您在web.xml
。FacesServlet
中未正确配置web.xml
。