1 什么是cookies
Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。定义于RFC2109和2965都已废弃,最新取代的规范是RFC6265。 ——百度百科
说白了,cookies就是保存在计算机本地的数据,一般用于记录用户登录历史状态和浏览记录的文件,当然都经过加密,不然安全可不能保障。
本文写一个简单的例子来介绍java里cookies的使用。
2 运行环境
java web开发,只要有javaEE的开发环境就可以,
- IDE:idea;
- 服务器:tomcat 7;
- 项目管理:maven。
3 开发代码
本文将完成一个登陆功能,使用servlet建立并保存cookies,使用一个filter检查用户是否登陆,未登陆返回主页,登陆后可以进入成功页面。也有用户logout功能,用于清除本地cookies。
3.1 配置maven环境
建立maven项目,引入必须的jar包:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>study</artifactId>
<groupId>com.star</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cookies</artifactId>
<packaging>war</packaging>
<name>cookies</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
</dependency>
</dependencies>
</project>
3.2 建立项目所需文件
前台:需要一个登陆界面index.jsp,还有两个页面分别为成功success.jsp和失败页面error.jsp;
后台:需要一个登陆LoginServlet.java,一个退出登录LogoutServlet.java,还有一个检查是否登陆的LoginFilter.java。
所以目录结构如下:
3.3 后台Java编码
3.3.1 LoginServlet
package com.star.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 登陆用servlet <br/>
* cookies保存用户信息
*
* @author: wangchao.wang
* @date: 2015-08-03 11:34:00
*/
public class LoginServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 转换编码
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
// 为了简单方便,这里直接使用字符串匹配模拟用户名和密码检查
if ("wc".equals(username) && "123".equals(password)) {
// 登陆成功,保存cookies
Cookie cookie = new Cookie("username", username);
response.addCookie(cookie);
RequestDispatcher dispatcher = request.getRequestDispatcher("main/success.jsp");
request.setAttribute("username", username);
request.setAttribute("password", password);
dispatcher.forward(request, response);
} else {
// 登陆失败
RequestDispatcher dispatcher = request.getRequestDispatcher("main/error.jsp");
request.setAttribute("username", username);
request.setAttribute("password", password);
dispatcher.forward(request, response);
}
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
3.3.2 LogoutServlet
package com.star.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 退出登录
*
* @author: wangchao.wang
* @date: 2015-08-03 16:23:00
*/
public class LogoutServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
// 遍历cookies,找到登陆信息后,设定生命周期为零
if (cookie.getName().equals("username")) {
cookie.setMaxAge(0);
response.addCookie(cookie);
break;
}
}
RequestDispatcher dispatcher = request.getRequestDispatcher("/index.jsp");
dispatcher.forward(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
3.3.3 LoginFilter
package com.star.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.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author: wangchao.wang
* @date: 2015-08-03 11:33:00
*/
public class LoginFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
Cookie[] cookies = request.getCookies();// 这样便可以获取一个cookie数组
for (Cookie cookie : cookies) {
// 查找cookies,如果有登陆信息,通过该filter
if (cookie.getName().equals("username")) {
filterChain.doFilter(request, servletResponse);
return;
}
}
// 未登录,回到登录页面
response.sendRedirect("/index.jsp");
}
public void destroy() {
}
}
3.4 前台jsp编码
3.4.1 index.jsp
<%--
User: wangchao.wang
Date: 2015/8/3
Time: 11:37
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title></title>
</head>
<body>
<form name="login_form" method="post" action="login">
<table>
<tr align=center>
<td>用户名</td>
<td><input type="text" name="username" id="username"></td>
</tr>
<tr align=center>
<td>密 码</td>
<td><input type="password" name="password" id="password"></td>
</tr>
<tr align=center>
<td colspan="2"><input type="submit" value="登 录"/></td>
</tr>
</table>
</form>
</body>
</html>
3.4.2 success.jsp
<%--
User: wangchao.wang
Date: 2015/8/3
Time: 11:37
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title></title>
</head>
<body>
success!<br/>
${username}<br/>
${password}<br/>
<a href="../logout">logout</a>
</body>
</html>
3.4.3 error.jsp
<%--
User: wangchao.wang
Date: 2015/8/3
Time: 16:03
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title></title>
</head>
<body>
error!<br/>
${username}<br/>
${password}<br/>
</body>
</html>
3.5 配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<!-- 配置servlet -->
<servlet>
<servlet-name>loginServlet</servlet-name>
<servlet-class>com.star.servlet.LoginServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>logoutServlet</servlet-name>
<servlet-class>com.star.servlet.LogoutServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>logoutServlet</servlet-name>
<url-pattern>/logout</url-pattern>
</servlet-mapping>
<filter>
<filter-name>loginFilter</filter-name>
<filter-class>com.star.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>/main/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
4 测试
经测试,成功登陆后可以通过url访问success.jsp页面,未登录是进不去的,
登陆成功后,本地可以看到cookies缓存,
退出登录后,本地cookies缓存消失,不能访问success.jsp页面