Servlet —— Cookie
程序员文章站
2024-03-20 14:00:16
...
在Servlet之间传递信息的方式有很多种,重写URL和隐藏域在多个页面中传递信息时处理起来比较麻烦
而cookie由http控制,可以比较方便地在多个压面之间传递,cookie的问题在于可能会被用户设置禁用
cookie是包含在http首部的信息,服务器请求在浏览器中设置一个cookie时,会包含一个首部行:
Set-Cookie : Key=Value
浏览器向同一个服务器发回请求时就会带上这个cookie首部行:
Cookie : Key=Value
服务器可以设置不止一个cookie,但浏览器通常对同一网站cookie的数量有限制
另外,cookie还有多个属性:
Path属性 :Path=/.... 用于控制该cookie的作用路径
domain属性:控制作用域
Set-Cookie : Key=Value ; Domain=abc.com ; Path=/login
该cookie对abc.com下的子树/login下的所用页面有效
expires属性:以一个截止日期控制有效时间,格式为:Wdy,DD-Mon-YYYY HH:MM:SS GMT
Max-age属性:以一个倒计时控制有效时间,Max-age=seconds
还有用于安全控制的secure属性和httponly,这两个属性没有值,加在cookie行就可以了
httponly 将控制只能由http或者https送回cookie,禁用javascript
secure 限制浏览器只能通过安全通道发送cookie
在Servlet中通过
new Cookie(key,value);
新建一个cookie对象,通过setDomain(Str)等一系列的方法设置属性
以下是一个设置并回显一个cookie的demo
package com.ryo.j2ee.test.cookie;
import java.io.IOException;
import java.io.PrintWriter;
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 com.ryo.j2ee.bean.User;
@WebServlet(name="Demo2",urlPatterns= "/user")
public class SetCookieServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
User user = new User();
@Override
public void init() {
user.setUsername("root");
user.setUserpwd("rootpwd");
}
@Override
public void doGet(HttpServletRequest req ,HttpServletResponse res) throws IOException {
res.setContentType("text/html");
PrintWriter pw = res.getWriter();
pw.print("<html><body>");
pw.print("<form method='post'><table>");
pw.print("<input type='submit' value='set'/></br>");
pw.print("</table></form></body></html>");
}
@Override
public void doPost(HttpServletRequest req ,HttpServletResponse res) throws IOException {
Cookie cookie = new Cookie("name",user.getUsername());
cookie.setMaxAge(60);
res.addCookie(cookie);
PrintWriter pw = res.getWriter();
pw.print("set cookie successfully</br><a href='showuser'>showuser</a>");
}
}
package com.ryo.j2ee.test.cookie;
import java.io.IOException;
import java.io.PrintWriter;
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;
@WebServlet(name="ShowCookie",urlPatterns="/showuser")
public class ShowCookieServlet extends HttpServlet{
private static final long serialVersionUID = 2L;
@Override
public void doGet(HttpServletRequest req ,HttpServletResponse res) throws IOException {
res.setContentType("text/html");
Cookie[] cookies = req.getCookies();
Cookie user = null;
if(cookies != null) {
for(Cookie cookie:cookies) {
if(cookie.getName().equals("name")) {
user = cookie;
break;
}
}
}
PrintWriter pw = res.getWriter();
pw.print("<html><body>");
pw.print("cookie : "+user.getName()+" "+user.getValue());
pw.print("</body></html>");
}
}
需要说明的是,现在HttpServletRequest req.getCookies();返回的是所有可用的cookie组成的数组,需要通过遍历获取目标cookie
另外,删除cookie也没有直接的api,可采用方法是new一个同名cookie,并把Max-age属性设置为0
Cookie cookie = new Cookie(samename , "");
cookie.setMaxAge(0);
res.addCookie(cookie);