当我们需要防止未登录的用户访问内部资源时,可以使用过滤器来。过滤器即在用户发出请求的时候进行一些条件的过滤,如判断用户是否为空,编码方式等。
下面通过一个登录过滤器来判断用户是否已经登录系统了,登录则允许访问.jsp页面。否则跳转到登录页面。
LoginFilter.Java
package cn.itcast.fiter;
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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
*
* 定义一个自定义的过滤器:
* 非登录的用户不可见内部资源
*
*/
public class LoginFilter implements Filter{
@Override
public void destroy() {
}
@Override
/**
* 所有以.jsp结尾的请求都会经过这个方法的过滤 ,如果要过滤所有的请求,可以在web.xml文件配置为/*
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chin) throws IOException, ServletException {
HttpServletRequest re = (HttpServletRequest) request;
HttpServletResponse rs = (HttpServletResponse) response;
//获得session
HttpSession session = re.getSession();
//这里得到的是绝对路径:域名+项目名+具体页面请求
StringBuffer url = re.getRequestURL();
//这里得到是除域名外的路径:项目+具体请求
String url2 = re.getRequestURI();
System.out.println("url="+url);//url=http://localhost:8080/SSH/index.jsp
System.out.println("ur2="+url2);//ur2=/SSH/index.jsp
//取出存放在session中的值
String user = (String) session.getAttribute("user");
//这里得到的只是项目的路径且不包括域名
String contpath = re.getContextPath();
System.out.println("contpath="+contpath);//contpath=/SSH
if(url2!=null&&url2.equals(contpath+"/login.jsp")||url2.equals(contpath+"/reg.jsp")){
//如果相等说明请求的是登录页面,可以放行
chin.doFilter(request, response);
return;
}else if(user==null||"".equals(user)){
//如果用户名为空,说明用户还没有登录,进行重定向到登录页面
rs.sendRedirect(contpath+"/login.jsp");
}else{
//否则用户不为空,放行
chin.doFilter(request, response);
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
web.xml的配置:
<!-- 自定义登陆过滤器 -->
<!-- <filter>
<filter-name>LoginFilter</filter-name>
<filter-class>cn.itcast.fiter.LoginFilter</filter-class>
</filter> -->
<!-- 如果过滤所有的请求,/*,则登录页面图片显示不出来 -->
<!-- <filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping> -->