私は本当にこれについて助けが必要です。私は、Tomcat6で実行されているPrimeFacesを備えたJSFアプリケーションを持っています。
アプリケーションは完成したと思いましたが、テストしてみると大きな問題がありました。コンピューター1でユーザー(例:「admin」)を使用してアプリケーションにログインし、次にコンピューター2で別のユーザー(例:「peter」)を使用してログインすると、コンピューター1はユーザー管理者に許可されたページにアクセスできなくなります。そして、後でadminユーザーを使用してコンピューター1に再度ログインすると、コンピューター2で、peterは管理が許可されているすべてのページにアクセスできます。
これは、すべてのTomcatセッションに対して1つのセッションがあるようなものです。
アプリケーションを検索してthrowを検索しましたが、@applicationScopedで何も見つかりませんでした。すべての@sessionScopedBeanがあります。
どうしたらいいのかわからない。助けてください。
ここにカスタマイズしたフィルターを取り付けます。
public abstract class AbstractLoginFilter implements javax.servlet.Filter {
protected ServletContext servletContext;
@Override
public void init(FilterConfig filterConfig) {
servletContext = filterConfig.getServletContext();
}
@Override
public void doFilter(
ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
String pageReq = req.getRequestURL().toString();
HttpSession session = req.getSession(false);
String[] temp = pageReq.split("/faces", 2);
String url = temp[1];
resp.setCharacterEncoding("UTF-8");
req.setCharacterEncoding("UTF-8");
if ("/login.xhtml".equals(url)) {
continueExecution(chain, request, response);
} else {
if (session == null) {
//session timeout check.
if (req.getRequestedSessionId() != null && !req.isRequestedSessionIdValid()) {
System.out.println("La sesión ha expirado");
session = req.getSession(true);
//si es un ajax
if ("partial/ajax".equals(req.getHeader("Faces-Request"))) {
resp.setContentType("text/xml");
resp.getWriter().append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>").printf("<partial-response><redirect url=\"%s\"></redirect></partial-response>", "/Autorack/faces/login.xhtml");
} else {
resp.sendRedirect("/Autorack/faces/login.xhtml");
}
}
} else {
if (Global.getLoggedUser() == null) {
resp.sendRedirect("/Autorack/faces/login.xhtml");
} else {
if (isPublicPage(url) || isAuth(url)) {
continueExecution(chain, request, response);
} else {
resp.sendRedirect("/Autorack/faces/noAutorizacion.xhtml");
}
}
}
}
}
private void continueExecution(FilterChain chain, ServletRequest request, ServletResponse response) throws ServletException, IOException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
//when i make a BACK
if (!req.getRequestURI().startsWith(req.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc)
resp.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
resp.setHeader("Pragma", "no-cache"); // HTTP 1.0.
resp.setDateHeader("Expires", 0); // Proxies.
}
chain.doFilter(request, response);
}
private boolean isPublicPage(String url) {
List<String> urlsPublicas = new ArrayList<String>();
urlsPublicas.add("/inicio.xhtml");
urlsPublicas.add("/noAutorizacion.xhtml");
urlsPublicas.add("/usuario/CambioPassword.xhtml");
return urlsPublicas.contains(url);
}
@Override
public void destroy() {
}
/**
* logic to accept or reject access to the page, check log in status
* @return true when authentication is deemed valid
*/
protected abstract boolean isAuth(String reqPage);
}
そしてこれが私のweb.xmlです
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<filter>
<description>Customizable Filter</description>
<filter-name>customFilter</filter-name>
<filter-class>com.oriuken.autorack.security.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>customFilter</filter-name>
<url-pattern>*.xhtml</url-pattern>
</filter-mapping>
<error-page>
<error-code>401</error-code>
<location>/noAutorizacion.xhtml?faces-redirect=true</location>
</error-page>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Production</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/index.xhtml</welcome-file>
</welcome-file-list>
<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>casablanca</param-value>
</context-param>
<context-param>
<param-name>primefaces.PUSH_SERVER_URL</param-name>
<param-value>ws://localhost:8088</param-value>
</context-param>
<context-param>
<param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name>
<param-value>true</param-value>
手がかりをありがとう!