Filter有一下种类:
1.用户权限
2.日志
3.负责解码
4.能改变XML内容的XSLT Filter等
5.Filter 可负责拦截多个请求/响应;一个请求/响应也可被多个Filter拦截
创建一个Filter 共有两步骤
1.Filter处理类
2.web.xml 配置Filter
定义一个Filter对用户请求进行过滤,Filter通过doFilter()设置编码字符;验证用户是否登录,如果没有登录就跳转登录页面;
自动登录 AuthorityFilter.java 代码:
@WebFilter(filterName = "authority", urlPatterns = { "/*" }, initParams = {
@WebInitParam(name = "encoding", value = "GBK"),
@WebInitParam(name = "loginPage", value = "/login.jsp"),
@WebInitParam(name = "proLogin", value = "/proLogin.jsp") })
public class AuthorityFilter implements Filter {
// FilterConfig可用于访问Filter的配置信息
private FilterConfig config;
// 实现初始化方法
public void init(FilterConfig config) {
this.config = config;
}
// 实现销毁方法
public void destroy() {
this.config = null;
}
// 执行过滤的核心方法
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 获取该Filter的配置参数
String encoding = config.getInitParameter("encoding");
String loginPage = config.getInitParameter("loginPage");
String proLogin = config.getInitParameter("proLogin");
// 设置request编码用的字符集
request.setCharacterEncoding(encoding); // ①
HttpServletRequest requ = (HttpServletRequest) request;
HttpSession session = requ.getSession(true);
// 获取客户请求的页面
String requestPath = requ.getServletPath();
// 如果session范围的user为null,即表明没有登录
// 且用户请求的既不是登录页面,也不是处理登录的页面
if (session.getAttribute("user") == null
&& !requestPath.endsWith(loginPage)
&& !requestPath.endsWith(proLogin)) {
// forward到登录页面
request.setAttribute("tip", "您还没有登录");
request.getRequestDispatcher(loginPage).forward(request, response);
}
// "放行"请求
else {
chain.doFilter(request, response);
}
}
}
配置web.xml
<filter>
<filter-name>authority</filter-name>
<filter-class>com.yd.filter.AuthorityFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>authority</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注意:对所有的请求进行Filter
测试页面有3jsp :
1.login.jsp 代码:
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>登录页面</title>
</head>
<body>
<h2>登录页面</h2>
<form method="post" action="proLogin.jsp">
用户名:<input type="text" name="name"/><br/><span><%
if(request.getAttribute("tip") != null)
{
out.println("<font color='red'>"
+ request.getAttribute("tip")
+ "</font>");
}
%></span>
<input type="submit" value="登录"/>
</form>
</body>
</html>
2.proLogin.jsp 代码:
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title> 登录页面 </title>
</head>
<body>
<h2>登录页面</h2>
<%
session.setAttribute("user"
, request.getParameter("name"));
%>
登录成功,可以访问该应用的其他页面
</body>
</html>
3.index.jsp
此jsp页面随便写,只是为了测试;
总结:该用户没有登录该应用,不可以访问其他页面,只能被迫的访问 login.jsp 和proLogin.jsp