本章记录java后端的Filter过滤器的功能用法。
测试项目:
两个jsp页面,两页servlet代码,一页filter代码,以及配置xml等。
一.首先完成两个显示页面
1.login登录界面
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<center><h3>用户登录</h3></center>
<body style = "text-align:center;">
<form action = "${pageContext.request.contextPath}/LoginServlet" method = "post">
<table>
<tr>
<td height = "30" align = "center">用户名:</td>
<td>
<input type = "text" name = "username" />${errerMsg} </td>
</tr>
<tr>
<td height = "30" align = "center">密码:</td>
<td>
<input type = "password" name = "password" /></td>
</tr>
<tr>
<td height = "35" align = "center">自动登录时间</td>
<td><input type = "radio" name = "autologin"
value = "${60*60*24*31}" />一个月
<input type = "radio" name = "autologin"
value = "${60*60*24*31*3}" />三个月
<input type = "radio" name = "autologin"
value = "${60*60*24*31*6}" />半年
<input type = "radio" name = "autologin"
value = "${60*90*24*31*12}" />一年
</td>
</tr>
<tr>
<td height = "30" colspan = "2" align = "center">
<input type = "submit" value = "登录" />
<input type = "reset" value = "重置" />
</td>
</tr>
</table>
</form>
</body>
</html>
- index登录成功界面
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8" import="java.util.*"%>
<%-- <%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %> --%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>显示登录的用户信息</title>
</head>
<body>
<br />
<center>
<h3>欢迎光临</h3>
</center>
<br />
<br />
<c:choose>
<c:when test = "${sessionScope.user==null}">
<a href = "login.jsp">用户登录</a>
</c:when>
<c:otherwise>
欢迎你,${sessionScope.user.username} !
<a href = "LogoutServlet">注销</a>
</c:otherwise>
</c:choose>
<hr />
</body>
</html>
二.Servlet代码
1.LoginServlet登录处理
package cn.edu.xit.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.edu.xit.domain.User;
/**
* Servlet implementation class LoginServlet
*/
//@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LoginServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String username = request.getParameter("username"); // login.jsp中的username
String password = request.getParameter("password"); //同理
// 检查用户名和密码
if("itcast".equals(username) && "123456".equals(password)){
// 登录成功
User user = new User();
user.setUsername(username);
user.setPassword(password);
// 将用户状态user对象存入session域
request.getSession().setAttribute("user", user);
// 发送自动登录的cookie
String autoLogin = request.getParameter("autologin"); //同理从login.jsp
if(autoLogin != null){
// 注意cookie中的密码要加密
Cookie cookie = new Cookie("autologin",username + "-" + password);
cookie.setMaxAge(Integer.parseInt(autoLogin)); // 设置过期时间
cookie.setPath(request.getContextPath());
response.addCookie(cookie);
}
// 跳转至首页
response.sendRedirect(request.getContextPath() + "/index.jsp");
}else{
request.setAttribute("errerMsg", "用户名或密码错误");
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request,response);
}
}
2.LogoutServlet注销功能
package cn.edu.xit.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class LogoutServlet
*/
//@WebServlet("/LogoutServlet")
public class LogoutServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LogoutServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
// 用户注销
request.getSession().removeAttribute("user");
// 从客户端删除自动登录的cookie
Cookie cookie = new Cookie("autologin","msg"); // 用户名密码被msg代替
//request.getContextPath()返回当前页面所在的应用的名字
cookie.setPath(request.getContextPath()); //同一服务器内的cookie共享方法
cookie.setMaxAge(0); // 清除设置的过期时间
response.addCookie(cookie);
response.sendRedirect(request.getContextPath() + "/index.jsp");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request,response);
}
}
三.Filter过滤器
AutoLoginFilter实现自动登录
package cn.edu.xit.filter;
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.Cookie;
import javax.servlet.http.HttpServletRequest;
import cn.edu.xit.domain.User;
/**
* Servlet Filter implementation class AutoLoginFilter
*/
@WebFilter("/AutoLoginFilter")
public class AutoLoginFilter implements Filter {
/**
* Default constructor.
*/
public AutoLoginFilter() {
// 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 req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
HttpServletRequest request = (HttpServletRequest) req;
// 获得一个名为autologin的cookie
Cookie[] cookies = request.getCookies();
String autologin = null;
for(int i = 0;cookies != null && i < cookies.length; i++){
if("autologin".equals(cookies[i].getName())){
// 找到了指定的cookie
autologin = cookies[i].getValue();
break;
}
}
if(autologin!=null){
// 做自动登录
String[] parts = autologin.split("-");
String username = parts[0];
String password = parts[1];
// 检查用户名和密码
if("itcast".equals(username) && ("123456").equals(password)){
// 登录成功,将用户状态user对象存入session域
User user = new User();
user.setUsername(username);
user.setPassword(password);
request.getSession().setAttribute("user", user);
}
}
// pass the request along the filter chain
// 放行
chain.doFilter(request, resp);
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
写一个封装类保存用户名和密码
package cn.edu.xit.domain;
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
最后完善一下xml文件配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>web008</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>AutoLoginFilter</filter-name>
<filter-class>cn.edu.xit.filter.AutoLoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AutoLoginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>cn.edu.xit.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/LoginServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>LogoutServlet</servlet-name>
<servlet-class>cn.edu.xit.servlet.LogoutServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LogoutServlet</servlet-name>
<url-pattern>/LogoutServlet</url-pattern>
</servlet-mapping>
</web-app>
项目由教材提供…