JSF HTTP会话login

我尝试在Web应用程序中创buildlogin表单。 在JSP页面中我可以使用

<% String name = request.getParameter( "username" ); session.setAttribute( "theName", name ); %> 

但现在我正在使用JSF / Facelets的Web应用程序我不知道如何创build会话在客户端的JSF Backing bean和检查用户是否login,所以它会redirect到login页面。 谁能帮我给这些问题链接教程? 谢谢你

现在我没有什么问题可以映射到类Filter的web.xml代码中

 @Override public void init(FilterConfig filterConfig) throws ServletException { this.config = filterConfig; } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; LoginController controller = (LoginController) req.getSession() .getAttribute("loginController"); if (controller == null || !controller.isLoggedIn()) { res.sendRedirect("../admin/login.xhtml"); } else { chain.doFilter(request, response); } } 

并在web.xml映射<fitler>标签

 <filter> <filter-name>userLoginFilter</filter-name> <filter-class>com.mcgraw.controller.UserLoginFilter</filter-class> <init-param> <param-name>loginPage</param-name> <param-value>/login.xhtml</param-value> </init-param> </filter> <filter-mapping> <filter-name>userLoginFilter</filter-name> <url-pattern>/admin/*</url-pattern> </filter-mapping> 

我有一个文件夹pipe理员在Web项目中,我检查用户是否没有与pipe理权限login访问页面(我可以做权限检查),但是当我使用filter浏览器不明白的url? 当浏览器不理解url时,不显示StackTrace

在Firefox上显示错误

 The page isn't redirecting properly 

在IE上它加载…加载。 ..不停地

现在我改变条件,检查是否req.getPathInfo.startsWith(“/ login.xhtml”)它会做链

我有2个想法,但它响应500 HTTP状态

  if (controller == null || !controller.isLoggedIn()) { res.sendRedirect("../admin/login.xhtml"); if(req.getPathInfo().startsWith("/login.xhtml")){ chain.doFilter(request, response); } } else { chain.doFilter(request, response); } 

===============

 if (controller == null || !controller.isLoggedIn()) { if (!req.getPathInfo().startsWith("/login.xhtml")) { res.sendRedirect("../admin/login.xhtml"); } else { chain.doFilter(request, response); } } else { chain.doFilter(request, response); } 

======================更新类loginController

 package com.mcgraw.controller; import com.DAO.UserBean; import com.entity.IUser; import java.io.Serializable; import javax.ejb.EJB; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; /** * @author Kency */ @ManagedBean @SessionScoped public class LoginController implements Serializable { @EJB private UserBean userBean; private IUser user; private boolean admin; private boolean mod; private PasswordService md5; /** Creates a new instance of LoginController */ public LoginController() { user = new IUser(); md5 = new PasswordService(); } // getter / setter public boolean isMod() { return mod; } public void setMod(boolean mod) { this.mod = mod; } public IUser getUser() { return user; } public void setUser(IUser user) { this.user = user; } public boolean isAdmin() { return admin; } public void setAdmin(boolean admin) { this.admin = admin; } public String cplogin() { String md5Password = md5.md5Password(user.getPassword()); if (userBean.userLogin(user.getUsername(), md5Password) != null) { if (user.getUsername() != null || md5Password != null) { user = userBean.userLogin(user.getUsername(), md5Password); if (user.getGroups().getAdmin() != null) { setAdmin(user.getGroups().getAdmin()); } if (user.getGroups().getMods() != null) { setMod(user.getGroups().getMods()); } if (isAdmin() == true || isMod() == true) { return "home"; } else { return "login"; } } else { return "login"; } } else { return "login"; } } public String logout() { user = null; return "login"; } public boolean isLoggedIn() { return user != null; } } 

我有新的问题,如果在索引页面(不在pipe理文件夹中)呈现JSF taglib与方法loggedIn,用户不能login可以看到我渲染的例子,<==这样就像用户不login用户不能看到但他为什么能看到它?

你可以在JSF中通过ExternalContext#getSessionMap()获取/设置HTTP会话属性,这基本上是HttpSession#get/setAttribute()一个包装。

 @ManagedBean @RequestScoped public class LoginController { private String username; private String password; @EJB private UserService userService; public String login() { User user = userService.find(username, password); FacesContext context = FacesContext.getCurrentInstance(); if (user == null) { context.addMessage(null, new FacesMessage("Unknown login, try again")); username = null; password = null; return null; } else { context.getExternalContext().getSessionMap().put("user", user); return "userhome?faces-redirect=true"; } } public String logout() { FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); return "index?faces-redirect=true"; } // ... } 

在Facelets页面中,只需将usernamepasswordinput字段绑定到该bean,并相应地调用login()动作。

 <h:form> <h:inputText value="#{loginController.username}" /> <h:inputSecret value="#{loginController.password}" /> <h:commandButton value="login" action="#{loginController.login}" /> </h:form> 

会话属性可以在EL中直接访问。 具有user名的会话属性在EL中可用作#{user} 。 当testing用户是否login了一些rendered属性时,只需检查它是否为empty

 <h:panelGroup rendered="#{not empty user}"> <p>Welcome, #{user.fullName}</p> <h:form> <h:commandButton value="logout" action="#{loginController.logout}" /> </h:form> </h:panelGroup> 

注销操作基本上只是会破坏会话。


至于检查一个用户是否login的传入请求,只需要在doFilter()方法中创build一个大致如下的Filter

 @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; HttpSession session = request.getSession(false); String loginURI = request.getContextPath() + "/login.xhtml"; boolean loggedIn = session != null && session.getAttribute("user") != null; boolean loginRequest = request.getRequestURI().equals(loginURI); boolean resourceRequest = request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER); if (loggedIn || loginRequest || resourceRequest) { chain.doFilter(request, response); } else { response.sendRedirect(loginURI); } } 

将其映射到覆盖受限页面的url-pattern ,例如/secured/*/app/*

也可以看看:

  • 如何处理数据库中用户的authentication/授权?
  • 会话过期授权redirect在提交JSF表单时不起作用,页面保持不变

在接收到请求时(如在操作方法中),在支持bean中试试这个:

 HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); HttpSession session = request.getSession(); 

然后,您可以像使用JSP一样处理请求和会话对象,设置属性等等。

您可能也想看看我的相关问题,关于检查servletfilter中的客户端会话 。 你可以写一个类似的Filter来检查用户在他们的HttpSession中login,然后根据需要做一个redirect(或者像我最终做的RequestDispatch)到你的login页面。