我正在创建一个Web应用程序,在该应用程序中创建sessionlistener。在该会话监听器中,如果条件不起作用,如何在达到特定会话计数后将页面重定向到另一个页面。
import java.awt.Window;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import javax.xml.ws.Response;
public class SessionListener implements HttpSessionListener {
private int sessionCount = 0;
HttpServletResponse response;
public void sessionCreated(HttpSessionEvent event) {
synchronized (this) {
sessionCount++;
if(sessionCount>=2)
{
response.sendRedirect("Error.jsp");
}
}
System.out.println("Session Created1: " + event.getSession().getId());
System.out.println("Total Sessions1: " + sessionCount);
}
public void sessionDestroyed(HttpSessionEvent event) {
synchronized (this) {
sessionCount--;
}
System.out.println("Session Destroyed: " + event.getSession().getId());
System.out.println("Total Sessions: " + sessionCount);
}
}
我在xml中映射这个类文件。
答案 0 :(得分:4)
您redirect
无法Listener
,对于重定向,您必须在servelet
,jsp
和filter
中编写重定向代码。
以下是解决方案。
将Session_Count
存储在application scope
内,并通过以下两种方式检查每个网页上Session_count
的值。
a。)使用Filter
\*
创建url-pattern
并在其中添加重定向代码。
OR
b。)在每个其他网页的顶部包含common jsp
(包含重定向代码)。
或者在每个网页中手动添加重定向代码。
更新您的听众
公共类SessionListener实现HttpSessionListener { private Integer sessionCount;
public void sessionCreated(HttpSessionEvent event) {
synchronized (this) {
ServletContext application = event.getSession().getServletContext();
sessionCount = (Integer) application.getAttribute("SESSION_COUNT");
if (sessionCount == null) {
application.setAttribute("SESSION_COUNT", (sessionCount = 1));//setting sessioncount inside application scope
} else {
application.setAttribute("SESSION_COUNT", sessionCount + 1);
}
System.out.println("Session Created1: "+ event.getSession().getId());
System.out.println("Total Sessions1: " + sessionCount);
}
}
public void sessionDestroyed(HttpSessionEvent event) {
synchronized (this) {
ServletContext application = event.getSession().getServletContext();
sessionCount = (Integer) application.getAttribute("SESSION_COUNT");
application.setAttribute("SESSION_COUNT", sessionCount - 1);
}
System.out.println("Session Destroyed: " + event.getSession().getId());
System.out.println("Total Sessions: " + sessionCount);
}
}
使用 <url-pattern>/*</url-pattern>
创建过滤器,如下所示。
@WebFilter("/*")
public class redirectOnSessionCount implements Filter {
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletResponse httpResponse = (HttpServletResponse) response;
HttpServletRequest httpRequest = (HttpServletRequest)request;
Integer sessionCount = (Integer) request.getServletContext().getAttribute("SESSION_COUNT");//fetching session count from application scope
if(sessionCount!=null && sessionCount>2 && ! httpRequest.getRequestURL().toString().contains("Error.jsp")){
//httpRequest.getRequestURL().toString().contains("Error.jsp") - > if it's already redirecting to error.jsp then no redirection
httpResponse.sendRedirect("Error.jsp");//redirection code
}
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
在 web.xml
内进行映射以进行过滤。
<filter>
<filter-name>redirectOnSessionCount</filter-name>
<filter-class>redirectOnSessionCount</filter-class>
</filter>
<filter-mapping>
<filter-name>redirectOnSessionCount</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
按如下所示创建redirectOnSessionCount.jsp
,并将其包含在顶部的所有页面中,或将此代码添加到每个网页。
<%
Integer sessionCount = (Integer) application.getAttribute("SESSION_COUNT");//fetching session count from application scope
if(sessionCount!=null && sessionCount>2){
response.sendRedirect("Error.jsp");//redirection code
}
%>
答案 1 :(得分:0)
您没有实例化响应,您很可能在response.sendRedirect语句中获取NPE。听众可能不是尝试重定向的地方。