目录
一、上一节遗留问题及解决方法
在上一节中我们已经完成了两个页面,即登录页面和博客主页,但我们发现,在浏览器中直接用博客主页的url也能直接进入登陆后的页面,这并不是我们想要的结果。因此本节重点解决这一问题。
解决方法也很简单,利用Filter就可解决这一问题,在LoginServlet中如果我们验证通过了用户的登录,那我们可以在session中添加一个user数据作为标记。在Filter中我们再从session中获取user,如果获取到了,则代表我们是登陆进来的,正常执行后面的动作(即打开主页),否则跳转到登录页。最重要的一点是我们要在web.xml中配置Filter,将需要进行过滤的url添加进去(即将博客主页添加进去)
二、关键代码
LoginServlet.java
if(isLoing) {
//这个字符串将会在js中被接收
//1代表登录成功
//2代表用户名或密码为空
//3代表用户名或密码错误
//若登陆成功,则将用户名存入session,后面在Fileter中进行检测,如果session中有相应数据,则证明用户是登陆进入的主页,而不是直接通过url进入。
request.getSession().setAttribute("user",Account);
out.write("1");
}else if(Account==""||Password==""){
out.write("2");
}else {
out.write("3");
}
out.close();
LoginFilter.java
package com.blog.dong;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.catalina.User;
/**
* Servlet Filter implementation class LoginFilter
*/
@WebFilter("/LoginFilter")
public class LoginFilter implements Filter {
/**
* Default constructor.
*/
public LoginFilter() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
// pass the request along the filter chain
HttpServletRequest httpServletRequest = (HttpServletRequest)request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
HttpSession session = httpServletRequest.getSession();
String user = (String)session.getAttribute("user");
if(user!=null) {
//如果session中存在user这个数据,则继续下一步
chain.doFilter(httpServletRequest, httpServletResponse);
return;
}else {
//如果session中不存在user这个数据,则转到登录页面
httpServletResponse.sendRedirect("/BlogDong/Login.html");
return;
}
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
web.xml
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.blog.dong.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/BlogCenter.html</url-pattern>
</filter-mapping>
三、结果
当输入http://localhost:8080/BlogDong/BlogCenter.html
页面将会跳转到登录页