当前位置: 代码迷 >> Java Web开发 >> Filter:为何过滤后输出的结果是这样的
  详细解决方案

Filter:为何过滤后输出的结果是这样的

热度:8498   发布时间:2016-04-10 22:46:30.0
Filter:为什么过滤后输出的结果是这样的
public class LoginFilter implements Filter {

public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤器初始化中...");
}

public void destroy() {

}

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;

HttpSession session = httpServletRequest.getSession();

System.out.println("开始过滤....");

if (httpServletRequest.getServletPath().indexOf("login.jsp") > 0) {
System.out.println("放过该请求...");
chain.doFilter(request, response);
} else {

String user = (String) session.getAttribute("login");

if (user != null) {
System.out.println("已登录,取消过滤...");
chain.doFilter(request, response);

} else {
System.out.println("未登录,跳转到登录页面...");
httpServletResponse.sendRedirect(httpServletRequest.getContextPath() + "/login.jsp");
}
}
System.out.println("完成过滤....");
}
}


public class LoginServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}

public String notNull(String param) {
return param == null ? "" : param;
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
String username = notNull(request.getParameter("username"));
String password = notNull(request.getParameter("password"));

if (username.equals("douya0808") && password.equals("123456")) {// 直接给xxxxLoginTest/servlet/LoginServlet会由于没传值而报出NullPointer
System.out.println("信息正确,跳转页面中...");
session.setAttribute("login", "LoginSuccess!");
response.sendRedirect(request.getContextPath() + "/success.jsp");
} else {
response.sendRedirect(request.getContextPath() + "/login.jsp");
}

}
}


	<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>filter.LoginFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>servlet.LoginServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/servlet/LoginServlet</url-pattern>
</servlet-mapping>


访问:localhost:8090/LoginTest/success.jsp,当然这个success.jsp是不能直接访问的,上面的程序达到了过滤的效果,但是控制台的输出却如下

开始过滤....
未登录,跳转到登录页面...
完成过滤....
开始过滤....
放过该请求...
完成过滤....


但是我预期的输出是

开始过滤....
未登录,跳转到登录页面...
完成过滤....

差在哪里呢,请前辈指点迷津
------解决方案--------------------
httpServletResponse.sendRedirect(httpServletRequest.getContextPath() + "/login.jsp");这个不也是一个请求嘛,所以相当于请求了两次。是不是啊?
------解决方案--------------------
逻辑上没有任何问题。
------解决方案--------------------
正常,你的过滤器拦截所有请求,那么只要和后台打交道的请求都要走一遍过滤器里的逻辑~
  相关解决方案