jsfログインとログアウトの小さなWebアプリを開発しています。いくつかの問題があります。ログアウト方法でセッションが削除されず、ログインページへのリダイレクトが機能しません。stackoverflow.comから質問しました。MattユーザーがFilterクラスに回答しました。 Mattに従ってFilterとページキャッシュを調査しています。web.xmlファイルなどでFilterのdoFilter()メソッドを使用していました。
これが私のコードです:
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig config) throws ServletException {
}
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
UserController userController = (UserController) request.getSession().getAttribute("user");
if (userController == null || !userController.isLoggedIn()) {
response.sendRedirect(request.getContextPath() + "/login.jsf");
} else {
chain.doFilter(request, response);
}
}
@Override
public void destroy() {
}
}
そしてlogout()
public String logout() {
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext ec = context.getExternalContext();
final HttpServletRequest request = (HttpServletRequest) ec.getRequest();
request.getSession(false).invalidate();
return "logout";
}
そしてweb.xml構成:
<filter>
<filter-name>loginFilter</filter-name>
<filter-class>org.bis.logic.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>*.jsf</url-pattern>
</filter-mapping>
ログに記録した後、ホームページをレンダリングします。
<body>
<!--
#{ session.invalidate();
response.sendRedirect("login.jsf");
} -->
<h:panelGrid rendered="#{userController.isLoggedIn()}">
Hello Mr . #{userController.user.name}
<br />
<h:form>
<p align="right">
<h:commandLink action="#{userController.logout()}"value="Logout" />
</p>
</h:form>
</h:panelGrid>
</body>
私のuserControllermanagedBeanクラス:
@ManagedBean(name = "userController")
@SessionScoped public class UserController {
private User user;
public UserController() {
user = new User();
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public static void addErrorMessage(String msg) {
FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_ERROR,
msg, msg);
FacesContext.getCurrentInstance().addMessage(null, facesMsg);
}
public String authenticate() {
if (user.getName().equals("admin") && user.getPassword().equals("")) {
return "success";
} else
addErrorMessage(String
.format("Username and Password didn't match !!!"));
return "fail";
}
ページナビゲーションxml:
<navigation-rule>
<from-view-id>/login.xhtml</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/home.xhtml</to-view-id>
<redirect />
</navigation-case>
<navigation-case>
<from-outcome>fail</from-outcome>
<to-view-id>/login.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/home.xhtml</from-view-id>
<navigation-case>
<from-action>#{userController.logout()}</from-action>
<from-outcome>logout</from-outcome>
<to-view-id>/index.xhtml</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>