-1
我为我的JSF项目写了一个登录名,并定义了一个小私人部分来测试它。JSF重定向到登录后请求的页面
这是我LoginFilter:
@WebFilter("/private/*")
public class LoginFilter implements Filter {
@Inject
private NavigationService navigationService = null;
@Override
public void init(FilterConfig config) throws ServletException {}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res = (HttpServletResponse)response;
String originalURL = req.getRequestURL().toString();
if(req.getQueryString() != null) {
originalURL += "?" + req.getQueryString();
}
User user = (User) req.getSession().getAttribute("user");
if(user != null) {
chain.doFilter(request, response);
} else {
req.getSession().setAttribute("originalURL", originalURL);
res.sendRedirect(req.getContextPath() + navigationService.toLogin());
}
}
@Override
public void destroy() {}
}
这是我的login服务:
@Named
@SessionScoped
public class LoginService implements Serializable {
private String username = "";
private String password = "";
@Inject
private NavigationService navigationService = null;
@Inject
private DAO dao = null;
private String originalURL = "";
@PostConstruct
public void init() {
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
if(externalContext.getRequestMap().containsKey("originalURL")) {
this.originalURL = (String)externalContext.getRequestMap().get("originalURL");
} else {
this.originalURL = navigationService.externalContextRedirectToIndex();
}
}
public void doLogin() throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext externalContext = context.getExternalContext();
User user = dao.findUserByUsername(this.username);
boolean validated = PasswordHasher.validatePassword(this.password, user.getPassword());
if(user != null && validated) {
externalContext.getSessionMap().put("user", user);
vexternalContext.redirect(this.originalURL);
} else {
context.addMessage(null, new FacesMessage("False username or password!"));
}
}
public void doLogout() throws IOException {
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
externalContext.invalidateSession();
externalContext.redirect(externalContext.getRequestContextPath() + navigationService.toLogin());
}
// Getter and Setter
}
如果现在有人正在请求例如 “/private/test.html” 我的登录 页出现,用户必须登录。之后,如果用户成功登录,我想重定向到最初请求的test.html。
现在sessionMap从来没有一个名为“originalURL”的键,我总是会将 重定向到我的index.html。
顺便说一下我的NavigationService提供了两种方法:
public String redirectToIndex() {
return "/index.html?faces-redirect=true";
}
public String externalContextRedirectToIndex() {
return "/Web-Tschuwwa/index.html?faces-redirect=true";
}
第二种方法,我有登录 后特意加了重定向,因为当我用第一种方法我被重定向到的index.html的 我的glassfish docsroot文件夹。这是我不知道为什么的另一件事。 Web-Tschuwwa是我的项目的名称。
登录后如何重定向到所请求的页面?